From b7bda5a877212073e511b7caadde3dead73af78a Mon Sep 17 00:00:00 2001 From: morepurplemorebetter Date: Sat, 30 Dec 2023 17:35:04 +0100 Subject: [PATCH] =?UTF-8?q?v13.1.12=20-=20if=20DM=20approves=20companions?= =?UTF-8?q?=20=E2=80=A2=20Added=20optional=20suffix=20for=20linking=20Crea?= =?UTF-8?q?tureList=20objects=20to=20CompanionList=20objects.=20Now=20you?= =?UTF-8?q?=20can=20add=20=E2=80=9C=5Fnot=5Fal=E2=80=9D=20(e.g.=20?= =?UTF-8?q?=E2=80=9Cmount=5Fnot=5Fal)=20for=20the=20creature=20to=20only?= =?UTF-8?q?=20be=20listed=20in=20the=20menu=20when=20the=20sheet=20is=20no?= =?UTF-8?q?t=20in=20Adventurers=20League=20mode=20(DCI=20field=20visible)?= =?UTF-8?q?=20and=20when=20listed,=20the=20text=20=E2=80=9C(if=20DM=20appr?= =?UTF-8?q?oves)=E2=80=9D=20is=20added.=20=E2=80=A2=20Improved=20tables=20?= =?UTF-8?q?on=20the=20Notes=20page=20for=20magic=20items=20that=20use=20re?= =?UTF-8?q?al-life=20playing=20cards,=20like=20the=20Deck=20of=20Many=20Th?= =?UTF-8?q?ings.=20=E2=80=A2=20Changed=20Improved=20Divine=20Smite=20to=20?= =?UTF-8?q?now=20add=20=E2=80=9Cin=20melee=E2=80=9D=20to=20the=20descripti?= =?UTF-8?q?on=20of=20a=20thrown=20weapon,=20so=20it=20reads=20=E2=80=9C+1d?= =?UTF-8?q?8=20Radiant=20damage=20in=20melee=E2=80=9D=20(MBUG-126).=20?= =?UTF-8?q?=E2=80=A2=20Improved=20the=20highlight=20colour=20options=20by?= =?UTF-8?q?=20making=20them=20lighter.=20Text=20should=20now=20be=20easier?= =?UTF-8?q?=20to=20read=20when=20the=20field=20highlight=20colour=20is=20s?= =?UTF-8?q?et=20to=20one=20of=20the=20colourful=20options.=20Note=20that?= =?UTF-8?q?=20this=20won=E2=80=99t=20change=20the=20colour=20when=20you=20?= =?UTF-8?q?import=20an=20old=20sheet,=20for=20that=20you=E2=80=99ll=20have?= =?UTF-8?q?=20to=20select=20the=20colour=20anew=20from=20the=20menu.=20?= =?UTF-8?q?=E2=80=A2=20Fix=20=E2=80=9CBlack=20Tentacles=E2=80=9D=20short?= =?UTF-8?q?=20description.=20=E2=80=A2=20Fix=20=E2=80=9CImproved=20Pact=20?= =?UTF-8?q?Weapon=E2=80=9D=20and=20similar=20features=20not=20applying=20t?= =?UTF-8?q?o=20magic=20weapons=20that=20use=20the=20`chooseGear`=20attribu?= =?UTF-8?q?te=20(MBUG-125).=20=E2=80=A2=20Fix=20error=20due=20to=20incorre?= =?UTF-8?q?ct=20documentation=20=E2=80=9C=5Fcommon=20spell=20list=20object?= =?UTF-8?q?.js=E2=80=9D,=20the=20`class`=20attribute=20worked=20only=20wit?= =?UTF-8?q?h=20=E2=80=9Cany=E2=80=9D=20not=20=E2=80=9Call=E2=80=9D.=20The?= =?UTF-8?q?=20function=20has=20now=20been=20changed=20to=20work=20with=20b?= =?UTF-8?q?oth=20=E2=80=9Cany=E2=80=9D=20and=20=E2=80=9Call=E2=80=9D=20for?= =?UTF-8?q?=20backwards=20compatibility.=20=E2=80=A2=20Fix=20bug=20with=20?= =?UTF-8?q?magic=20ammunition=20with=20a=20pop-up=20for=20selecting=20the?= =?UTF-8?q?=20type=20(`chooseGear`=20attribute)=20not=20appearing=20on=20t?= =?UTF-8?q?he=201st=20page=20and=20throwing=20an=20error=20when=20being=20?= =?UTF-8?q?added/removed.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _functions/Functions1.js | 22 +- _functions/Functions2.js | 14 +- _functions/Functions3.js | 8 +- _functions/FunctionsSpells.js | 4 +- _variables/Lists.js | 46 +-- _variables/ListsClasses.js | 2 +- _variables/ListsCompanions.js | 8 +- _variables/ListsCreatures.js | 15 +- _variables/ListsMagicItems.js | 267 +++++++++--------- _variables/ListsSpells.js | 4 +- .../_common attributes.js | 27 +- .../_common spell list object.js | 4 +- ...mpanion template option (CompanionList).js | 21 +- ...ature, wild shape option (CreatureList).js | 16 +- 14 files changed, 261 insertions(+), 197 deletions(-) diff --git a/_functions/Functions1.js b/_functions/Functions1.js index df6ee770..93afab19 100644 --- a/_functions/Functions1.js +++ b/_functions/Functions1.js @@ -3172,7 +3172,7 @@ function ParseGear(input) { }; //see if it is an ammunition weapon - var findAmmo = ParseAmmo(tempString, true); + var findAmmo = ParseAmmo(tempString, true, true); if (findAmmo) { testLen = Math.min(findAmmo[1], tempStrLen); if (testLen > foundLen) { @@ -7397,7 +7397,7 @@ function SetEncumbrance(variant) { }; //see if a known ammunition is in a string, and return the ammo name -function ParseAmmo(input, onlyInv) { +function ParseAmmo(input, onlyInv, bReturnLength) { var found = ""; if (!input) return found; @@ -7445,7 +7445,7 @@ function ParseAmmo(input, onlyInv) { keyLen = foundLen; foundDat = tempDate; } - return onlyInv && found ? [found, keyLen] : found; + return bReturnLength && found ? [found, keyLen] : found; } //Reset the visibility of all the ammo fields of a particular side (input = "Left" or "Right") @@ -7944,8 +7944,8 @@ function ApplyColorScheme(aColour) { // Set the highlighting color if it has been coupled to the headers if (Who("Highlighting") === "headers") { - app.runtimeHighlightColor = LightColorList[colour]; - tDoc.getField("Highlighting").fillColor = LightColorList[colour]; + app.runtimeHighlightColor = HighlightColorList[colour]; + tDoc.getField("Highlighting").fillColor = HighlightColorList[colour]; } // See if any of the Ability Save DC's or the HP Dragons have the color connected to this if (What("Color.DC").indexOf("headers") != -1) ApplyDCColorScheme(); @@ -8096,8 +8096,8 @@ function ApplyDragonColorScheme(aColour) { // Set the highlighting color if it has been coupled to the dragon heads color if (Who("Highlighting") === "dragons") { - app.runtimeHighlightColor = LightColorList[colour]; - tDoc.getField("Highlighting").fillColor = LightColorList[colour]; + app.runtimeHighlightColor = HighlightColorList[colour]; + tDoc.getField("Highlighting").fillColor = HighlightColorList[colour]; } // See if any of the Ability Save DC's or the HP Dragons have the color connected to this if (What("Color.DC").indexOf("dragons") != -1) ApplyDCColorScheme(); @@ -8297,14 +8297,14 @@ function ColoryOptions(input) { var theColour = ["RGB", 0.9, 0.9, 1]; break; case "headers" : - var theColour = LightColorList[What("Color.Theme")]; + var theColour = HighlightColorList[What("Color.Theme")]; break; case "dragons" : - var theColour = LightColorList[What("Color.DragonHeads")]; + var theColour = HighlightColorList[What("Color.DragonHeads")]; break; default : - if (!LightColorList[MenuSelection[2]]) return; - var theColour = LightColorList[MenuSelection[2]]; + if (!HighlightColorList[MenuSelection[2]]) return; + var theColour = HighlightColorList[MenuSelection[2]]; break; }; app.runtimeHighlight = highlightsOn; diff --git a/_functions/Functions2.js b/_functions/Functions2.js index 09dd49db..7a77338c 100644 --- a/_functions/Functions2.js +++ b/_functions/Functions2.js @@ -686,6 +686,7 @@ function MakeCompMenu_CompOptions(prefix, MenuSelection, force) { // Menu options for creating special companions // First get a list of all the companion options that should be available var oCompanions = {}; + var bIsAL = !isDisplay("DCI.Text"); for (var sComp in CompanionList) { if (testSource(sComp, CompanionList[sComp], "compExcl")) continue; oCompanions[sComp] = []; @@ -702,13 +703,17 @@ function MakeCompMenu_CompOptions(prefix, MenuSelection, force) { if (!isArray(oCrea.companion)) oCrea.companion = [oCrea.companion]; for (var i = 0; i < oCrea.companion.length; i++) { if (oCompanions[oCrea.companion[i]]) objToAdd[oCrea.companion[i]] = ""; + if (!bIsAL && oCrea.companion[i].substr(-7) === "_not_al") { + var notAlComp = oCrea.companion[i].replace("_not_al", ""); + if (oCompanions[notAlComp]) objToAdd[notAlComp] = " (if DM approves)"; + } } } // Now test for each companion type with the includeCheck attribute if this creature should be added for (var sComp in oCompanions) { if (CompanionList[sComp].includeCheck && typeof CompanionList[sComp].includeCheck === "function") { try { - var returnStr = CompanionList[sComp].includeCheck(sCrea, oCrea, iCreaCR); + var returnStr = CompanionList[sComp].includeCheck(sCrea, oCrea, iCreaCR, bIsAL); if (returnStr !== false && returnStr !== undefined) { objToAdd[sComp] = typeof returnStr === "string" ? returnStr : ""; } @@ -7311,6 +7316,7 @@ function SetProf(ProfType, AddRemove, ProfObj, ProfSrc, Extra) { //Process the input. //for the simple text strings, immediately add/remove it for (var attr in ProfObj) { var setT = set[attr]; + if (!setT) continue; var addT = ProfObj[attr]; for (var i = 0; i < addT.length; i++) { var iAdd = addT[i]; @@ -7882,7 +7888,8 @@ function getHighestTotal(nmbrObj, notRound, replaceWalk, extraMods, prefix, with // open a dialog with a number of lines of choices and return the choices in an array; if knownOpt === "radio", show radio buttons instead, and return the entry selected // if notProficiencies is set to true, the optType will serve as the dialog header, and optSrc will serve as the multiline explanatory text -function AskUserOptions(optType, optSrc, optSubj, knownOpt, notProficiencies, sBottomMsg) { +// bReturnIndex only does something if knownOpt === "radio"; it will return the index of the selection from the input optSubj array +function AskUserOptions(optType, optSrc, optSubj, knownOpt, notProficiencies, sBottomMsg, bReturnIndex) { if (!IsNotImport) return optSubj; //first make the entry lines var selectionLines = []; @@ -8104,6 +8111,9 @@ function AskUserOptions(optType, optSrc, optSubj, knownOpt, notProficiencies, sB theDialog["sl" + ("0" + i).slice(-2)] = Function("dialog", "this.check(dialog, " + i + ");"); }; }; app.execDialog(theDialog) + if (bReturnIndex && knownOpt === "radio" && typeof theDialog.choices == 'string') { + return optSubj.indexOf(theDialog.choices); + } return theDialog.choices; }; diff --git a/_functions/Functions3.js b/_functions/Functions3.js index 2bea7157..724052a1 100644 --- a/_functions/Functions3.js +++ b/_functions/Functions3.js @@ -1198,7 +1198,7 @@ function processAddWeapons(AddRemove, weapons) { // set ammuntion or remove the ammuntion function processAddAmmo(AddRemove, ammos) { if (!ammos) return; - if (!isArray(ammos) || (ammos.length === 2 && isNaN(ammos[1]))) { + if (!isArray(ammos) || (ammos.length === 2 && !isNaN(ammos[1]))) { ammos = [ammos]; } for (var a = 0; a < ammos.length; a++) { @@ -3653,13 +3653,13 @@ function selectMagicItemGearType(AddRemove, FldNmbr, typeObj, oldChoice, correct if (!correctingDescrLong) { switch (typeNm) { case "ammunition": - processAddAmmo(AddRemove, [itemToProcess ? itemToProcess : newMIname.replace(/ammunition (\+\d)/i, "$1").replace(/(\+\d) *\((.*?)\)/i, "$1 $2"), typeObj.ammoAmount && !isNaN(typeObj.ammoAmount) ? typeObj.ammoAmount : 1]); + processAddAmmo(AddRemove, [[itemToProcess ? itemToProcess : newMIname.replace(/ammunition (\+\d+)/i, "$1").replace(/(\+\d+) *\((.*?)\)/i, "$1 $2"), typeObj.ammoAmount && !isNaN(typeObj.ammoAmount) ? typeObj.ammoAmount : 1]]); break; case "weapon": - processAddWeapons(AddRemove, itemToProcess ? itemToProcess : newMIname.replace(/weapon (\+\d)/i, "$1").replace(/(\+\d) *\((.*?)\)/i, "$1 $2")); + processAddWeapons(AddRemove, itemToProcess ? itemToProcess : newMIname.replace(/weapon (\+\d+)/i, "$1").replace(/(\+\d+) *\((.*?)\)/i, "$1 $2")); break; case "armor": - processAddArmour(AddRemove, itemToProcess ? itemToProcess : newMIname.replace(/armou?r (\+\d)/i, "$1").replace(/(\+\d) *\((.*?)\)/i, "$1 $2")); + processAddArmour(AddRemove, itemToProcess ? itemToProcess : newMIname.replace(/armou?r (\+\d+)/i, "$1").replace(/(\+\d+) *\((.*?)\)/i, "$1 $2")); break; } } diff --git a/_functions/FunctionsSpells.js b/_functions/FunctionsSpells.js index 0412e026..eb56a01c 100644 --- a/_functions/FunctionsSpells.js +++ b/_functions/FunctionsSpells.js @@ -1049,10 +1049,10 @@ function CreateSpellList(inputObject, toDisplay, extraArray, returnOrdered, objN continue; } else if (isArray(inputObject.class)) { addSp = inputObject.class.some(function (v) { - return v === "any" || aSpell.classes.indexOf(v) !== -1; + return v === "any" || v === "all" || aSpell.classes.indexOf(v) !== -1; }); } else { - addSp = inputObject.class === "any" || aSpell.classes.indexOf(inputObject.class) !== -1; + addSp = inputObject.class === "any" || inputObject.class === "all" || aSpell.classes.indexOf(inputObject.class) !== -1; } } if (addSp && inputObject.level) { diff --git a/_variables/Lists.js b/_variables/Lists.js index b7e61fb3..03728dc7 100644 --- a/_variables/Lists.js +++ b/_variables/Lists.js @@ -1138,33 +1138,47 @@ var ColorList = { } //for gradients, add 15% brightness as BHS color var DarkColorList = { - aqua : ["CMYK", 0.85, 0.5, 0.01, 0.5], //144671 - blue : ["CMYK", 0.75, 0.13, 0.09, 0.5], //066882 - brown : ["CMYK", 0.38, 0.53, 0.51, 0.9], //291d16 - gray : ["CMYK", 0.7, 0.6, 0.56, 0.67], //303131 - green : ["CMYK", 0.9, 0.33, 0.96, 0.77], //003012 + aqua : ["CMYK", 0.85, 0.5, 0.01, 0.5], //144671 + blue : ["CMYK", 0.75, 0.13, 0.09, 0.5], //066882 + brown : ["CMYK", 0.38, 0.53, 0.51, 0.9], //291d16 + gray : ["CMYK", 0.7, 0.6, 0.56, 0.67], //303131 + green : ["CMYK", 0.9, 0.33, 0.96, 0.77], //003012 orange : ["CMYK", 0, 0.8, 1, 0.5], //8d3200 - pink : ["CMYK", 0, 0.9, 0.15, 0.5], //8e204c + pink : ["CMYK", 0, 0.9, 0.15, 0.5], //8e204c purple : ["CMYK", 0.76, 1, 0.03, 0.5], //401150 - red : ["CMYK", 0.18, 1, 0.91, 0.58], //6e110b - teal : ["CMYK", 0.79, 0.12, 0.45, 0.5], //00645f + red : ["CMYK", 0.18, 1, 0.91, 0.58], //6e110b + teal : ["CMYK", 0.79, 0.12, 0.45, 0.5], //00645f yellow : ["CMYK", 0, 0.5, 1, 0.5] //935b00 } // +50% black var LightColorList = { - aqua : ["CMYK", 0.68, 0.29, 0, 0], //4e9ad9 - blue : ["CMYK", 0.7, 0.06, 0.11, 0], //2bb3d9 - brown : ["CMYK", 0.29, 0.39, 0.38, 0.14], //ad9189 - gray : ["CMYK", 0.33, 0.25, 0.26, 0.04], //b3b3b3 - green : ["CMYK", 0.8, 0.13, 0.78, 0], //219a5e + aqua : ["CMYK", 0.68, 0.29, 0, 0], //4e9ad9 + blue : ["CMYK", 0.7, 0.06, 0.11, 0], //2bb3d9 + brown : ["CMYK", 0.29, 0.39, 0.38, 0.14], //ad9189 + gray : ["CMYK", 0.33, 0.25, 0.26, 0.04], //b3b3b3 + green : ["CMYK", 0.8, 0.13, 0.78, 0], //219a5e orange : ["CMYK", 0, 0.62, 0.7, 0], //f77d4d - pink : ["CMYK", 0, 0.69, 0.01, 0], //f772a9 + pink : ["CMYK", 0, 0.69, 0.01, 0], //f772a9 purple : ["CMYK", 0.58, 0.78, 0.01, 0], //844e99 - red : ["CMYK", 0.1, 0.79, 0.55, 0], //db535c - teal : ["CMYK", 0.7, 0, 0.35, 0], //26bdb8 + red : ["CMYK", 0.1, 0.79, 0.55, 0], //db535c + teal : ["CMYK", 0.7, 0, 0.35, 0], //26bdb8 yellow : ["CMYK", 0, 0.38, 0.82, 0] //f8ad3c } +var HighlightColorList = { // = LightColorList with Luminosity at 85% + aqua : ['RGB', 0.75, 0.86, 0.95], //c0dbf2 + blue : ['RGB', 0.75, 0.91, 0.96], //bee8f4 + brown : ['RGB', 0.88, 0.84, 0.82], //e0d5d2 + gray : ['RGB', 0.85, 0.85, 0.85], //d9d9d9 + green : ['RGB', 0.75, 0.95, 0.85], //c0f2d9 + orange : ['RGB', 0.99, 0.79, 0.71], //fccab6 + pink : ['RGB', 0.98, 0.72, 0.83], //fbb7d3 + purple : ['RGB', 0.87, 0.80, 0.90], //decde5 + red : ['RGB', 0.95, 0.75, 0.76], //f2c0c3 + teal : ['RGB', 0.75, 0.95, 0.95], //bff2f1 + yellow : ['RGB', 0.99, 0.88, 0.71] //fce0b5 +} + //The dialog for setting the unit system and decimal var SetUnitDecimals_Dialog = { //variables to be set by the calling function diff --git a/_variables/ListsClasses.js b/_variables/ListsClasses.js index ef425286..896c1911 100644 --- a/_variables/ListsClasses.js +++ b/_variables/ListsClasses.js @@ -1111,7 +1111,7 @@ var Base_ClassList = { calcChanges : { atkAdd : [ function (fields, v) { - if (v.isMeleeWeapon) fields.Description += (fields.Description ? '; ' : '') + '+1d8 Radiant damage'; + if (v.isMeleeWeapon) fields.Description += (fields.Description ? '; ' : '') + '+1d8 Radiant damage' + (v.isThrownWeapon ? ' in melee' : ''); }, "With my melee weapon attacks I deal an extra 1d8 radiant damage." ] diff --git a/_variables/ListsCompanions.js b/_variables/ListsCompanions.js index 7e2b8c46..cda69772 100644 --- a/_variables/ListsCompanions.js +++ b/_variables/ListsCompanions.js @@ -5,10 +5,6 @@ var Base_CompanionList = { nameOrigin : "1st-level conjuration [ritual] spell", nameMenu : "Familiar (Find Familiar spell)", // required source : [["SRD", 143], ["P", 240]], // required - includeCheck : function(sCrea, objCrea, iCreaCR) { - // return true if to be included, or a string to add a note to the menu option - return !!isDisplay("DCI.Text") && objCrea.companion && objCrea.companion.indexOf("familiar_not_al") !== -1 ? " (if DM approves)" : false; - }, action : [ ["action", "Familiar (dismiss/reappear)"], ["action", "Use familiar's senses"] @@ -82,9 +78,9 @@ var Base_CompanionList = { nameOrigin : "variant of the Find Familiar 1st-level conjuration [ritual] spell", nameMenu : "Pact of the Chain familiar (Warlock feature)", source : [["SRD", 47], ["P", 107]], - includeCheck : function(sCrea, objCrea, iCreaCR) { + includeCheck : function(sCrea, objCrea, iCreaCR, bIsAL) { // return true if to be included, or a string to add a note to the menu option - return !objCrea.companion ? false : objCrea.companion.indexOf("familiar") !== -1 ? true : !!isDisplay("DCI.Text") && objCrea.companion.indexOf("familiar_not_al") !== -1 ? " (if DM approves)" : false; + return !objCrea.companion ? false : objCrea.companion.indexOf("familiar") !== -1 ? true : bIsAL && objCrea.companion.indexOf("familiar_not_al") !== -1 ? " (if DM approves)" : false; }, action : [ ["action", "Familiar (dismiss/reappear)"], diff --git a/_variables/ListsCreatures.js b/_variables/ListsCreatures.js index 2f687aae..b65e6883 100644 --- a/_variables/ListsCreatures.js +++ b/_variables/ListsCreatures.js @@ -529,7 +529,7 @@ var Base_CreatureList = { damage_resistances : "cold; bludgeoning, piercing, and slashing from nonmagical attacks that aren't silver weapons", damage_immunities : "fire, poison", condition_immunities : "poisoned", - senses : "Darkvision 120 ft; Devil's Sight (Magical darkness doesn't impede the imp's Darkvision)", + senses : "Darkvision 120 ft; Devil's Sight (Magical darkness doesn't impede the imp's darkvision)", passivePerception : 11, languages : "Infernal, Common", challengeRating : "1", @@ -744,7 +744,6 @@ var Base_CreatureList = { ability : 2, damage : [1, "", "piercing"], range : "40/160 ft", - description : "", abilitytodamage : false, description : "DC 10 Con save or poisoned 1 min; fail by 5 or more: also unconscious 1 min, until damaged or awakened", tooltip : "The target hit must succeed on a DC 10 Constitution saving throw or become poisoned for 1 minute. If its saving throw result is 5 or lower, the poisoned target falls unconscious for the same duration, or until it takes damage or another creature takes an action to shake it awake." @@ -1079,7 +1078,7 @@ var Base_CreatureList = { ability : 2, damage : [1, 8, "piercing"], range : "150/600 ft", - description : "Ammunition, heavy, two-handed)" + description : "Ammunition, heavy, two-handed" }], traits : [{ name : "Sunlight Sensitivity", @@ -1087,6 +1086,10 @@ var Base_CreatureList = { }, { name : "Life Drain", description : "A target of the wight's life drain attack must succeed on a DC 13 Constitution saving throw or its hit point maximum is reduced by an amount equal to the damage taken. This reduction lasts until the target finishes a long rest. The target dies if this effect reduces its hit point maximum to 0.\n A humanoid slain by this attack rises 24 hours later as a zombie under the wight's control, unless the humanoid is restored to life or its body is destroyed. The wight can have no more than twelve zombies under its control at one time." + }], + actions : [{ + name : "Multiattack", + description : "The wight makes two longsword attacks or two longbow attacks. It can use its Life Drain in place of one longsword attack." }] }, "zombie" : { @@ -1615,7 +1618,7 @@ var Base_CreatureList = { damage : [2, 10, "bludgeoning"], modifiers : [-1, ""], range : "Melee (5 ft)", - description : "DC 15 Con save or HP max reduced; Two Slam attacks as an Attack action; Counts as magical", + description : "DC 15 Con save or HP max reduced; Two slam attacks as an Attack action; Counts as magical", abilitytodamage : true, tooltip : "If the target is a creature, it must succeed on a DC 15 Constitution saving throw or have its hit point maximum reduced by an amount equal to the damage taken. The target dies if this attack reduces its hit point maximum to 0. The reduction lasts until removed by the greater restoration spell or other magic." }, { @@ -1677,7 +1680,7 @@ var Base_CreatureList = { ability : 1, damage : [2, 8, "bludgeoning"], range : "Melee (5 ft)", - description : "Two Slam attacks as an Attack action; Counts as magical", + description : "Two slam attacks as an Attack action; Counts as magical", abilitytodamage : true }], traits : [{ @@ -1790,7 +1793,7 @@ var Base_CreatureList = { ability : 1, damage : [3, 8, "bludgeoning"], range : "Melee (5 ft)", - description : "Two Slam attacks as an Attack action; Counts as magical" + description : "Two slam attacks as an Attack action; Counts as magical" }, { name : "Slow (Recharge 5-6)", ability : 3, diff --git a/_variables/ListsMagicItems.js b/_variables/ListsMagicItems.js index d72bfbc4..503bd090 100644 --- a/_variables/ListsMagicItems.js +++ b/_variables/ListsMagicItems.js @@ -387,7 +387,10 @@ var Base_MagicItemsList = { chooseGear : { type : "ammo", prefixOrSuffix : "prefix", - descriptionChange : ["replace", "ammunition"] + descriptionChange : ["replace", "ammunition"], + excludeCheck : function (inObjKey, inObj) { + return /vials|flasks/i.test(inObj.icon); + } } }, "bag of beans" : { // contributed by Larry Hoy @@ -563,7 +566,7 @@ var Base_MagicItemsList = { descriptionChange : ["replace", "axe"], excludeCheck : function (inObjKey, inObj) { var testRegex = /axe/i; - return !(testRegex).test(inObjKey) && (!inObj.baseWeapon || !(testRegex).test(inObj.baseWeapon)); + return !testRegex.test(inObjKey) && (!inObj.baseWeapon || !testRegex.test(inObj.baseWeapon)); } }, calcChanges : { @@ -712,7 +715,7 @@ var Base_MagicItemsList = { } }, 'I add +2 to the damage of attacks I make with shortbows and longbows.' - ], + ] } }, "bracers of defense" : { @@ -1268,13 +1271,13 @@ var Base_MagicItemsList = { descriptionChange : ["replace", "sword"], excludeCheck : function (inObjKey, inObj) { var testRegex = /sword|scimitar|rapier/i; - return !(testRegex).test(inObjKey) && (!inObj.baseWeapon || !(testRegex).test(inObj.baseWeapon)); + return !testRegex.test(inObjKey) && (!inObj.baseWeapon || !testRegex.test(inObj.baseWeapon)); } }, calcChanges : { atkAdd : [ function (fields, v) { - if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/dancing/i).test(v.WeaponTextName)) { + if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/dancing/i).test(v.WeaponTextName)) { v.theWea.isMagicWeapon = true; fields.Description = fields.Description.replace(/(, |; )?Counts as magical/i, ''); fields.Description += (fields.Description ? '; ' : '') + 'Attacks on its own as a bonus action'; @@ -1304,9 +1307,9 @@ var Base_MagicItemsList = { description : "As an action, I can draw a card at random from this deck and throw it on the ground within 30 ft. An illusion, determined by the type of card, forms over the thrown card and remains until dispelled. While I'm within 120 ft of it, I can use an action to move it within 30 ft of the card. See Notes page for more details.", descriptionFull : [ "This box contains a set of parchment cards. A full deck has 34 cards. A deck found as treasure is usually missing 1d20-1 cards.", - "The magic of the deck functions only if cards are drawn at random (you can use an altered deck of playing cards to simulate the deck). You can use an action to draw a card at random from the deck and throw it to the ground at a point within 30 feet of you.", - "An illusion of one or more creatures forms over the thrown card and remains until dispelled. An illusory creature appears real, of the appropriate size, and behaves as if it were a real creature, except that it can do no harm. While you are within 120 feet of the illusory creature and can see it, you can use an action to move it magically anywhere within 30 feet of its card. Any physical interaction with the illusory creature reveals it to be an illusion, because objects pass through it. Someone who uses an action to visually inspect the creature identifies it as illusory with a successful DC 15 Intelligence (Investigation) check. The creature then appears translucent.", - "The illusion lasts until its card is moved or the illusion is dispelled. When the illusion ends, the image on its card disappears, and that card can't be used again.\n", + " The magic of the deck functions only if cards are drawn at random (you can use an altered deck of playing cards to simulate the deck). You can use an action to draw a card at random from the deck and throw it to the ground at a point within 30 feet of you.", + " An illusion of one or more creatures forms over the thrown card and remains until dispelled. An illusory creature appears real, of the appropriate size, and behaves as if it were a real creature, except that it can do no harm. While you are within 120 feet of the illusory creature and can see it, you can use an action to move it magically anywhere within 30 feet of its card. Any physical interaction with the illusory creature reveals it to be an illusion, because objects pass through it. Someone who uses an action to visually inspect the creature identifies it as illusory with a successful DC 15 Intelligence (Investigation) check. The creature then appears translucent.", + " The illusion lasts until its card is moved or the illusion is dispelled. When the illusion ends, the image on its card disappears, and that card can't be used again.\n", toUni("1d34\tPlaying Card\tIllusion"), " 1\tAce of hearts\tRed dragon", " 2\tKing of hearts\tKnight and four guards", @@ -1348,42 +1351,42 @@ var Base_MagicItemsList = { "This box contains a set of parchment cards. A full deck has 34 cards. A deck found as treasure is usually missing 1d20-1 cards.", "The magic of the deck functions only if cards are drawn at random. I can use an action to draw a card at random from the deck and throw it to the ground at a point within 30 ft of me.", "An illusion of one or more creatures forms over the thrown card and remains until dispelled. An illusory creature appears real, of the appropriate size, and behaves as if it were a real creature, except that it can do no harm. While I am within 120 ft of the illusory creature and can see it, I can use an action to move it magically anywhere within 30 ft of its card. Any physical interaction with the illusory creature reveals it to be an illusion, because objects pass through it. Someone who uses an action to visually inspect the creature identifies it as illusory with a successful DC 15 Intelligence (Investigation) check. The creature then appears translucent.", - "The illusion lasts until its card is moved or the illusion is dispelled. When the illusion ends, the image on its card disappears, and that card can't be used again.\n", - "1d34\tPLAYING CARD\tILLUSION", - " 1\tAce of hearts\tRed dragon", - " 2\tKing of hearts\tKnight and four guards", - " 3\tQueen of hearts\tSuccubus/Incubus", - " 4\tJack of hearts\tDruid", - " 5\tTen of hearts\tCloud giant", - " 6\tNine of hearts\tEttin", - " 7\tEight of hearts\tBugbear", - " 8\tTwo of hearts\tGoblin", - " 9\tAce of diamonds\tBeholder", - " 10\tKing of diamonds\tArchmage and mage apprentice", - " 11\tQueen diamonds\tNight hag", - " 12\tJack of diamonds\tAssassin", - " 13\tTen of diamonds\tFire giant", - " 14\tNine of diamonds\tOgre mage", - " 15\tEight of diamonds\tGnoll", - " 16\tTwo of diamonds\tKobold", - " 17\tAce of spades\tLich", - " 18\tKing of spades\tPriest and two acolytes", - " 19\tQueen of spades\tMedusa", - " 20\tJack of spades\tVeteran", - " 21\tTen of spades\tFrost giant", - " 22\tNine of spades\tTroll", - " 23\tEight of spades\tHobgoblin", - " 24\tTwo of spades\tGoblin", - " 25\tAce of clubs \tIron golem", - " 26\tKing of clubs\tBandit captain and three bandits", - " 27\tQueen of clubs\tErinyes", - " 28\tJack of clubs\tBerserker", - " 29\tTen of clubs \tHill giant", - " 30\tNine of clubs\tOgre", - " 31\tEight of clubs\tOrc", - " 32\tTwo of clubs \tKobold", - "33-34\tJoker (2)\t\tYou (the deck's owner)" - ].join("\n") + "The illusion lasts until its card is moved or the illusion is dispelled. When the illusion ends, the image on its card disappears, and that card can't be used again.", + "\n1d34\tPLAYING CARD\t\tILLUSION", + "1\t[A\u2665] Ace of hearts\t\tRed dragon", + "2\t[K\u2665] King of hearts\t\tKnight and four guards", + "3\t[Q\u2665] Queen of hearts\t\tSuccubus/Incubus", + "4\t[J\u2665] Jack of hearts\t\tDruid", + "5\t[10\u2665] Ten of hearts\t\tCloud giant", + "6\t[9\u2665] Nine of hearts\t\tEttin", + "7\t[8\u2665] Eight of hearts\t\tBugbear", + "8\t[2\u2665] Two of hearts\t\tGoblin", + "9\t[A\u2666] Ace of diamonds\t\tBeholder", + "10\t[K\u2666] King of diamonds\t\tArchmage and mage apprentice", + "11\t[Q\u2666] Queen of diamonds \tNight hag", + "12\t[J\u2666] Jack of diamonds\t\tAssassin", + "13\t[10\u2666] Ten of diamonds\t\tFire giant", + "14\t[9\u2666] Nine of diamonds\t\tOgre mage", + "15\t[8\u2666] Eight of diamonds\t\tGnoll", + "16\t[2\u2666] Two of diamonds\t\tKobold", + "17\t[A\u2660] Ace of spades\t\tLich", + "18\t[K\u2660] King of spades\t\tPriest and two acolytes", + "19\t[Q\u2660] Queen of spades\t\tMedusa", + "20\t[J\u2660] Jack of spades\t\tVeteran", + "21\t[10\u2660] Ten of spades\t\tFrost giant", + "22\t[9\u2660] Nine of spades\t\tTroll", + "23\t[8\u2660] Eight of spades\t\tHobgoblin", + "24\t[2\u2660] Two of spades\t\tGoblin", + "25\t[A\u2663] Ace of clubs\t\tIron golem", + "26\t[K\u2663] King of clubs\t\tBandit captain and three bandits", + "27\t[Q\u2663] Queen of clubs\t\tErinyes", + "28\t[J\u2663] Jack of clubs\t\tBerserker", + "29\t[10\u2663] Ten of clubs\t\tHill giant", + "30\t[9\u2663] Nine of clubs\t\tOgre", + "31\t[8\u2663] Eight of clubs\t\tOrc", + "32\t[2\u2663] Two of clubs\t\tKobold", + "33-34\tJoker (2)\t\t\tYou (the deck's owner)" + ] }] }, "deck of many things" : { // contains contributions by Larry Hoy @@ -1419,56 +1422,63 @@ var Base_MagicItemsList = { toUni("The Void") + ". This black card spells disaster. Your soul is drawn from your body and contained in an object in a place of the DM's choice. One or more powerful beings guard the place. While your soul is trapped in this way, your body is incapacitated. A Wish spell can't restore your soul, but the spell reveals the location of the object that holds it. You draw no more cards." ].join("\n \u2022 "), toNotesPage : [{ - name : "Cards and Their Effects", + name : "Features and Table", note : [ "Usually found in a box or pouch, this deck contains either 13 (75%) or 22 (25%) cards made of ivory or vellum.", "Before I draw a card, I must declare how many cards I intend to draw and then draw them randomly. Any cards drawn in excess of this number have no effect. Otherwise, as soon as I draw a card from the deck, its magic takes effect. I must draw each card no more than 1 hour after the previous draw. If I fail to draw the chosen number, the remaining number of cards fly from the deck on their own and take effect all at once.", - "Once a card is drawn, it fades from existence. Unless the card is the Fool or the Jester, the card reappears in the deck, making it possible to draw the same card twice.\n\n1d22\tPLAYING CARD\tCARD", - "1\tAce of diamonds\tVizier*", - "2\tKing of diamonds\tSun", - "3\tQueen of diamonds\tMoon", - "4\tJack of diamonds\tStar", - "5\tTwo of diamonds\tComet*", - "6\tAce of hearts\tThe Fates*", - "7\tKing of hearts\tThrone", - "8\tQueen of hearts\tKey", - "9\tJack of hearts\tKnight", - "10\tTwo of hearts\tGem*", - "11\tAce of clubs \tTalons*", - "12\tKing of clubs\tThe Void", - "13\tQueen of clubs\tFlames", - "14\tJack of clubs\tSkull", - "15\tTwo of clubs \tIdiot*", - "16\tAce of spades\tDonjon*", - "17\tKing of spades\tRuin", - "18\tQueen of spades\tEuryale", - "19\tJack of spades\tRogue", - "20\tTwo of spades\tBalance*", - "21\tJoker (with TM)\tFool*", - "22\tJoker (no TM)\tJester\n* Found only in a deck with twenty-two cards\n", - "\u2022 Balance. My mind suffers a wrenching alteration, causing my alignment to change. Lawful to chaotic, good to evil, and vice versa.", - "\u2022 Comet. If I single-handedly defeat the next hostile monster/group of monsters I encounter, I gain enough XP to gain one level.", - "\u2022 Donjon. I disappear into a state of suspended animation in an extradimensional sphere. Everything I had stays behind. Wish can reveal my location. I draw no more cards.", - "\u2022 Euryale. This card's medusa-like visage curses me with a -2 penalty on saving throws. Only a god or the magic of The Fates card can end this curse.", - "\u2022 The Fates. Reality's fabric unravels and spins anew, allowing me to avoid or erase one event. I can use the card's magic any one time before I die.", - "\u2022 Flames. A powerful devil becomes my enemy until one of us dies. It seeks my ruin and plagues my life, savoring my suffering before attempting to slay me.", - "\u2022 Fool. I lose up to 10,000 XP (no level loss), discard this card, and draw again.", - "\u2022 Gem. 25 pieces of jewelry (2000 gp each) or 50 gems (1000 gp each) appear at my feet.", - "\u2022 Idiot. Permanently reduce my Intelligence by 1d4+1 (min of 1). I can draw one additional card.", - "\u2022 Jester. I gain 10,000 XP or I can draw two extra cards.", - "\u2022 Key. A rare or rarer magic weapon with which I'm proficient appears in my hands.", - "\u2022 Knight. A 4th-level fighter of my race appears within 30 ft, serving me loyally until death, believing the fates have drawn him/her to me (I control this NPC).", - "\u2022 Moon. I am granted the ability to cast the Wish spell 1d3 times.", - "\u2022 Rogue. An NPC becomes hostile toward me (Wish or divine intervention ends).", - "\u2022 Ruin. All forms of wealth that I carry or own, other than magic items, are lost. Businesses, buildings, and land I own are lost in a way that alters reality the least.", - "\u2022 Skull. I summon a ghostly skeleton with tattered robes and a spectral scythe within 10 ft. It attacks me, warning all others that I must win the battle alone.", - "\u2022 Star. Increase one of my ability scores by 2 (can't exceed 24).", - "\u2022 Sun. I gain 50,000 XP and a wondrous item appears in my hands.", - "\u2022 Talons. Every magic item I wear or carry disintegrates. Artifacts in my possession aren't destroyed but do vanish.", - "\u2022 Throne. I gain expertise in Persuasion and rightful ownership of a small keep somewhere in the world (currently occupied by monsters).", - "\u2022 Vizier. Within one year I can ask one question in meditation and receive a truthful answer. This knowledge comes with the wisdom on how to apply it.", - "\u2022 The Void. This black card spells disaster. My soul is contained in an object, powerful beings guard it, and my body is incapacitated. Wish can reveal my location. I draw no more cards." + "Once a card is drawn, it fades from existence. Unless the card is the Fool or the Jester, the card reappears in the deck, making it possible to draw the same card twice.", + "\n1d13\t1d22\tPLAYING CARD\t\tCARD", + "\t 1\t[A\u2666] Ace of diamonds\t\tVizier*", + "1\t 2\t[K\u2666] King of diamonds\t\tSun", + "2\t 3\t[Q\u2666] Queen of diamonds \tMoon", + "3\t 4\t[J\u2666] Jack of diamonds\t\tStar", + "\t 5\t[2\u2666] Two of diamonds\t\tComet*", + "\t 6\t[A\u2665] Ace of hearts\t\tThe Fates*", + "4\t 7\t[K\u2665] King of hearts\t\tThrone", + "5\t 8\t[Q\u2665] Queen of hearts\t\tKey", + "6\t 9\t[J\u2665] Jack of hearts\t\tKnight", + "\t 10\t[2\u2665] Two of hearts\t\tGem*", + "\t 11\t[A\u2663] Ace of clubs\t\tTalons*", + "7\t 12\t[K\u2663] King of clubs\t\tThe Void", + "8\t 13\t[Q\u2663] Queen of clubs\t\tFlames", + "9\t 14\t[J\u2663] Jack of clubs\t\tSkull", + "\t 15\t[2\u2663] Two of clubs\t\tIdiot*", + "\t 16\t[A\u2660] Ace of spades\t\tDonjon*", + "10\t 17\t[K\u2660] King of spades\t\tRuin", + "11\t 18\t[Q\u2660] Queen of spades\t\tEuryale", + "12\t 19\t[J\u2660] Jack of spades\t\tRogue", + "\t 20\t[2\u2660] Two of spades\t\tBalance*", + "\t 21\tJoker (with TM)\t\tFool*", + "13\t 22\tJoker (no TM)\t\tJester\n", + "* Found only in a deck with twenty-two cards" ] + }, { + name : "Cards and Their Effects", + note : [ + "", + "Balance: My mind suffers a wrenching alteration, causing my alignment to change. Lawful to chaotic, good to evil, and vice versa.", + "Comet: If I single-handedly defeat the next hostile monster/group of monsters I encounter, I gain enough XP to gain one level.", + "Donjon: I disappear into a state of suspended animation in an extradimensional sphere. Everything I had stays behind. Wish can reveal my location. I draw no more cards.", + "Euryale: This card's medusa-like visage curses me with a -2 penalty on saving throws. Only a god or the magic of The Fates card can end this curse.", + "The Fates: Reality's fabric unravels and spins anew, allowing me to avoid or erase one event. I can use the card's magic any one time before I die.", + "Flames: A powerful devil becomes my enemy until one of us dies. It seeks my ruin and plagues my life, savoring my suffering before attempting to slay me.", + "Fool: I lose up to 10,000 XP (no level loss), discard this card, and draw again.", + "Gem: 25 pieces of jewelry (2000 gp each) or 50 gems (1000 gp each) appear at my feet.", + "Idiot: Permanently reduce my Intelligence by 1d4+1 (min of 1). I can draw one additional card.", + "Jester: I gain 10,000 XP or I can draw two extra cards.", + "Key: A rare or rarer magic weapon with which I'm proficient appears in my hands.", + "Knight: A 4th-level fighter of my race appears within 30 ft, serving me loyally until death, believing the fates have drawn him/her to me (I control this NPC).", + "Moon: I am granted the ability to cast the Wish spell 1d3 times.", + "Rogue: An NPC becomes hostile toward me (Wish or divine intervention ends).", + "Ruin: All forms of wealth that I carry or own, other than magic items, are lost. Businesses, buildings, and land I own are lost in a way that alters reality the least.", + "Skull: I summon a ghostly skeleton with tattered robes and a spectral scythe within 10 ft. It attacks me, warning all others that I must win the battle alone.", + "Star: Increase one of my ability scores by 2 (can't exceed 24).", + "Sun: I gain 50,000 XP and a wondrous item appears in my hands.", + "Talons: Every magic item I wear or carry disintegrates. Artifacts in my possession aren't destroyed but do vanish.", + "Throne: I gain expertise in Persuasion and rightful ownership of a small keep somewhere in the world (currently occupied by monsters).", + "Vizier: Within one year I can ask one question in meditation and receive a truthful answer. This knowledge comes with the wisdom on how to apply it.", + "The Void: This black card spells disaster. My soul is contained in an object, powerful beings guard it, and my body is incapacitated. Wish can reveal my location. I draw no more cards." + ].join("\n\u2022 ") }] }, "defender" : { @@ -1486,13 +1496,13 @@ var Base_MagicItemsList = { descriptionChange : ["replace", "sword"], excludeCheck : function (inObjKey, inObj) { var testRegex = /sword|scimitar|rapier/i; - return !(testRegex).test(inObjKey) && (!inObj.baseWeapon || !(testRegex).test(inObj.baseWeapon)); + return !testRegex.test(inObjKey) && (!inObj.baseWeapon || !testRegex.test(inObj.baseWeapon)); } }, calcChanges : { atkAdd : [ function (fields, v) { - if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/defender/i).test(v.WeaponTextName)) { + if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/defender/i).test(v.WeaponTextName)) { v.theWea.isMagicWeapon = true; fields.Description = fields.Description.replace(/(, |; )?Counts as magical/i, ''); fields.Description += (fields.Description ? '; ' : '') + '+3 bonus can be used for AC instead'; @@ -1502,7 +1512,7 @@ var Base_MagicItemsList = { ], atkCalc : [ function (fields, v, output) { - if (v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/defender/i).test(v.WeaponTextName)) { + if (v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/defender/i).test(v.WeaponTextName)) { output.magic = v.thisWeapon[1] + 3; } }, '' @@ -1675,13 +1685,13 @@ var Base_MagicItemsList = { descriptionChange : ["replace", "sword"], excludeCheck : function (inObjKey, inObj) { var testRegex = /sword|scimitar|rapier/i; - return !(testRegex).test(inObjKey) && (!inObj.baseWeapon || !(testRegex).test(inObj.baseWeapon)); + return !testRegex.test(inObjKey) && (!inObj.baseWeapon || !testRegex.test(inObj.baseWeapon)); } }, calcChanges : { atkAdd : [ function (fields, v) { - if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/^(?=.*dragon)(?=.*slayer).*$/i).test(v.WeaponTextName)) { + if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/^(?=.*dragon)(?=.*slayer).*$/i).test(v.WeaponTextName)) { v.theWea.isMagicWeapon = true; fields.Description = fields.Description.replace(/(, |; )?Counts as magical/i, ''); fields.Description += (fields.Description ? '; ' : '') + '+3d6 damage vs. dragons'; @@ -1691,7 +1701,7 @@ var Base_MagicItemsList = { ], atkCalc : [ function (fields, v, output) { - if (v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/^(?=.*dragon)(?=.*slayer).*$/i).test(v.WeaponTextName)) { + if (v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/^(?=.*dragon)(?=.*slayer).*$/i).test(v.WeaponTextName)) { output.magic = v.thisWeapon[1] + 1; } }, '' @@ -2091,13 +2101,13 @@ var Base_MagicItemsList = { descriptionChange : ["replace", "sword"], excludeCheck : function (inObjKey, inObj) { var testRegex = /sword|scimitar|rapier/i; - return !(testRegex).test(inObjKey) && (!inObj.baseWeapon || !(testRegex).test(inObj.baseWeapon)); + return !testRegex.test(inObjKey) && (!inObj.baseWeapon || !testRegex.test(inObj.baseWeapon)); } }, calcChanges : { atkAdd : [ function (fields, v) { - if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/^(?=.*flame)(?=.*tongue).*$/i).test(v.WeaponTextName)) { + if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && /^(?=.*flame)(?=.*tongue).*$/i.test(v.WeaponTextName)) { v.theWea.isMagicWeapon = true; fields.Description = fields.Description.replace(/(, |; )?Counts as magical/i, ''); fields.Description += (fields.Description ? '; ' : '') + 'While active, +2d6 fire damage'; @@ -2138,13 +2148,13 @@ var Base_MagicItemsList = { descriptionChange : ["replace", "sword"], excludeCheck : function (inObjKey, inObj) { var testRegex = /sword|scimitar|rapier/i; - return !(testRegex).test(inObjKey) && (!inObj.baseWeapon || !(testRegex).test(inObj.baseWeapon)); + return !testRegex.test(inObjKey) && (!inObj.baseWeapon || !testRegex.test(inObj.baseWeapon)); } }, calcChanges : { atkAdd : [ function (fields, v) { - if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/^(?=.*frost)(?=.*brand).*$/i).test(v.WeaponTextName)) { + if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/^(?=.*frost)(?=.*brand).*$/i).test(v.WeaponTextName)) { v.theWea.isMagicWeapon = true; fields.Description = fields.Description.replace(/(, |; )?Counts as magical/i, ''); fields.Description += (fields.Description ? '; ' : '') + '+1d6 cold damage'; @@ -2207,7 +2217,7 @@ var Base_MagicItemsList = { descriptionChange : ["replace", "weapon"], excludeCheck : function (inObjKey, inObj) { var testRegex = /sword|scimitar|rapier|axe/i; - return !(testRegex).test(inObjKey) && (!inObj.baseWeapon || !(testRegex).test(inObj.baseWeapon)); + return !testRegex.test(inObjKey) && (!inObj.baseWeapon || !testRegex.test(inObj.baseWeapon)); } }, calcChanges : { @@ -2523,13 +2533,13 @@ var Base_MagicItemsList = { itemName1stPage : ["brackets", "Holy Avenger"], excludeCheck : function (inObjKey, inObj) { var testRegex = /sword|scimitar|rapier/i; - return !(testRegex).test(inObjKey) && (!inObj.baseWeapon || !(testRegex).test(inObj.baseWeapon)); + return !testRegex.test(inObjKey) && (!inObj.baseWeapon || !testRegex.test(inObj.baseWeapon)); } }, calcChanges : { atkAdd : [ function (fields, v) { - if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/^(?=.*holy)(?=.*avenger).*$/i).test(v.WeaponTextName)) { + if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/^(?=.*holy)(?=.*avenger).*$/i).test(v.WeaponTextName)) { v.theWea.isMagicWeapon = true; fields.Description = fields.Description.replace(/(, |; )?Counts as magical/i, ''); fields.Description += (fields.Description ? '; ' : '') + '+2d10 radiant damage vs. fiends and undead'; @@ -2539,7 +2549,7 @@ var Base_MagicItemsList = { ], atkCalc : [ function (fields, v, output) { - if (v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/^(?=.*holy)(?=.*avenger).*$/i).test(v.WeaponTextName)) { + if (v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/^(?=.*holy)(?=.*avenger).*$/i).test(v.WeaponTextName)) { output.magic = v.thisWeapon[1] + 3; } }, '' @@ -2631,9 +2641,9 @@ var Base_MagicItemsList = { creaturesAdd : [["Berserker"]], creatureOptions : [{ name : "Berserker", - source : [["SRD", 392], ["M", 344]], + source : [["SRD", 397], ["M", 344]], eval : function(prefix) { - Value(prefix + "Comp.Desc.Name", "Warrior Spirits"); + Value(prefix + "Comp.Desc.Name", "Warrior Spirit"); }, size : 3, type : "Humanoid", @@ -2662,7 +2672,7 @@ var Base_MagicItemsList = { }], features : [{ name : "Summoned", - description : "The Warrior Spirits are friendly to you and your companions and follow your commands. They return to Ysgard after 1 hour or when they drop to 0 hit points." + description : "The Warrior Spirit is friendly to you and your companions and follow your commands. They return to Ysgard after 1 hour or when they drop to 0 hit points." }] }] }, @@ -2906,7 +2916,7 @@ var Base_MagicItemsList = { extraLimitedFeatures : [{ name : "Luck Blade - luck reroll", usages : 1, - recovery : "Dawn" + recovery : "dawn" }, { name : "Luck Blade - cast Wish", usages : "1d4-1", @@ -2918,14 +2928,14 @@ var Base_MagicItemsList = { descriptionChange : ["replace", "sword"], excludeCheck : function (inObjKey, inObj) { var testRegex = /sword|scimitar|rapier/i; - return !(testRegex).test(inObjKey) && (!inObj.baseWeapon || !(testRegex).test(inObj.baseWeapon)); + return !testRegex.test(inObjKey) && (!inObj.baseWeapon || !testRegex.test(inObj.baseWeapon)); } }, addMod : [{ type : "save", field : "all", mod : 1, text : "While the Luck Blade is on my person, I gain a +1 bonus to all my saving throws." }], calcChanges : { atkAdd : [ function (fields, v) { - if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/^(?=.*luck)(?=.*blade).*$/i).test(v.WeaponTextName)) { + if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/^(?=.*luck)(?=.*blade).*$/i).test(v.WeaponTextName)) { v.theWea.isMagicWeapon = true; fields.Description = fields.Description.replace(/(, |; )?Counts as magical/i, ''); } @@ -2934,7 +2944,7 @@ var Base_MagicItemsList = { ], atkCalc : [ function (fields, v, output) { - if (v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/^(?=.*luck)(?=.*blade).*$/i).test(v.WeaponTextName)) { + if (v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/^(?=.*luck)(?=.*blade).*$/i).test(v.WeaponTextName)) { output.magic = v.thisWeapon[1] + 1; } }, '' @@ -3311,13 +3321,13 @@ var Base_MagicItemsList = { descriptionChange : ["replace", "sword"], excludeCheck : function (inObjKey, inObj) { var testRegex = /sword|scimitar|rapier/i; - return !(testRegex).test(inObjKey) && (!inObj.baseWeapon || !(testRegex).test(inObj.baseWeapon)); + return !testRegex.test(inObjKey) && (!inObj.baseWeapon || !testRegex.test(inObj.baseWeapon)); } }, calcChanges : { atkAdd : [ function (fields, v) { - if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/^(?=.*(9|nine))(?=.*(lives|life))(?=.*stealer).*$/i).test(v.WeaponTextName)) { + if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/^(?=.*(9|nine))(?=.*(lives|life))(?=.*stealer).*$/i).test(v.WeaponTextName)) { v.theWea.isMagicWeapon = true; fields.Description = fields.Description.replace(/(, |; )?Counts as magical/i, ''); fields.Description += (fields.Description ? '; ' : '') + 'On crit to target <100 HP, DC 15 Con save or die'; @@ -3327,7 +3337,7 @@ var Base_MagicItemsList = { ], atkCalc : [ function (fields, v, output) { - if (v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/^(?=.*(9|nine))(?=.*(lives|life))(?=.*stealer).*$/i).test(v.WeaponTextName)) { + if (v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/^(?=.*(9|nine))(?=.*(lives|life))(?=.*stealer).*$/i).test(v.WeaponTextName)) { output.magic = v.thisWeapon[1] + 2; } }, '' @@ -4783,7 +4793,7 @@ var Base_MagicItemsList = { calcChanges : { atkAdd : [ function (fields, v) { - if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/^(?=.*lordly)(?=.*might).*$/i).test(v.WeaponTextName)) { + if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/^(?=.*lordly)(?=.*might).*$/i).test(v.WeaponTextName)) { v.theWea.isMagicWeapon = true; fields.Description = fields.Description.replace(/(, |; )?Counts as magical/i, ''); fields.Description += (fields.Description ? '; ' : '') + '+2d6 fire damage'; @@ -5848,13 +5858,13 @@ var Base_MagicItemsList = { descriptionChange : ["replace", "sword"], excludeCheck : function (inObjKey, inObj) { var testRegex = /sword|scimitar|rapier/i; - return !(testRegex).test(inObjKey) && (!inObj.baseWeapon || !(testRegex).test(inObj.baseWeapon)); + return !testRegex.test(inObjKey) && (!inObj.baseWeapon || !testRegex.test(inObj.baseWeapon)); } }, calcChanges : { atkAdd : [ function (fields, v) { - if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/^(?=.*life)(?=.*stealing).*$/i).test(v.WeaponTextName)) { + if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/^(?=.*life)(?=.*stealing).*$/i).test(v.WeaponTextName)) { v.theWea.isMagicWeapon = true; fields.Description = fields.Description.replace(/(, |; )?Counts as magical/i, ''); fields.Description += (fields.Description ? '; ' : '') + 'On 20 to hit: +10 Necrotic dmg, 10 temp HP'; @@ -5881,13 +5891,13 @@ var Base_MagicItemsList = { descriptionChange : ["replace", "sword"], excludeCheck : function (inObjKey, inObj) { var testRegex = /sword|scimitar|rapier/i; - return (!(testRegex).test(inObjKey) && (!inObj.baseWeapon || !(testRegex).test(inObj.baseWeapon))) || (inObj.baseWeapon && !inObj.damage ? WeaponsList[inObj.baseWeapon].damage : inObj.damage)[2] !== "slashing"; + return (!testRegex.test(inObjKey) && (!inObj.baseWeapon || !testRegex.test(inObj.baseWeapon))) || (inObj.baseWeapon && !inObj.damage ? WeaponsList[inObj.baseWeapon].damage : inObj.damage)[2] !== "slashing"; } }, calcChanges : { atkAdd : [ function (fields, v) { - if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/of sharpness/i).test(v.WeaponTextName) && v.theWea.damage[2] == "slashing") { + if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/of sharpness/i).test(v.WeaponTextName) && v.theWea.damage[2] == "slashing") { v.theWea.isMagicWeapon = true; fields.Description = fields.Description.replace(/(, |; )?Counts as magical/i, ''); fields.Description += (fields.Description ? '; ' : '') + 'On 20 to hit: +14 damage \u0026 5% chance to sever limb; Max damage vs. objects'; @@ -5914,13 +5924,13 @@ var Base_MagicItemsList = { descriptionChange : ["replace", "sword"], excludeCheck : function (inObjKey, inObj) { var testRegex = /sword|scimitar|rapier/i; - return !(testRegex).test(inObjKey) && (!inObj.baseWeapon || !(testRegex).test(inObj.baseWeapon)); + return !testRegex.test(inObjKey) && (!inObj.baseWeapon || !testRegex.test(inObj.baseWeapon)); } }, calcChanges : { atkAdd : [ function (fields, v) { - if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/of wounding/i).test(v.WeaponTextName)) { + if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/of wounding/i).test(v.WeaponTextName)) { v.theWea.isMagicWeapon = true; fields.Description = fields.Description.replace(/(, |; )?Counts as magical/i, ''); fields.Description += (fields.Description ? '; ' : '') + 'Damage can only be healed by resting; Once per turn, wound target'; @@ -5944,7 +5954,7 @@ var Base_MagicItemsList = { prerequisite : "Requires attunement by a creature of good alignment", prereqeval : function(v) { return (/good/i).test(What("Alignment")); }, usages : 7, - recovery : "never", + recovery : "Never", action : [["action", ""]], calcChanges : { spellCalc : [ @@ -5980,7 +5990,7 @@ var Base_MagicItemsList = { prerequisite : "Requires attunement by a creature of evil alignment", prereqeval : function(v) { return (/evil/i).test(What("Alignment")); }, usages : 6, - recovery : "never", + recovery : "Never", action : [["action", ""]], calcChanges : { spellCalc : [ @@ -6117,13 +6127,14 @@ var Base_MagicItemsList = { descriptionChange : ["replace", "sword"], excludeCheck : function (inObjKey, inObj) { var testRegex = /sword|scimitar|rapier/i; - return (!(testRegex).test(inObjKey) && (!inObj.baseWeapon || !(testRegex).test(inObj.baseWeapon))) || (inObj.baseWeapon && !inObj.damage ? WeaponsList[inObj.baseWeapon].damage : inObj.damage)[2] !== "slashing"; + var damageArr = inObj.baseWeapon && !inObj.damage ? WeaponsList[inObj.baseWeapon].damage : inObj.damage; + return (!testRegex.test(inObjKey) && (!inObj.baseWeapon || !testRegex.test(inObj.baseWeapon))) || !/slash(\.|ing)/i.test(damageArr.toString()); } }, calcChanges : { atkAdd : [ function (fields, v) { - if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/vorpal/i).test(v.WeaponTextName) && v.theWea.damage[2] == "slashing") { + if (!v.theWea.isMagicWeapon && v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/vorpal/i).test(v.WeaponTextName) && v.theWea.damage[2] == "slashing") { v.theWea.isMagicWeapon = true; fields.Description = fields.Description.replace(/(, |; )?Counts as magical/i, ''); fields.Description += (fields.Description ? '; ' : '') + 'Ignores slashing resistance; On 20 to hit: cut off head'; @@ -6133,7 +6144,7 @@ var Base_MagicItemsList = { ], atkCalc : [ function (fields, v, output) { - if (v.isMeleeWeapon && (/sword|scimitar|rapier/i).test(v.baseWeaponName) && (/vorpal/i).test(v.WeaponTextName) && v.theWea.damage[2] == "slashing") { + if (v.isMeleeWeapon && /sword|scimitar|rapier/i.test(v.baseWeaponName) && (/vorpal/i).test(v.WeaponTextName) && v.theWea.damage[2] == "slashing") { output.magic = v.thisWeapon[1] + 3; } }, '' @@ -6373,8 +6384,8 @@ var Base_MagicItemsList = { additional : "regains 1d3", action : [["action", ""]] }, - "wand of the war mage, +1, +2, or +3" : { - name : "Wand of the War Mage, +1, +2, or +3", + "wand of the war mage" : { + name : "Wand of the War Mage", nameTest : /^(?=.*war mage)(?=.*(arcane focus|rod|wand|staff)).*$/i, source : [["SRD", 249], ["D", 212]], type : "wand", diff --git a/_variables/ListsSpells.js b/_variables/ListsSpells.js index 3f070c16..6a789f9d 100644 --- a/_variables/ListsSpells.js +++ b/_variables/ListsSpells.js @@ -1431,8 +1431,8 @@ var Base_SpellsList = { compMaterial : "A piece of tentacle from a giant octopus or a giant squid", duration : "Conc, 1 min", save : "Dex", - description : "All that enter/start 20-ft rad save or restrained \u0026 3d6 Bludgeoning dmg/rnd; Str/Dex check to escape", - descriptionShorter : "All enter/start 20-ft rad save or restrained \u0026 3d6 Bludg. dmg/rnd; Str/Dex chk escape", + description : "All who enter/start 20-ft square save or restrained \u0026 3d6 Bludg. dmg/rnd; Str/Dex check to escape", + descriptionShorter : "All enter/start 20-ft square save or restrained \u0026 3d6 Bludg. dmg/rnd; Str/Dex chk escape", descriptionFull : "Squirming, ebony tentacles fill a 20-foot square on ground that you can see within range. For the duration, these tentacles turn the ground in the area into difficult terrain." + "\n " + "When a creature enters the affected area for the first time on a turn or starts its turn there, the creature must succeed on a Dexterity saving throw or take 3d6 bludgeoning damage and be restrained by the tentacles until the spell ends. A creature that starts its turn in the area and is already restrained by the tentacles takes 3d6 bludgeoning damage." + "\n " + "A creature restrained by the tentacles can use its action to make a Strength or Dexterity check (its choice) against your spell save DC. On a success, it frees itself." }, "expeditious retreat" : { diff --git a/additional content syntax/_common attributes.js b/additional content syntax/_common attributes.js index d1d042be..f15d30df 100644 --- a/additional content syntax/_common attributes.js +++ b/additional content syntax/_common attributes.js @@ -1631,12 +1631,12 @@ calcChanges : { VALUE REASON 1-10 When changing the damage die to something else (e.g. Monk's Martial Arts) - 17-20 When changing the critical range to something else (e.g. 18 is used for Fighter (Champion)'s - Superior Critical) + 17-20 When changing the critical range to something else (e.g. 18 is used for + Fighter (Champion)'s Superior Critical) 200< (199 or less) Something that is best changed before any script is run 700-899 When dependent on an attribute of the weapon that could be changed by - another feature (e.g. the Rogue's Sneak Attack, because something could theoretically - add the Finesse property) + another feature (e.g. the Rogue's Sneak Attack, because something could + theoretically add the Finesse property) 900+ When using the damage die for something in the description (e.g. Half-orc's Savage Attacks) */ @@ -2122,10 +2122,11 @@ addMod : [ a) for "skill" it can be the name of a skill (e.g. "Acrobatics"), or "Init" for initiative, or "Too" for the optional tool/skill for which you can change the name, - or "All" for the all skills modifier. + or "all" for the all skills modifier, + or "pass" for the passive perception modifier. b) for "save" it can be the three-letter abbreviation of an ability score, - or "All" for the all saves modifier. + or "all" for the all saves modifier. c) for "dc" it can be the three-letter abbreviation of an ability score. In this context, "dc" refers to the Ability Save DC on the front page. @@ -2135,8 +2136,13 @@ addMod : [ d) for "" it has to be the exact name of the field as used in the PDF. common ones include: - "Proficiency Bonus Modifier", // modifier field for proficiency bonus - "Passive Perception Bonus", // modifier field for passive perception (not normal perception) + "Proficiency Bonus Modifier" // modifier field for proficiency bonus + "Age" // age description field + "SpellSlots.CheckboxesSet.lvlX" // amount of spellslot checkboxes to show, + where X is replaced with the level (1-9). + N.B. These fields can only be a positive number, + you can't pre-emptively add "-1", + nor use any dynamic modifier like "Int" or "Prof". 3. mod This can be any combination of numbers, mathematical operators, @@ -2179,7 +2185,8 @@ addMod : [ character should be handled by adding a `calcChanges.atkAdd` attribute. 4. text - This is an explanation of why the modifier was added and is used in the modifier change dialog. + This is an explanation of why the modifier was added and is used in the + modifier change dialog, which appears when clicking the modifier field. NOTE: for modifiers to attacks, use calcChanges.atkCalc NOTE: for modifiers to AC, use extraAC @@ -2273,7 +2280,7 @@ bonusClassExtrachoices : [{ If the class feature is eligable (i.e. the character has the class in question and is high enough level), the number you enter in the `bonus` attribute will be added to the total allowed that is displayed in the Choose Feature menu on the 2nd page. - If the class feature is no eligable (i.e. the character does not have the class or is too low level), + If the class feature is not eligable (i.e. the character does not have the class or is too low level), the extrachoices will be displayed separately in the Choose Feature menu on the 2nd page and the player can select them. diff --git a/additional content syntax/_common spell list object.js b/additional content syntax/_common spell list object.js index 1808679d..0b61d7cd 100644 --- a/additional content syntax/_common spell list object.js +++ b/additional content syntax/_common spell list object.js @@ -101,7 +101,9 @@ spellcastingList : { TYPE: array (variable length) of class names as used in the SpellsList object's classes attribute USE: spells not on one of the listed class spell lists will be excluded from the final list - It is also possible to list the class "all", thus including spells from all class spell lists. + It is also possible to list the class as "any" or "all", thus including spells + from all class spell lists. + If you include either "any" or "all" in the array, there is no need to add others. */ level : [1, 5], diff --git a/additional content syntax/companion template option (CompanionList).js b/additional content syntax/companion template option (CompanionList).js index 2922cdc4..5d94bca6 100644 --- a/additional content syntax/companion template option (CompanionList).js +++ b/additional content syntax/companion template option (CompanionList).js @@ -86,7 +86,15 @@ CompanionList["purple familiar"] = { The object name here is 'purple familiar'. You can use any object name as long as it is not already used. If you do use an object name that is already in use, you will be overwriting that object. - Note the use of only lower case! Also note the absence of the word "var" and the use of brackets []. + It is this object name that will be used to refer to this companion type. + For example, it is what is used to fill the `companion` attribute of a CreatureList object. + When used in the `companion` attribute, this object name can be given the suffix + "_not_al", to hide it from the menu when the sheet is in Adventurers League mode and + display the text "(if DM approves)" when not in Adventurers League mode (the default). + See also the `includeCheck` attribute below. + + Note the use of only lower case! + Also note the absence of the word "var" and the use of brackets []. */ name : "Purple Familiar", /* name // REQUIRED // @@ -187,17 +195,20 @@ action : [ For the tooltip of the origin of these action(s), the `nameTooltip` will be used if defined, see above. If `nameTooltip` isn't defined, the `name` will be used instead. */ - includeCheck : function(sCrea, objCrea, iCreaCR) { + includeCheck : function(sCrea, objCrea, iCreaCR, bIsAL) { return objCrea.type.toLowerCase() === "beast" && objCrea.size >= 3 && iCreaCR <= 1/4 ? true : false; }, /* includeCheck // OPTIONAL // TYPE: function USE: filter things from the list of creatures to create the menu options + CHANGE: v13.1.12 (bIsAL variable, "_not_al" suffix) This function is called when the Companion Options button is pressed, to generate the menu entries for this companion template option. By default, the only creatures that will be displayed in the menu, will be those that have the `companion` attribute set to this CompanionList object's name. + Or those that have the `companion` attribute set to this CompanionList object's name with + the suffix "_not_al" (e.g. "familiar_not_al"). If options should be more dynamic, or if you don't want to alter a bunch of CreatureList entries, it is recommended to add this attribute. @@ -206,7 +217,7 @@ action : [ If the function returns a string, that entry will be added to the menu options and that string will be amended to it (e.g. return " (if DM approves)" for a "Cat" to have it "Cat (if DM approves)" in the menu). - This function is passed three variables: + This function is passed four variables: 1) sCrea A string of the name of the entry in the CreatureList object 2) objCrea @@ -214,6 +225,10 @@ action : [ 3) iCreaCR The numerical value of the challenge rating of the CreatureList object (e.g. 0.25 if the challengeRating attribute is "1/4") + 3) bIsAL + Boolean, `true` if the DCI text field is visible or `false` otherwise. + The DCI text field being visible is an indicator of the sheet being used in + and Adventurers League game. Only creatures in the CreatureList will be processed, not those added through the `creaturesAdd` attribute. diff --git a/additional content syntax/creature, wild shape option (CreatureList).js b/additional content syntax/creature, wild shape option (CreatureList).js index bc9f6900..8cdfc0af 100644 --- a/additional content syntax/creature, wild shape option (CreatureList).js +++ b/additional content syntax/creature, wild shape option (CreatureList).js @@ -231,11 +231,12 @@ CreatureList["purple crawler"] = { only with added brackets around it, thus it is recommended to have it all lowercase for consistency. */ companion : "familiar", - companion : ["familiar_not_al", "pact_of_the_chain"], + companion : ["familiar_not_al", "mount"], /* companion // OPTIONAL // TYPE: array of strings (or string, for backwards compatibility) USE: list this creature as an option for a special type of companion CHANGE: v13.1.0 + CHANGE: v13.1.12 ("_not_al" suffix) This attribute is an array of keys corresponding to a CompanionList object name, or, for backwards compatibility, a string of one key. @@ -256,16 +257,21 @@ CreatureList["purple crawler"] = { OPTION EXPLANATION "familiar" Find Familiar spell and Pact of the Chain warlock boon "pact_of_the_chain" Pact of the Chain warlock boon (but not Find Familiar spell) - "familiar_not_al" Same as "familiar", but with the added description "(if DM approves)" - However, this creature will not be shown for either Find Familiar - or Pact of the Chain when the DCI field is visible (i.e. Adventurers League). "mount" Find Steed spell "steed" Find Greater Steed spell "companion" Ranger's Companion (Beast Master feature) Has its own filter, so normally you don't need this option. - Filter: any Beast, Medium or smaller, and CR of 1/4 or lower + Filter: any Beast, Medium or smaller, and CR of 1/4 or lower "companionrr" 2016/09/12 Unearthed Arcana: Revised Ranger's Beast Conclave feature "strixhaven_mascot" Strixhaven Mascot familiar (Strixhaven Mascot feat), but not Find Familiar spell + + "_not_al" SUFFIX + From v13.1.12 onwards, any of the above can have the "_not_al" suffix (e.g. "mount_not_al"). + "al" stands for Adventurers League. + If this suffix is included, the creature will be listed in the menu with + the text "(if DM approves)" added. + When the DCI field is visible (i.e. Adventurers League enabled), the creature + will not be listed in the menu for that companion type. */ companionApply : "companion", /* companionApply // OPTIONAL //