' ;
+
+ const reCastMIspellCmd = /!magic\s+--cast-spell\s+MI\s*\|/im;
+ const reCastMIpowerCmd = /!magic\s+--cast-spell\s+MI-POWERS?\s*\|/im;
+ const reSpecs = /}}\s*Specs=\s*?(\[[^{]*?\])\s*?{{/im;
+ const reSpecsAll = /\[\s*?(\w[-\+\s\w\|]*?)\s*?,\s*?(\w[-\s\w\|]*?\w)\s*?,\s*?(\w[\s\w\|]*?\w)\s*?,\s*?(\w[-\+\s\w\|]*?\w)\s*?\]/g;
+ const reData = /}}\s*?\w*?data\s*?=(.*?){{/im;
+ const reDataAll = /\[.+?\]/g;
+ const reSpecClass = /\[\s*?\w[\s\|\w\-\+]*?\s*?,\s*?(\w[\s\|\w\-]*?)\s*?,.*?\]/g;
+ const reSpecSuperType = /}}\s*Specs=\s*?\[\s*?\w[\s\|\w\-\+]*?\s*?,\s*?\w[\s\|\w\-]*?\w\s*?,\s*?\d+H(?:\|\d*H)\s*?,\s*?(\w[\s\|\w\-]*?\w)\s*?\]/im;
+ const reDataSpeed = /}}\s*?\w*?data\s*?=.*?[\[,]\s*?sp:([d\d\+\-\*\/.]+?)[,\s\]]/im;
+ const reDataCharge = /}}\s*?\w*?data\s*?=.*?[\[,]\s*?rc:([\w\+\-]+?)[,\s\]]/im;
+ const reDataCost = /}}\s*?\w*?data\s*?=.*?[\[,]\s*?gp:(\d+?\.?\d*?)[,\s\]]/im;
+ const reDataLevel = /}}\s*?\w*?data\s*?=.*?[\[,]\s*?lv:(\d+?)[,\s\]]/im;
+ const reLevel = /[\[,]\s*?lv:(\d+?)[,\s\]]/im;
+ const reClassData = /}}\s*?ClassData\s*?=(.*?){{/im;
+ const reSpellData = /}}\s*?SpellData\s*?=(.*?){{/im;
+ const reRepeatingTable = /^(repeating_.*)_\$(\d+)_.*$/;
+ const reNotWeaponData = /}}[\s\w\-]*?(?"],
+ [/\\lt;?/gm, "<"],
+ [/<<|«/g, "["],
+ [/\\lbrak;?/g, "["],
+ [/>>|»/g, "]"],
+ [/\\rbrak;?/g, "]"],
+ [/\\\^/g, "?"],
+ [/\\ques;?/g, "?"],
+ [/`/g, "@"],
+ [/\\at;?/g, "@"],
+ [/~/g, "-"],
+ [/\\dash;?/g, "-"],
+ [/\\n/g, "\n"],
+ [/¦/g, "|"],
+ [/\\vbar;?/g, "|"],
+ [/\\clon;?/g, ":"],
+ [/\\amp;?/g, "&"],
+ [/\\lpar;?/g, "("],
+ [/\\rpar;?/g, ")"],
+ [/\\cr;?/g, "
"],
+ [/&&/g, "/"],
+ [/%%/g, "%"],
+ [/\\comma;?/g, ","],
+ ];
+
+ const dbEncoders = [
+ [/\\/gm,"\\\\"],
+ [/\r?\n/gm,'\\n'],
+ [/'/gm,"\\'"],
+ [/&/gm,"\\\\amp"],
+ [/>/gm,"\\\\gt"],
+ [/"],
+ [/\\lt/gm, "<"],
+ ];
+
+ const pallet = Object.freeze({
+ fancy: {
+ def: {outer:'yellow',outerpad:'',shadow:'rgba(0,0,0,0) 0px 0px',titlebox:'transparent',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'5% 5% 2px 5%',bodypad:'4px 5% 10% 10%',bodybox:'',rowbox:'purple',rowdark:'transparent',rowdarktext:'black',rowlight:'transparent',rowlighttext:'black',rowpad:'4px',outerimg:'https://s3.amazonaws.com/files.d20.io/images/279722596/LxsTe-cbwk5j9L0ipM3GLw/thumb.jpg?1649510600',titleimg:'https://s3.amazonaws.com/files.d20.io/images/279800986/SqFez5dbn2roAsokDaBAPw/thumb.jpg?1649536002',bodyimg:'https://s3.amazonaws.com/files.d20.io/images/279800959/KyHThjxjXeZQ-b_uC6yCjQ/thumb.jpg?1649535995'},
+ spell: {outer:'black',outerpad:'',shadow:'rgba(0,0,0,0) 0px 0px',titlebox:'transparent',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'20% 10% 2px 10%',bodypad:'4px 12% 5% 12%',bodybox:'',rowbox:'purple',rowdark:'transparent',rowdarktext:'black',rowlight:'transparent',rowlighttext:'black',rowpad:'4px',outerimg:'',titleimg:'https://s3.amazonaws.com/files.d20.io/images/279801150/vQ_1KKR72-7DTAusJzkt0w/thumb.png?1649536043',bodyimg:'https://s3.amazonaws.com/files.d20.io/images/279801125/opM7Y6m20DGLPeP-hrXpCA/thumb.png?1649536037'},
+ potion: {outer:'black',outerpad:'',shadow:'rgba(0,0,0,0) 0px 0px',titlebox:'transparent',titletext:'black; text-shadow: 1px 1px 1px gray',titlepad:'60% 10% 2px 10%',bodypad:'10% 5% 15% 8%',bodybox:'',rowbox:'mediumturquoise',rowdark:'transparent',rowdarktext:'white',rowlight:'transparent',rowlighttext:'white',rowpad:'4px',outerimg:'',titleimg:'https://s3.amazonaws.com/files.d20.io/images/279798022/Qgs1fGmOup8_9mtzoEeSxw/thumb.png?1649535031',bodyimg:'https://s3.amazonaws.com/files.d20.io/images/279798050/hQ4nWnVGPDINtjidt8-1eg/thumb.png?1649535040'},
+ weapon: {outer:'yellow',outerpad:'',shadow:'rgba(0,0,0,0) 0px 0px',titlebox:'transparent',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'5% 5% 2px 5%',bodypad:'4px 5% 10% 10%',bodybox:'',rowbox:'purple',rowdark:'transparent',rowdarktext:'black; text-shadow: 1px 1px 1px white',rowlight:'transparent',rowlighttext:'black; text-shadow: 1px 1px 1px white',rowpad:'4px',outerimg:'https://s3.amazonaws.com/files.d20.io/images/279722596/LxsTe-cbwk5j9L0ipM3GLw/thumb.jpg?1649510600',titleimg:'',bodyimg:'https://s3.amazonaws.com/files.d20.io/images/257648113/iUlG62xcBc6AdUj5lv32Ww/max.png?1638047575'},
+ attack: {outer:'purple',outerpad:'',shadow:'rgba(0,0,0,0.4) 3px 3px',titlebox:'4px solid maroon',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'4px 4px 1px 4px',bodypad:'0px',bodybox:'4px solid gray',rowbox:'none',rowdark:'white',rowdarktext:'black',rowlight:'white',rowlighttext:'black',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',dmgslabel:'S/M',dmgllabel:'L'},
+ menu: {outer:'black',outerpad:'',shadow:'rgba(0,0,0,0.4) 3px 3px',titlebox:'blue',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'',rowbox:'teal',rowdark:'lightblue',rowdarktext:'black',rowlight:'lightcyan',rowlighttext:'black',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:''},
+ message: {outer:'black',outerpad:'',shadow:'rgba(0,0,0,0.4) 3px 3px',titlebox:'white',titletext:'black',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'1px solid black',rowbox:'',rowdark:'white',rowdarktext:'black',rowlight:'white',rowlighttext:'black',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:''},
+ warning: {outer:'black',outerpad:'',shadow:'rgba(0,0,0,0.4) 3px 3px',titlebox:'crimson',titletext:'white',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'',rowbox:'purple',rowdark:'pink',rowdarktext:'black',rowlight:'mistyrose',rowlighttext:'black',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',rowimg:''},
+ },
+ plain: {
+ def: {outer:'blue',outerpad:'',shadow:'rgba(0,0,0,0.4) 3px 3px',titlebox:'blue',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'',rowbox:'purple',rowdark:'lightblue',rowdarktext:'black',rowlight:'lightcyan',rowlighttext:'black',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',rowimg:''},
+ spell: {outer:'black',outerpad:'',shadow:'rgba(0,0,0,0) 0px 0px',titlebox:'firebrick',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'',rowbox:'purple',rowdark:'pink',rowdarktext:'black',rowlight:'mistyrose',rowlighttext:'black',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',rowimg:''},
+ potion: {outer:'black',outerpad:'',shadow:'rgba(0,0,0,0) 0px 0px',titlebox:'forestgreen',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'',rowbox:'mediumturquoise',rowdark:'khaki',rowdarktext:'black',rowlight:'lightgoldenrodyellow',rowlighttext:'black',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',rowimg:''},
+ weapon: {outer:'yellow',outerpad:'',shadow:'rgba(0,0,0,0) 0px 0px',titlebox:'gray',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'',rowbox:'purple',rowdark:'gainsboro',rowdarktext:'black; text-shadow: 1px 1px 1px white',rowlight:'ghostwhite',rowlighttext:'black; text-shadow: 1px 1px 1px white',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',rowimg:''},
+ attack: {outer:'purple',outerpad:'',shadow:'rgba(0,0,0,0.4) 3px 3px',titlebox:'4px solid maroon',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'4px 4px 1px 4px',bodypad:'0px',bodybox:'4px solid gray',rowbox:'none',rowdark:'white',rowdarktext:'black',rowlight:'white',rowlighttext:'black',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',dmgslabel:'S/M',dmgllabel:'L'},
+ menu: {outer:'black',outerpad:'',shadow:'rgba(0,0,0,0.4) 3px 3px',titlebox:'blue',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'',rowbox:'teal',rowdark:'lightblue',rowdarktext:'black',rowlight:'lightcyan',rowlighttext:'black',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',rowimg:''},
+ message: {outer:'black',outerpad:'',shadow:'rgba(0,0,0,0) 0px 0px',titlebox:'white',titletext:'black',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'1px solid black',rowbox:'',rowdark:'white',rowdarktext:'black',rowlight:'white',rowlighttext:'black',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:''},
+ warning: {outer:'black',outerpad:'',shadow:'rgba(0,0,0,0.4) 3px 3px',titlebox:'crimson',titletext:'white',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'',rowbox:'purple',rowdark:'pink',rowdarktext:'black',rowlight:'mistyrose',rowlighttext:'black',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',rowimg:''},
+ },
+ dark: {
+ def: {outer:'darkgoldenrod',outerpad:'',shadow:'rgba(0,0,0,0.4) 3px 3px',titlebox:'blue',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'',rowbox:'purple',rowdark:'navy',rowdarktext:'white',rowlight:'blueviolet',rowlighttext:'white',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',rowimg:''},
+ spell: {outer:'black',outerpad:'',shadow:'rgba(0,0,0,0) 0px 0px',titlebox:'firebrick',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'',rowbox:'purple',rowdark:'darkmagenta',rowdarktext:'white',rowlight:'darkorchid',rowlighttext:'white',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',rowimg:''},
+ potion: {outer:'black',outerpad:'',shadow:'rgba(0,0,0,0) 0px 0px',titlebox:'forestgreen',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'',rowbox:'mediumturquoise',rowdark:'darkgoldenrod',rowdarktext:'white; text-shadow: 1px 1px 1px black',rowlight:'goldenrod',rowlighttext:'white; text-shadow: 1px 1px 1px black',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',rowimg:''},
+ weapon: {outer:'darkgoldenrod',outerpad:'',shadow:'rgba(0,0,0,0) 0px 0px',titlebox:'gray',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'',rowbox:'purple',rowdark:'dimgray',rowdarktext:'white; text-shadow: 1px 1px 1px black',rowlight:'darkgray',rowlighttext:'white; text-shadow: 1px 1px 1px black',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',rowimg:''},
+ attack: {outer:'purple',outerpad:'',shadow:'rgba(0,0,0,0.4) 3px 3px',titlebox:'4px solid maroon',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'4px 4px 1px 4px',bodypad:'0px',bodybox:'4px solid gray',rowbox:'none',rowdark:'dimgray',rowdarktext:'white; text-shadow: 1px 1px 1px black',rowlight:'dimgray',rowlighttext:'white; text-shadow: 1px 1px 1px black',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',dmgslabel:'S/M',dmgllabel:'L'},
+ menu: {outer:'black',outerpad:'',shadow:'rgba(0,0,0,0.4) 3px 3px',titlebox:'blue',titletext:'white; text-shadow: 1px 1px 1px gray',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'',rowbox:'teal',rowdark:'navy',rowdarktext:'white',rowlight:'blueviolet',rowlighttext:'white',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',rowimg:''},
+ message: {outer:'white',outerpad:'',shadow:'rgba(0,0,0,0) 0px 0px',titlebox:'black',titletext:'white',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'1px solid white',rowbox:'',rowdark:'black',rowdarktext:'white',rowlight:'black',rowlighttext:'white',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:''},
+ warning: {outer:'black',outerpad:'',shadow:'rgba(0,0,0,0.4) 3px 3px',titlebox:'crimson',titletext:'white',titlepad:'1px 1px 1px 1px',bodypad:'4px 4px 4px 4px',bodybox:'',rowbox:'purple',rowdark:'darkmagenta',rowdarktext:'white',rowlight:'darkorchid',rowlighttext:'white',rowpad:'4px',outerimg:'',titleimg:'',bodyimg:'',rowimg:''},
+ }
+ });
+
+ const acImg = 'https://s3.amazonaws.com/files.d20.io/images/280889787/N6NbbkLDe92C4e5DDtmkaw/thumb.png?1650135426';
+ const dmgImg = 'https://s3.amazonaws.com/files.d20.io/images/280890292/ZBDEOKwQHCPeY2yQJuhkeA/thumb.png?1650135612';
+ const hpImg = 'https://s3.amazonaws.com/files.d20.io/images/281063429/1ySUC06qy_MuhY-_Be_pVQ/thumb.png?1650223020';
+ const slashImg = 'https://s3.amazonaws.com/files.d20.io/images/281331848/XnspIFctdnld8LVG3_m5RQ/thumb.png?1650393752';
+ const pierceImg = 'https://s3.amazonaws.com/files.d20.io/images/281331832/DYgW_xqlORNJ77oigkFqAA/thumb.png?1650393745';
+ const bludgeonImg = 'https://s3.amazonaws.com/files.d20.io/images/281331818/rSZVRXYkRNR4K9Ru6CXbVw/thumb.png?1650393737';
+ const sacImg = 'https://s3.amazonaws.com/files.d20.io/images/281054605/oNYktYKEmF9_ngePXyUcPw/thumb.png?1650219538';
+ const pacImg = 'https://s3.amazonaws.com/files.d20.io/images/281054578/FeeVqF8X-rgeEP6fg4CWKg/thumb.png?1650219526';
+ const bacImg = 'https://s3.amazonaws.com/files.d20.io/images/281054552/-i1SuQ4Rx1OO7cXPtlggNg/thumb.png?1650219515';
+ const heart = ['https://s3.amazonaws.com/files.d20.io/images/281063429/1ySUC06qy_MuhY-_Be_pVQ/thumb.png?1650223020',
+ 'https://s3.amazonaws.com/files.d20.io/images/281334582/74iFWTTF47pFyvmGd1WWnw/thumb.png?1650395033',
+ 'https://s3.amazonaws.com/files.d20.io/images/281334596/8yhpUHhYL7bQIlLZfHGqjw/thumb.png?1650395041',
+ 'https://s3.amazonaws.com/files.d20.io/images/281334612/FpyTBj_oaJS6_GaZmlsfvA/thumb.png?1650395047',
+ 'https://s3.amazonaws.com/files.d20.io/images/281334628/-4nbQ36qch58EK0BWgytRA/thumb.png?1650395055',
+ 'https://s3.amazonaws.com/files.d20.io/images/281334655/OH7HS1U-xYFUTJjIAypqFQ/thumb.png?1650395061',
+ 'https://s3.amazonaws.com/files.d20.io/images/281334666/CByDv4kCKWcaV9LabxwV-A/thumb.png?1650395067',
+ 'https://s3.amazonaws.com/files.d20.io/images/281334682/xbcpGhbmeEAf3ZmKEgs3Ow/thumb.png?1650395074',
+ 'https://s3.amazonaws.com/files.d20.io/images/281334693/xTlsD3NHddK4g3-nlQVCDg/thumb.png?1650395080'
+ ];
+/* var handoutIDs = {
+ AttackMasterHelp: '',
+ AttacksDatabaseHelp: '',
+ ClassDatabaseHelp: '',
+ CommandMasterHelp: '',
+ EffectsDatabaseHelp: '',
+ InitiativeMasterHelp: '',
+ MagicDatabaseHelp: '',
+ MagicMasterHelp: '',
+ RPGMasterCharSheetSetup: '',
+ RoundMasterHelp: '',
+ RPGMasterTemplatesHelp: '',
+ WeaponArmourDatabaseHelp: '',
+ };
+*/ var DBindex;
+ var classesParsed = false;
+ var magicList = {};
+ var RPGMap = {};
+ var apis = {magic:false,attk:false,init:false};
+ var lastMsg = [];
+ var doneRNmsg = false;
+ var waitList = {};
+ var msg_orig = {};
+
+ const isString = (s) => 'string' === typeof s || s instanceof String;
+ const isArray = (a) => Array.isArray(a);
+ const flatten = (a) => isArray(a) ? a.reduce((m,e)=>[...m, ...flatten(e)],[]) : [a];
+
+ /**
+ * In the inline roll evaluator from ChatSetAttr script v1.9
+ * by Joe Singhaus and C Levett.
+ **/
+
+ var processInlinerolls = function (msg) {
+ if (msg.inlinerolls && msg.inlinerolls.length) {
+ return msg.inlinerolls.map(v => {
+ const ti = v.results.rolls.filter(v2 => v2.table)
+ .map(v2 => v2.results.map(v3 => v3.tableItem.name).join(", "))
+ .join(", ");
+ return (ti.length && ti) || v.results.total || 0;
+ })
+ .reduce((m, v, k) => m.replace(new RegExp('\\$\\[\\['+k+'\\]\\]','img'),'[['+v+'['+msg.inlinerolls[k].expression+'] ]]'), msg.content);
+ } else {
+ return msg.content;
+ }
+ };
+
+ /*
+ * Check the version of a Character Sheet database against
+ * the current version in the API. Delete old versions so
+ * API versions are used and indexed.
+ */
+
+ var del_Old_DBs = function() {
+
+ var update = false;
+
+ _.each( dbNames, (db,dbName) => {
+ let dbFullName = dbName.replace(/_/g,'-'),
+ dbCS = findObjs({ type:'character', name:dbFullName },{caseInsensitive:true}),
+ dbVersion = 0.0,
+ msg, versionObj;
+
+ if (!dbCS || !dbCS.length) return;
+
+ dbCS = dbCS[0];
+
+ if (_.isUndefined(LibFunctions.attrLookup( dbCS, fields.dbVersion ))) {
+ setTimeout( () => del_Old_DBs(), 5000 );
+ return;
+
+ } else {
+
+ dbVersion = parseFloat(LibFunctions.attrLookup( dbCS, fields.dbVersion )) || dbVersion;
+
+ if (dbVersion >= (parseFloat(db.version) || 0)) return;
+
+ log('Deleting '+dbFullName+' v'+dbVersion);
+ dbCS.remove();
+ update = true;
+ }
+ });
+ if (update) LibFunctions.updateDBindex();
+ return;
+ }
+
+ /*
+ * Clear any waiting timer action saved in the playerConfig
+ */
+
+ var clearWaitTimer = function(pid) {
+ if (pid && waitList[pid]) {
+// log('clearWaitTimer: user '+(getObj('player',pid)?getObj('player',pid).get('_displayname'):'none')+' clearing wait message');
+ clearTimeout(waitList[pid]);
+ waitList[pid] = undefined;
+ } else if (!pid) {
+// log('clearWaitList: defined length = '+_.size(waitList));
+ _.each(waitList,w=>clearTimeout(w));
+ waitList = {};
+ }
+ return;
+ };
+
+
+ /*
+ * Function to generate unique IDs for creating objects in Roll20
+ */
+
+ const generateUUID = function () {
+ var a = 0,
+ b = [];
+ return function () {
+ var c = (new Date()).getTime() + 0,
+ d = c === a;
+ a = c;
+ for (var e = new Array(8), f = 7; 0 <= f; f--) {
+ e[f] = "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".charAt(c % 64);
+ c = Math.floor(c / 64);
+ }
+ c = e.join("");
+ if (d) {
+ for (f = 11; 0 <= f && 63 === b[f]; f--) {
+ b[f] = 0;
+ }
+ b[f]++;
+ } else {
+ for (f = 0; 12 > f; f++) {
+ b[f] = Math.floor(64 * Math.random());
+ }
+ }
+ for (f = 0; 12 > f; f++) {
+ c += "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".charAt(b[f]);
+ }
+ return c;
+ };
+ }();
+ const generateRowID = function () {
+ return generateUUID().replace(/_/g, "Z");
+ };
+
+ /**
+ * Find the GM, generally when a player can't be found
+ */
+
+ var findTheGM = function() {
+ var playerGM,
+ players = findObjs({ _type:'player' });
+
+ if (players.length !== 0) {
+ if (!_.isUndefined(playerGM = _.find(players, function(p) {
+ var player = p;
+ if (player) {
+ if (playerIsGM(player.id)) {
+ return player.id;
+ }
+ }
+ }))) {
+ return playerGM.id;
+ }
+ }
+ return undefined;
+ }
+
+ /*
+ * Display a message with a link to the Release Notes
+ */
+
+ var displayReleaseNotesLink = function() {
+ var handoutIDs = LibFunctions.getHandoutIDs();
+ if (!doneRNmsg) {
+ doneRNmsg = true;
+ LibFunctions.sendFeedback(waitMsgDiv+'You can read the latest **[Release Notes here]('+fields.journalURL+handoutIDs.RPGMReleaseNotes+')**, version '+handouts.RPGM_Release_Notes.version+' updated '+(new Date(lastUpdate*1000).toDateString())+'
');
+ }
+ }
+
+ String.prototype.dbName = function() {
+ return this.toLowerCase().replace(reIgnore,'');
+ }
+
+ String.prototype.dispName = function() {
+ return (this || '').replace(/[-_]/g,' ');
+ }
+
+ String.prototype.hyphened = function() {
+ return (this || '').replace(/\s/g,'-');
+ }
+
+ String.prototype.trueCompare = function(txt) {
+ return (this || '').dbName() === (toString(txt) || '').dbName();
+ }
+
+ class AbilityObj {
+ constructor( dBname, abilityObj, ctObj, source ) {
+ this.dB = dBname;
+ this.obj = abilityObj;
+ this.ct = ctObj;
+ this.source = source;
+ this.api = (abilityObj && abilityObj[1]) ? (abilityObj[1].body.trim()[0] == '!') : false;
+ }
+
+ specs(re = reSpecs) {
+ let specStr = this.obj[1].body.match(re);
+ return specStr ? [...('['+specStr[0]+']').matchAll(reSpecsAll)] : undefined;
+ }
+ data(re = reData) {
+ let specStr = this.obj[1].body.match(re);
+ return specStr ? [...('['+specStr[0]+']').matchAll(reDataAll)] : undefined;
+ }
+ hands(re = reSpecs) {
+ let specStr = this.obj[1].body.match(re);
+ return specStr ? [...('['+specStr[0]+']').matchAll(reHands)].concat([...('['+specStr[0]+']').matchAll(reHands2)] || []) : undefined;
+ }
+ }
+
+ class CharTable {
+ constructor( property, attrs, defaultVal ) {
+ if (!property || !isArray(property) || property.length < 2) throw {name:'libRPGMaster Error',message:'Invalid attribute definition in table constructor'};
+ this.property = property;
+ this.attrs = attrs || {};
+ this.defaultVal = defaultVal || {current:'',max:''};
+ }
+ }
+
+ class CharTableArray {
+ constructor( character, table, col ) {
+ if (!character) throw {name:'libRPGMaster Error',message:'Invalid character object in table constructor'};
+ if (!table || !isArray(table) || table.length < 2) throw {name:'libRPGMaster Error',message:'Invalid table definition in table constructor'};
+ this.character = character;
+ this.table = table;
+ this.tableType;
+ this.fieldGroup;
+// this.values = [new Set()];
+ this.values = {};
+ this.sortKeys;
+ this.col = (_.isUndefined(col) || _.isNull(col) || (table && !_.isNull(table) && !table[1] && col && col==1)) ? '' : col;
+ }
+
+ /*
+ * A method to get the whole of a repeating table in
+ * two parts: an array of objects indexed by Roll20 object IDs,
+ * and an array of object IDs indexed by repeating table row number.
+ * Returns an object containing the table, and all parameters defining
+ * that table and where it came from.
+ */
+
+ addTable(attrDef,defaultVal,caseSensitive) {
+ if (_.isUndefined(attrDef) || !isArray(attrDef) || attrDef.length < 2) throw {name:'libRPGMaster Error',message:'No table attribute supplied for '+this.table[0]};
+ let rowName, name = attrDef[0];
+ if (this.table && !_.isNull(this.table)) {
+ rowName = this.table[0]+this.col+'_$0_'+attrDef[0]+this.col;
+ } else {
+ rowName = name;
+ }
+
+ if (_.isUndefined(defaultVal)) {
+ defaultVal=attrDef[2];
+ }
+
+ if (!this.hasOwnProperty(name)) {
+ this[name] = new CharTable( attrDef );
+ }
+ this[name].defaultVal[attrDef[1]] = defaultVal;
+ let match=rowName.match(/^(repeating_.*)_\$(\d+)_.*$/);
+ if(match){
+ let createOrderKeys=[],
+ attrMatcher=new RegExp(`^${rowName.replace(/_\$\d+_/,'_([-\\da-zA-Z]+)_')}$`,(caseSensitive?'i':'')),
+ attrs=_.chain(findObjs({type:'attribute', characterid:this.character.id}))
+ .map((a)=>{
+ return {attr:a,match:a.get('name').match(attrMatcher)};
+ })
+ .filter((o)=>o.match)
+ .each((o)=>createOrderKeys.push(o.match[1]))
+ .reduce((m,o)=>{ m[o.match[1]]=o.attr; return m;},{})
+ .value(),
+ sortOrderKeys = _.chain( ((findObjs({
+ type:'attribute',
+ characterid:this.character.id,
+ name: `_reporder_${match[1]}`
+ })[0]||{get:_.noop}).get('current') || '' ).split(/\s*,\s*/))
+ .intersection(createOrderKeys)
+ .union(createOrderKeys)
+ .value();
+
+ if (_.isUndefined(this.sortKeys)) {
+ this.sortKeys = sortOrderKeys;
+ } else {
+ this.sortKeys = (sortOrderKeys.length > this.sortKeys.length) ? sortOrderKeys.concat(_.difference(this.sortKeys,sortOrderKeys)) : this.sortKeys.concat(_.difference(sortOrderKeys,this.sortKeys));
+ }
+ this[name].attrs=attrs;
+ if (_.isUndefined(this.values[attrDef[0]])) {
+ this.values[attrDef[0]] = Object.create({current:'',max:''});
+ }
+ this.values[attrDef[0]][attrDef[1]] = attrDef[2] || '';
+ } else {
+ this[name].attrs=[];
+ if (_.isUndefined(this.sortKeys)) {
+ this.sortKeys = [];
+ }
+ }
+ return this;
+ }
+
+ /*
+ * Find all the necessary tables to manage a repeating
+ * section of a character sheet. Dynamically driven by
+ * the table field definitions in the 'fields' object.
+ */
+
+ addAllTables( fieldGroup, caseSensitive ) {
+
+ var rows = {};
+
+ this.fieldGroup = fieldGroup;
+ this.values = {};
+ _.each( fields, (elem,key) => {
+ if (key.startsWith(fieldGroup)
+ && ['current','max'].includes(String(elem[1]).toLowerCase())) {
+ rows[key]=elem;
+ };
+ });
+ _.each(rows, (elem,key) => {
+ this.addTable( elem, elem[2], caseSensitive );
+ });
+ return this;
+ }
+
+ /**
+ * A function to take a table obtained using getTableField() and a row number, and
+ * safely return the value of the table row, or undefined. Uses the table object
+ * parameters such as the character object it came from and the field property.
+ * If the row entry is undefined use a default value if set in the getTableField() call,
+ * which can be overridden with an optional parameter. Can just return the row
+ * object or can return a different property of the object using the second optional parameter.
+ */
+
+ tableLookup( attrDef, index, defVal, retObj ) {
+
+ if (!attrDef || !isArray(attrDef) || attrDef.length < 2) throw {name:'libRPGMaster Error',message:'No table attribute supplied for '+this.table[0]};
+ var val, name = attrDef[0];
+ if (_.isUndefined(retObj)) {
+ retObj=false;
+ } else if (retObj === true) {
+ defVal=false;
+ }
+ if (_.isUndefined(defVal)) {
+ defVal=true;
+ }
+ if (this[name]) {
+ let property = (retObj === true) ? null : ((retObj === false) ? attrDef : retObj);
+ defVal = (defVal===false) ? (undefined) : ((defVal===true) ? this[name].defaultVal[attrDef[1]] : defVal);
+ if (index>=0) {
+ let attrs = this[name].attrs,
+ sortOrderKeys = this.sortKeys;
+ if (index
{
+ if (_.isUndefined(elem.attrs)) return;
+ currentVal = (!rowVals || _.isUndefined(rowVals[key])) ? elem.defaultVal['current'] : rowVals[key]['current'];
+ maxVal = (!rowVals || _.isUndefined(rowVals[key])) ? elem.defaultVal['max'] : rowVals[key]['max'];
+ this.tableSet( [key,'current'], index, currentVal );
+ this.tableSet( [key,'max'], index, maxVal );
+ });
+ } else {
+ if (index > this.sortKeys.length) {
+ this.addTableRow( index-1, undefined );
+ }
+ let rowObjID = generateRowID();
+ let namePt1 = this.table[0]+this.col+'_'+rowObjID+'_';
+ let gotVals = !!rowVals && _.pairs(rowVals).length > 0;
+ _.each( list, (elem,key) => {
+ if (_.isUndefined(elem.attrs)) return;
+ rowObj = createObj( "attribute", {characterid: this.character.id, name: (namePt1+key+this.col)} );
+ if (!gotVals) {
+ newVal = _.isUndefined(this.values[key]) ? elem.defaultVal : this.values[key] ;
+ } else {
+ newVal = rowVals[key];
+ }
+ rowObj.set(newVal);
+ this[key].attrs[rowObjID] = rowObj;
+ this.sortKeys[index] = rowObjID;
+ });
+ }
+ return this;
+ }
+
+ /*
+ * A function to find the index of a matching entry in a table
+ */
+
+ tableFind( attrDef, val ) {
+
+ val = val.dbName() || '-';
+ let property = attrDef[1];
+ if ((this.table[1] < 0) && val == (LibFunctions.attrLookup( this.character, attrDef ).dbName() || '-')) {
+ return -1;
+ }
+ let tableIndex = this.sortKeys.indexOf(
+ _.findKey(this[attrDef[0]].attrs, function( elem, objID ) {
+ return val == (elem.get(property).dbName() || '-');
+ })
+ );
+ return (tableIndex >= 0) ? tableIndex : undefined;
+ }
+
+ /*
+ * A function to set all rows of just one field of a table to
+ * a provided value, or its default if value not provided
+ */
+
+ tableDefault( attrDef, val ) {
+ if (!attrDef || !isArray(attrDef) || attrDef.length < 2) throw {name:'libRPGMaster Error',message:'No table attribute supplied for '+this.table[0]};
+ if (_.isUndefined(val) || _.isNull(val)) val = this[attrDef[0]].defaultVal[attrDef[1]];
+ if (!this[attrDef[0]]) throw {name:'libRPGMaster Error',message:'Invalid table attribute '+attrDef[0]+' supplied for '+this.table[0]};
+ _.each(this[attrDef[0]].attrs, obj => {
+ obj.set(attrDef[1],val);
+ });
+ return this;
+ }
+
+ /*
+ * Make a copy of the default values for the table
+ */
+
+ copyValues() {
+ let newValues = {};
+ _.each( this.values, (v,k) => newValues[k] = Object.create(v));
+ return newValues;
+ }
+
+ }
+
+ class CSdbIndex {
+ constructor() {
+ this.mu_spells_db = {};
+ this.pr_spells_db = {};
+ this.powers_db = {};
+ this.mi_db = {};
+ this.race_db = {};
+ this.class_db = {};
+ this.attacks_db = {};
+ }
+ }
+
+
+ class LibFunctions {
+
+ static init(){
+
+ /** ------------------------------- Table Management ---------------------------- **/
+
+ /*
+ * A function to get the whole of a repeating table in
+ * two parts: an array of objects indexed by Roll20 object IDs,
+ * and an array of object IDs indexed by repeating table row number.
+ * Returns an object containing the table, and all parameters defining
+ * that table and where it came from.
+ */
+
+ LibFunctions.getTableField = function(character,tableObj,tableDef,attrDef,col,defaultVal,caseSensitive) {
+ if (_.isUndefined(tableObj) || _.isUndefined(tableObj.table)) tableObj = new CharTableArray( character, tableDef, col );
+ tableObj.addTable( attrDef, defaultVal, caseSensitive );
+ return tableObj;
+ }
+
+ /*
+ * Find all the necessary tables to manage a repeating
+ * section of a character sheet. Dynamically driven by
+ * the table field definitions in the 'fields' object.
+ */
+
+ LibFunctions.getTable = function( character, fieldGroup, col, tableObj, caseSensitive ) {
+ let tableDef = fieldGroup.tableDef;
+ if (_.isUndefined(tableObj) || _.isUndefined(tableObj.table)) tableObj = new CharTableArray( character, tableDef, col );
+ tableObj.addAllTables( fieldGroup.prefix, caseSensitive );
+ return tableObj;
+ }
+ /*
+ * Get all tables in a particular numbered group of tables,
+ * based not on columns but on a numbered sequence of prefixes
+ */
+
+ LibFunctions.getLvlTable = function( character, fieldGroup, lvl, tableObj, caseSensitive ) {
+ if (_.isUndefined(lvl) || _.isNull(lvl)) lvl = '';
+ let tableDef = [fieldGroup.tableDef[0]+lvl,fieldGroup.tableDef[1]];
+ if (_.isUndefined(tableObj) || _.isUndefined(tableObj.table)) tableObj = new CharTableArray( character, tableDef, null );
+ tableObj.addAllTables( fieldGroup.prefix, caseSensitive );
+ return tableObj;
+ }
+
+ /*
+ * Function to initialise a values[] array to hold data for
+ * setting a table row to.
+ */
+
+ LibFunctions.initValues = function( fieldGroup ) {
+
+// let values = [new Set()];
+ let values = {};
+ let rows = _.filter( fields, (elem,f) => {return f.startsWith(fieldGroup)})
+ .map(elem => {
+ if (_.isUndefined(values[elem[0]])) {
+ values[elem[0]] = {current:'',max:''};
+ }
+ values[elem[0]][elem[1]] = elem[2] || '';
+ });
+ return values;
+ }
+
+ /** ------------------------ Attribute Management ------------------------------ **/
+
+ /**
+ * A function to return the handle for the 'fields' object for the represented
+ * character sheet mapping, and an object of handles for other game-specific values.
+ **/
+
+ LibFunctions.getRPGMap = function() {
+ RPGMap.dbNames = dbNames;
+ RPGMap.fieldGroups = fieldGroups;
+ RPGMap.miTypeLists = miTypeLists;
+ RPGMap.clTypeLists = clTypeLists;
+ RPGMap.spTypeLists = spTypeLists;
+ RPGMap.baseThac0table = baseThac0table;
+ RPGMap.spellsPerLevel = spellsPerLevel;
+ RPGMap.spellLevels = spellLevels;
+ RPGMap.specMU = specMU;
+ RPGMap.ordMU = ordMU;
+ RPGMap.wisdomSpells = wisdomSpells;
+ RPGMap.casterLevels = casterLevels;
+ RPGMap.primeClasses = primeClasses;
+ RPGMap.classLevels = classLevels;
+ RPGMap.rangedWeapMods = rangedWeapMods;
+ RPGMap.saveLevels = saveLevels;
+ RPGMap.baseSaves = baseSaves;
+ RPGMap.classSaveMods = classSaveMods;
+ RPGMap.raceSaveMods = raceSaveMods;
+ RPGMap.defaultNonProfPenalty = defaultNonProfPenalty;
+ RPGMap.classNonProfPenalty = classNonProfPenalty;
+ RPGMap.raceToHitMods = raceToHitMods;
+ RPGMap.classAllowedWeaps = classAllowedWeaps;
+ RPGMap.classAllowedArmour = classAllowedArmour;
+ RPGMap.weapMultiAttks = weapMultiAttks;
+ RPGMap.punchWrestle = punchWrestle;
+ RPGMap.saveFormat = saveFormat;
+ RPGMap.reSpellSpecs = reSpellSpecs;
+ RPGMap.reClassSpecs = reClassSpecs;
+ RPGMap.reAttr = reAttr;
+ return [fields,RPGMap];
+ }
+
+ /**
+ * A function to lookup the value of any attribute, including repeating rows, without errors
+ * thus avoiding the issues with getAttrByName()
+ *
+ * Thanks to The Aaron for this, which I have modded to split and
+ * allow tables to be loaded once rather than multiple times.
+ */
+
+ LibFunctions.attrLookup = function(character,attrDef,tableDef,r,c='',caseSensitive=false, defVal=true) {
+ let name, match,
+ property = attrDef[1];
+
+ if (tableDef && isNaN(r)) return undefined;
+
+ if (tableDef && (tableDef[1] || r >= 0)) {
+ c = (tableDef[1] || c != 1) ? c : '';
+ name = tableDef[0] + c + '_$' + r + '_' + attrDef[0] + c;
+ } else {
+ name = attrDef[0];
+ }
+ defVal = (defVal === false ? undefined : (defVal === true ? attrDef[2] : defVal));
+ if (!_.isUndefined(defVal)) defVal = String(defVal);
+ match=name.match(/^(repeating_.*)_\$(\d+)_.*$/);
+ if(match){
+ let index=match[2];
+ let tableObj = new CharTableArray( character, tableDef, c );
+ tableObj.addTable(attrDef,null,caseSensitive);
+ return tableObj.tableLookup(attrDef,index,false,!attrDef[1]);
+ } else {
+ let attrObj = findObjs({ type:'attribute', characterid:character.id, name:name}, {caseInsensitive: !caseSensitive});
+ if (!attrObj || attrObj.length == 0) {
+ return (_.isUndefined(property) || _.isNull(property)) ? undefined : defVal;
+ } else if (_.isUndefined(property) || _.isNull(property)) {
+ return getObj('attribute',attrObj[0].id);
+ } else {
+ let value = getObj('attribute',attrObj[0].id).get(property);
+ return (_.isUndefined(value) ? defVal : String(value));
+ }
+ }
+ }
+
+ /**
+ * Check that an attribute exists, set it if it does, or
+ * create it if it doesn't using !setAttr
+ **/
+
+ LibFunctions.setAttr = function( character, attrDef, attrValue, tableDef, r, c, caseSensitive ) {
+
+ var name, attrObj, match;
+
+ if (_.isUndefined(attrDef)) {log('setAttr attrDef undefined:'+attrDef);return undefined;}
+ try {
+ name = attrDef[0];
+ } catch {
+ return undefined;
+ }
+
+ if (tableDef && (tableDef[1] || r >= 0)) {
+ c = (c && (tableDef[1] || c != 1)) ? c : '';
+ name = tableDef[0] + c + '_$' + r + '_' + attrDef[0] + c;
+ } else {
+ name = attrDef[0];
+ }
+ match=name.match(/^(repeating_.*)_\$(\d+)_.*$/);
+ if(match){
+ let tableObj = new CharTableArray( character, tableDef, c );
+ tableObj.addTable(attrDef,null,caseSensitive);
+ if (tableObj) {
+ attrObj = tableObj.tableLookup(attrDef,r,false,true);
+ }
+ } else {
+ attrObj = LibFunctions.attrLookup( character, [name, null], null, null, null, caseSensitive );
+ if (!attrObj) {
+ attrObj = createObj( 'attribute', {characterid:character.id, name:attrDef[0], current:'', max:''} );
+ }
+ };
+ if (attrObj) {
+ if (_.isUndefined(attrValue)) attrValue = _.isUndefined(attrDef[2]) ? '' : attrDef[2];
+ if (attrDef[3]) {
+ attrObj.setWithWorker(attrDef[1],String(attrValue));
+ } else {
+ attrObj.set(attrDef[1],String(attrValue));
+ }
+ }
+ return attrObj;
+ }
+
+ /** --------------------------- Ability Management Functions ------------------------------ **/
+
+ /**
+ * Find an ability macro with the specified name in any
+ * macro database with the specified root name, returning
+ * the database name, and the matching "ct-" object.
+ * If can't find a matching ability macro or "ct-" object
+ * then return undefined objects
+ * RED v2.044: Updated to use a database index of object IDs
+ * to speed up lookups.
+ **/
+
+ LibFunctions.abilityLookup = function( rootDB, ability, charCS, silent=false, def=true, isGM=false, trueAbility='' ) {
+
+ var charID, obj, ct, db, spells, items, objIndex, abilityName,
+ trueAbilityName = (trueAbility || '').dbName(),
+ source = 'charDB',
+ notFound = false,
+ abilityObj = [],
+ ctObj = [],
+ rDB = rootDB.toLowerCase().replace(/-/g,'_');
+
+ if (_.isUndefined(DBindex[rDB])) {
+ for (db of _.keys(DBindex)) {
+ if (rDB.startsWith(db)) {
+ rDB = db;
+ break;
+ }
+ }
+ }
+ if (!ability || ability.length==0 || ability === '-') {
+ return (!def ? new AbilityObj( rootDB, undefined, undefined, undefined) : new AbilityObj( rDB, [undefined,blankItem], [undefined,0], 'apiDB'));
+ }
+
+ do {
+ abilityName = (ability || '').dbName();
+ if (!_.isUndefined(DBindex[rDB]) && !_.isUndefined(DBindex[rDB][abilityName])) {
+ objIndex = DBindex[rDB][abilityName];
+ if (objIndex[0].length) {
+ obj = getObj('ability',objIndex[0]);
+ }
+ }
+ if (charCS && (!objIndex || (objIndex[0].length && !obj))) {
+ obj = findObjs({ type:'ability', characterid:charCS.id, name:(ability.replace(/\s/g,'-')) });
+ if (obj && obj.length) {
+ source = 'sheet';
+ obj = obj[0];
+ objIndex = [];
+ objIndex.push(obj.id);
+ ct = findObjs({ type:'attribute', characterid:charCS.id, name:'ct-'+ability });
+ }
+ }
+ notFound = notFound || (!objIndex || (objIndex[0].length && !obj));
+ if (notFound) ability = trueAbility;
+ } while (notFound && abilityName !== trueAbilityName && ability && ability.length);
+
+ if (!objIndex || (objIndex[0].length && !obj)) {
+ if (!silent) log('Not found ability '+abilityName+' in any '+rootDB+' database');
+ return new AbilityObj( rootDB, undefined, undefined, undefined);
+ } else if (!objIndex[0].length) {
+ source = 'apiDB';
+ db = rootDB;
+ obj = dbNames[objIndex[2]].db[objIndex[3]];
+ obj.body = LibFunctions.parseStr(obj.body,dbReplacers);
+ abilityObj = [undefined,obj];
+ ctObj = [undefined,obj.ct];
+ } else {
+ charID = obj.get('characterid');
+ db = getObj('character',charID).get('name');
+ spells = db.startsWith(fields.MU_SpellsDB) || db.startsWith(fields.PR_SpellsDB) || db.startsWith(fields.Powers_DB);
+ items = db.startsWith(fields.MagicItemDB);
+ abilityObj[0] = obj;
+ ct = !ct ? getObj('attribute',objIndex[1]) : ct[0];
+ abilityObj[1] = {name:obj.get('name'),
+ type:'',
+ ct:(!ct ? 0 : ct.get('current')),
+ charge:(!ct || spells ? 'uncharged' : ct.get('max')),
+ cost:(!ct || items ? '0' : ct.get('max')),
+ body:obj.get('action')};
+ ctObj = [ct,abilityObj[1].ct];
+ };
+// if (!notFound && !isGM) abilityObj[1].body = abilityObj[1].body.replace(/{{\s*?Looks Like\s*=.*?}}/img,'');
+ return new AbilityObj( db, abilityObj, ctObj, source );
+ }
+
+ /*
+ * Create or update an ability on a character sheet
+ */
+
+ LibFunctions.setAbility = function( charCS, abilityName, abilityMacro, actionBar=false ) {
+
+ if (!charCS) {log('setAbility error: invalid character sheet');return;}
+ abilityName = !abilityName ? '-' : abilityName.hyphened();
+ var abilityObj = findObjs({type: 'ability',
+ characterid: charCS.id,
+ name: abilityName},
+ {caseInsensitive:true});
+ if (!abilityObj || abilityObj.length == 0) {
+ abilityObj = createObj( 'ability', {characterid: charCS.id,
+ name: abilityName,
+ action: abilityMacro,
+ istokenaction: actionBar});
+ } else {
+ abilityObj = abilityObj[0];
+ abilityObj.set( 'action', abilityMacro );
+ abilityObj.set( 'istokenaction', actionBar );
+ }
+ return abilityObj;
+ }
+
+ /*
+ * Handle displaying an Ability Macro
+ */
+
+ LibFunctions.doDisplayAbility = function( args, selected, senderId, as, img ) {
+ if (!args) return;
+ if (!args[0] && selected && selected.length) {
+ args[0] = selected[0]._id;
+ }
+ if (args.length < 3) {
+ LibFunctions.sendError('Incorrect RPGMaster command syntax',msg_orig[senderId]);
+ return;
+ }
+ if ((charCS = LibFunctions.getCharacter(args[0]))) args.unshift('standard');
+ var cmd = args[0] || 'standard',
+ tokenID = args[1],
+ db = args[2],
+ ability = args[3],
+ diceRoll1 = args[4] || '',
+ diceRoll2 = args[5] || '',
+ targetID = args[6] || '',
+// curToken = getObj('graphic',tokenID),
+// charCS = (curToken ? getObj('character',curToken.get('represents')) : undefined),
+ charCS = LibFunctions.getCharacter(tokenID),
+ targetToken = getObj('graphic',targetID),
+ targetCS = (targetToken ? getObj('character',targetToken.get('represents')) : undefined),
+ abObj, abilityMacro;
+
+ var diceRoll = function( rollTxt ) {
+ if (!rollTxt) return randomInteger(20);
+ var retVal = rollTxt.match(/\d+d\d+/i);
+ retVal = (!retVal) ? parseInt((rollTxt.match(/\((\d+)\)/) || rollTxt.match(/(\d+)/) || [0,randomInteger(20)])[1]) : '[['+retVal+']]';
+ return retVal;
+ };
+
+ if (!charCS) {
+ LibFunctions.sendError('The token identified does not represent a character sheet',msg_orig[senderId]);
+ return;
+ }
+
+ if (db.toLowerCase().includes('-db')) {
+ abObj = LibFunctions.abilityLookup( db, ability, charCS );
+ if (!abObj.obj) {
+ LibFunctions.sendError(('The provided ability does not exist in any '+db+' database'),msg_orig[senderId]);
+ return;
+ }
+ abilityMacro = abObj.obj[1].body;
+ } else {
+ var abilityCS = findObjs({type:'character',_id:db});
+ if (!abilityCS || !abilityCS.length) abilityCS = findObjs({type:'character',name:db}, {caseInsensitive: true});
+ if (abilityCS && abilityCS[0]) {
+ abObj = findObjs({type:'ability',characterid:abilityCS[0].id,name:ability}, {caseInsensitive: true});
+ }
+ if (!abObj || !abObj.length) {
+ LibFunctions.sendError(('Not found ability '+ability+' for character '+db),msg_orig[senderId]);
+ return;
+ }
+ abilityMacro = abObj[0].get('action');
+ }
+ diceRoll1 = diceRoll(diceRoll1);
+ diceRoll2 = diceRoll(diceRoll2);
+
+ abilityMacro = abilityMacro.replace(/\}\}\}/g,'} }}')
+ .replace(/%%diceRoll1%%/img,diceRoll1)
+ .replace(/%%diceRoll2%%/img,diceRoll2)
+ .replace(/@{selected\|token_id}/img,tokenID)
+ .replace(/@{selected/img,'@{'+charCS.get('name'));
+ if (targetToken && targetCS) {
+ let targetHP = LibFunctions.getTokenValue( targetToken, fields.token_HP, fields.HP, null, fields.Thac0_base, false );
+ let targetMaxHP = LibFunctions.getTokenValue( targetToken, fields.token_MaxHP, fields.MaxHP, null, fields.Thac0_base, false );
+ let targetAC = LibFunctions.getTokenValue( targetToken, fields.token_AC, fields.AC, fields.MonsterAC, fields.Thac0_base, false );
+ let tokenName = targetToken.get('name');
+ let targetName = targetCS.get('name');
+ let heart = abilityMacro.match(/\{\{\s*Token[_\s]Heart\s*=.*?\}\}/im);
+ if (heart) {
+ abilityMacro = abilityMacro.replace(heart[0],'{{Token_Heart='+Math.ceil(8*Math.max(0,targetHP.val)/targetMaxHP.val)+'}}');
+ }
+ abilityMacro = abilityMacro.replace(/@\{\s*target\s*\|?[^\{\}]*?\|\s*token_id\s*\}/img,targetID)
+ .replace(/(?:\[\[)?\s*(?:0\s*\+)?\s*@\{target\|?[^\{\}]*?\|hp\|max\}\s*(?:\&\{noerror\})?\s*(?:\]\])?/img,targetMaxHP.val+' ')
+ .replace(/(?:\[\[)?\s*(?:0\s*\+)?\s*@\{target\|?[^\{\}]*?\|hp\}\s*(?:\&\{noerror\})?\s*(?:\]\])?/img,targetHP.val+' ')
+ .replace(new RegExp('(?:\\[\\[)?\\s*(?:0\\s*\\+)?\\s*@\\{target\\|?[^\\{\\}]*?\\|'+targetMaxHP.name+'\\|max\\}\\s*(?:\\&\\{noerror\\})?\\s*(?:\\]\\])?','img'),targetMaxHP.val+' ')
+ .replace(new RegExp('(?:\\[\\[)?\\s*(?:0\\s*\\+)?\\s*@\\{target\\|?[^\\{\\}]*?\\|'+targetHP.name+'\\}\s*(?:\\&\\{noerror\\})?\\s*(?:\\]\\])?','img'),targetHP.val+' ')
+ .replace(/(?:\[\[)?\s*(?:0\s*\+)?\s*@\{target\|?[^\{\}]*?\|ac\}\s*(?:\&\{noerror\})?\s*(?:\]\])?/img,targetAC+' ')
+ .replace(/@\{target\|?[^\{\}]*?\|token_name\}(?:\s*\&\{noerror\})?/img,tokenName+' ');
+ let targetFields = [...abilityMacro.matchAll(/(?:\[\[)?(?:\s*0\s*\+)?\s*(@\{target\|.*?\})\s*(?:\&\{noerror\})?\s*(?:\]\])?/img)];
+ _.each(targetFields, f => abilityMacro = abilityMacro.replace(f[0],f[1]));
+ abilityMacro = abilityMacro.replace(/@\{target\|?[^\{\}]*?\|/img,'@{'+targetName+'|');
+ }
+// if (abilityMacro[0] === '!') {
+// LibFunctions.sendAPI(abilityMacro);
+// } else {
+ switch (cmd.toLowerCase()) {
+ case 'gm':
+ LibFunctions.sendFeedback(abilityMacro, as, img);
+ break;
+ case 'whisper':
+ case 'w':
+ LibFunctions.sendResponse(charCS,abilityMacro,senderId, as, img, tokenID);
+ break;
+ case 'character':
+ case 'c':
+ LibFunctions.sendResponse(charCS,abilityMacro,null, as, img, tokenID);
+ break;
+ case 'standard':
+ case 's':
+ default:
+ abilityMacro = LibFunctions.sendMsgToWho(charCS,senderId,abilityMacro);
+ case 'public':
+ case 'p':
+ LibFunctions.sendPublic(abilityMacro,charCS,senderId);
+ break;
+ }
+// }
+ }
+
+ /*
+ * Wrap abilityLookup() with storing the ability body onto the
+ * identified character sheet, so that it is available for sending
+ * to chat under an API button
+ */
+
+ LibFunctions.getAbility = function( rootDB, name, charCS, silent, isGM, trueName ) {
+ name = (name || '').trim().hyphened();
+ var abObj = LibFunctions.abilityLookup( rootDB, name, charCS, silent, true, isGM, trueName ),
+ extra = false,
+ extraList = [],
+ extraDef = {};
+ if (abObj.obj) {
+ do {
+ extra = abObj.obj[1].body.match(/%{(.+?)\|(.+?)}/);
+ if (extra) {
+ if (!extraList.includes(extra[2].dbName())) {
+ extraList.push(extra[2].dbName());
+ extraDef = LibFunctions.abilityLookup( extra[1], extra[2], charCS, silent );
+ } else {
+ extraDef.obj = undefined;
+ }
+ if (extraDef.obj) {
+ abObj.obj[1].body = abObj.obj[1].body.replace(/%{(.+?)\|(.+?)}/,extraDef.obj[1].body);
+ } else {
+ abObj.obj[1].body = abObj.obj[1].body.replace(/%{(.+?)\|(.+?)}/,'');
+ }
+ }
+ } while (extra && extraDef.obj);
+ trueName = (trueName || '').trim();
+ if (!isGM && trueName && trueName.length && (name.dbName() === trueName.dbName())) {
+ abObj.obj[1].body = abObj.obj[1].body.replace(/{{\s*?Looks\s?Like\s*=/img,'{{Appearance=');
+ }
+ if (charCS) {
+ if (trueName && trueName.length && name.dbName() !== trueName.dbName()) {
+ let cmd = '{{GM Info=[Reveal Now](!magic --button GM-ResetSingleMI|'+charCS.id+'|'+(name)
+ + ' --message gm|'+charCS.id+'|Revealing '+(trueName.dispName())+'|The item '+(trueName.dispName())+' which was hidden as '+(name.dispName())+' has been revealed)';
+ if (/{{\s*GM\s?Info\s*=/im.test(abObj.obj[1].body)) {
+ abObj.obj[1].body = abObj.obj[1].body.replace(/{{\s*GM\s?Info\s*=([^\[])/im,(cmd + ' $1'));
+ } else {
+ abObj.obj[1].body += cmd + '}}';
+ }
+ }
+ abObj.obj[0] = LibFunctions.setAbility( charCS, name, abObj.obj[1].body );
+ LibFunctions.setAttr( charCS, [fields.CastingTimePrefix[0]+name,'current'], abObj.obj[1].ct );
+ LibFunctions.setAttr( charCS, [fields.CastingTimePrefix[0]+name,'max'], abObj.obj[1].charge );
+ abObj.dB = charCS.get('name');
+ }
+ }
+ return abObj;
+ }
+
+ /** -------------------------------------------- send messages to chat ----------------------------------------- **/
+
+ LibFunctions.parseTemplate = function( txt ) {
+// return LibFunctions.parseOutput( '', '', '', txt, null, null, null, false );
+ };
+
+ LibFunctions.redisplayOutput = function(senderId) {
+ if (senderId && senderId.length && !_.isUndefined(lastMsg[senderId])) {
+ let args = [...lastMsg[senderId]];
+ if (args.length > 3) {
+ return LibFunctions.parseOutput( args[0], args[1], args[2], args[3], senderId );
+ }
+ }
+ }
+
+ /*
+ * Parse the standard Roll Template structure for RPGMaster
+ * templates and return the converted text for display in the
+ * chat window.
+ */
+
+ LibFunctions.parseOutput = function( as, preamble, template, txt, senderId ) {
+
+ var isGM = false;
+ if (senderId && senderId.length) {
+ for (const playerId of senderId.split(',')) {
+ lastMsg[playerId] = arguments;
+ isGM = isGM || playerIsGM(playerId);
+ }
+ }
+
+ clearWaitTimer(senderId);
+
+ txt = txt.replace(/}}\s*?k/img,'} }k')
+ .replace(/{{=/img,'{{ =')
+ .replace(/</img,'<')
+ .replace(/>/img,'>')
+ .replace(/{{\s*}}/img,'');
+
+ var colours, colourSet;
+
+ switch (template.toLowerCase()) {
+ case 'rpgmattack':
+ colourSet = 'attack';
+ break;
+ case 'rpgmweapon':
+ case 'rpgmammo':
+ colourSet = 'weapon';
+ break;
+ case 'rpgmpotion':
+ colourSet = 'potion';
+ break;
+ case 'rpgmspell':
+ case 'rpgmitemspell':
+ case 'rpgmwandspell':
+ case 'rpgmscroll':
+ colourSet = 'spell';
+ break;
+ case 'rpgmmenu':
+ colourSet = 'menu';
+ break;
+ case 'rpgmmessage':
+ colourSet = 'message';
+ break;
+ case 'rpgmwarning':
+ colourSet = 'warning';
+ break;
+ case 'rpgmarmour':
+ case 'rpgmitem':
+ case 'rpgmring':
+ case 'rpgmwand':
+ case 'rpgmclass':
+ case 'rpgmdefault':
+ default:
+ colourSet = 'def';
+ break;
+ }
+ if (_.isUndefined(state.MagicMaster) || _.isUndefined(state.attackMaster)) {
+ colours = Object.create(pallet.plain[colourSet]);
+ } else if (!senderId || _.isUndefined(state.MagicMaster.playerConfig) || _.isUndefined(state.MagicMaster.playerConfig[senderId])) {
+ colours = Object.create((state.attackMaster.fancy || state.MagicMaster.fancy) ? pallet.fancy[colourSet] : pallet.plain[colourSet]);
+ } else {
+ let config = state.MagicMaster.playerConfig[senderId];
+ colours = Object.create(config.menuImages ? pallet.fancy[colourSet] : (config.menuDark ? pallet.dark[colourSet] : pallet.plain[colourSet]));
+ }
+ if (template) {
+ const txtObj = _.object([...txt.replace(/[\r\n]/g,'').matchAll(/\{\{(.+?)=(.*?)\}\}/g)].map(v => v.slice(1)).map(v => [v[0].dbName(),v[1]]));
+ _.each( txtObj, (t,k) => {
+ if (!_.isUndefined(colours[k])) {
+ colours[k] = t;
+ txt = txt.replace(new RegExp(`{{\\s*${k}\\s*=.*?}}`,'img'),'');
+ }
+ });
+ };
+ const outerFrame = '';
+ const endOuterFrame = '
';
+ const headerFrame = '';
+ const endHeaderFrame = ' |
';
+ const header1 = '';
+ const endHeader1 = '';
+ const header2 = '';
+ const endHeader2 = '';
+ const subtitle1 = '
';
+ const endSubtitle1 = '';
+ const subtitle2 = '
';
+ const endSubtitle2 = '';
+ const settings = '';
+
+ const bodyFrame = '';
+ const fullBodyFrame = '';
+ const lastBodyFrame = '';
+ const endBodyFrame = ' ';
+ const row1col = ['',
+ ' '];
+ const rowResult = ['',
+ ' '];
+ const endRowResult = ' '
+ const endRow1col = ' ';
+ const rowHeader = ' ';
+ const endRowHeader = ' | ';
+ const rowBodyC = ' ';
+ const endRowBodyC = ' | ';
+ const rowBody = ' ';
+ const endRowBody = ' | ';
+ const row1 = ' ';
+ const endRow1 = ' | ';
+ const row1C = ' ';
+ const endRow1C = ' | ';
+ const row2col = [' ',
+ ' '];
+ const endRow2col = ' ';
+ const rowL = ' ';
+ const endRowL = ' | ';
+ const rowR = ' ';
+ const endRowR = ' | ';
+ const rowC = ' ';
+ const endRowC = ' | ';
+ const row2 = ' ';
+ const endRow2 = ' | ';
+ const rowC2 = ' ';
+ const endRowC2 = ' | ';
+ const titleDmgSM = ' '+colours.dmgslabel+' | ';
+ const rowDmgSM = ' ';
+ const endRowDmgSM = ' | ';
+ const titleAC = ' AC Hit | ';
+ const rowAC = ' ';
+ const endRowAC = ' | ';
+ const rowType = ' ';
+ const endRowType = ' | ';
+ const titleDmgL = ' '+colours.dmgllabel+' | ';
+ const rowDmgL = ' ';
+ const endRowDmgL = ' | ';
+ const sImg = ' '
+ const pImg = ' '
+ const bImg = ' '
+ const rowTargetAC = ' Target | ';
+ const endRowTargetAC = ' | AC | ';
+ const rowTargetSAC = ' ';
+ const endRowTargetSAC = ' | ';
+ const rowTargetPAC = ' ';
+ const endRowTargetPAC = ' | ';
+ const rowTargetBAC = ' ';
+ const endRowTargetBAC = ' | ';
+ const titleTargetHP = ' Target HP | '
+ const rowTargetHP = ' ';
+ const endTableStyle = ' | ';
+
+ const addDescs = function( txtObj, j ) {
+ let content = '';
+ if (!_.isUndefined(txtObj.desc)) content += (row1col[(j++)%2]+row1+ txtObj.desc +endRow1+endRow1col);
+ for (let i=1; i<=9; ++i) {
+ if (!_.isUndefined(txtObj['desc'+i])) content += (row1col[(j++)%2]+row1+ txtObj['desc'+i] +endRow1+endRow1col);
+ };
+ return content;
+ };
+
+ const RPGMattack = function( txt ) {
+ const attkDefaults = {title:'', name:'', subtitle:'', ac_hit:'', target_ac:'', attk_type:'', target_sac:'', target_pac:'', target_bac:'', dmg_s:'', dmg_l:'', target_hp:'', target_maxhp:''};
+ const txtObj = _.object([...txt.replace(/[\r\n]/g,'').replace(/\}\}\}/g,'} }}').matchAll(/\{\{(.+?)=(.*?)\}\}/g)].map(v => v.slice(1)).map(v => [v[0].replace(/[-\s]/g,'_').toLowerCase(),v[1]]));
+ const dice_roll = parseInt((txtObj.ac_hit.match(/(\d+)\[Dice roll\]/i) || ['',''])[1]);
+ const hasDescs = /{{\s*desc\d?\s*=/im.test(txt);
+ _.defaults(txtObj,attkDefaults);
+ txtObj.attk_type = txtObj.attk_type.toLowerCase();
+ var content = outerFrame;
+ if (txtObj.title.length || txtObj.name.length) {
+ content += headerFrame
+ +header1+ txtObj.title+txtObj.name +endHeader1
+ +(txtObj.subtitle ? (subtitle1+ txtObj.subtitle +endSubtitle1) : '')
+ +settings
+ +endHeaderFrame;
+ }
+ if (txtObj.ac_hit != '') {
+ content += ((txtObj.crit_roll || txtObj.fumble_roll || txtObj.target_ac != '' || txtObj.result) ? bodyFrame : lastBodyFrame)
+ +row1col[0]
+ +titleDmgSM
+ +rowAC+ txtObj.ac_hit +endRowAC
+ +titleDmgL
+ +endRow1col
+ +row1col[1]
+ +rowDmgSM+ txtObj.dmg_s +endRowDmgSM
+ +rowDmgL+ txtObj.dmg_l +endRowDmgL
+ +endRow1col
+ +row1col[0]
+ +titleAC
+ +endRow1col
+ +row1col[1]
+ +rowType+ [sImg,pImg,bImg].filter((e,i) => txtObj.attk_type.includes(['s','p','b'][i])).join('') +endRowType
+ +endRow1col
+ +endBodyFrame;
+ }
+ if ((txtObj.crit_roll || txtObj.fumble_roll) && !isNaN(dice_roll)) {
+ const crit_roll = parseInt(txtObj.crit_roll);
+ const fumble_roll = parseInt(txtObj.fumble_roll);
+ const crit = (crit_roll && (crit_roll <= dice_roll));
+ const fumble = (fumble_roll && (fumble_roll >= dice_roll));
+ if (crit || fumble) {
+ content += ((txtObj.target_ac != '' || txtObj.result) ? bodyFrame : lastBodyFrame)
+ +(!crit ? '' : (rowResult[0]+rowC+ (txtObj.crit || 'Critical Hit!') +endRowC+endRowResult))
+ +(!fumble ? '' : (rowResult[1]+rowC+ (txtObj.fumble || 'Fumbled!') +endRowC+endRowResult))
+ +endBodyFrame;
+ }
+ }
+ if (txtObj.target_ac != '') {
+ const target_hp = parseInt(txtObj.target_hp.match(/[-+]?\d+/));
+ const target_maxhp = parseInt(txtObj.target_maxhp.match(/[-+]?\d+/));
+ const heart_url = !(isNaN(target_hp) || isNaN(target_maxhp)) ? heart[Math.min(Math.ceil(8*Math.max(target_hp,0)/target_maxhp),8)] : '';
+ content += ((txtObj.result) ? bodyFrame : lastBodyFrame)
+ +row1col[0]
+ +rowTargetAC+ txtObj.target_ac +endRowTargetAC
+ +titleTargetHP
+ +endRow1col
+ +row1col[1]
+ +rowTargetSAC+ txtObj.target_sac +endRowTargetSAC
+ +rowTargetPAC+ txtObj.target_pac +endRowTargetPAC
+ +rowTargetBAC+ txtObj.target_bac +endRowTargetBAC
+ +rowTargetHP + 'background-image: url('+heart_url+');">' +endRowTargetHP
+ +endRow1col
+ +endBodyFrame;
+ }
+ if (txtObj.result) {
+ let result;
+ const test = txtObj.result.match(/([\w\s_.+-]+?|[-+]?[\d.]+?)((?:<=|>=|<|>|=|<>|!=))(.+)/);
+ if (test) {
+ const field1 = test[1].replace(/[-\s]/g,'_').toLowerCase();
+ const field2 = test[3].replace(/[-\s]/g,'_').toLowerCase();
+ const value1 = (/^[-+]?[\d.]+/.test(test[1])|| _.isUndefined(txtObj[field1])) ? parseFloat(test[1]) : parseFloat(txtObj[field1].match(/[-+]?[\d.]+/));
+ const value2 = (/^[-+]?[\d.]+/.test(test[3])|| _.isUndefined(txtObj[field2])) ? parseFloat(test[3]) : parseFloat(txtObj[field2].match(/[-+]?[\d.]+/));
+ switch (test[2]) {
+ case '=': result = value1 == value2; break;
+ case '<': result = value1 < value2; break;
+ case '>': result = value1 > value2; break;
+ case '<=': result = value1 <= value2; break;
+ case '>=': result = value1 >= value2; break;
+ case '<>': result = value1 != value2; break;
+ case '!=': result = value1 != value2; break;
+ default: result = false;
+ }
+ content += (hasDescs ? bodyFrame : lastBodyFrame)
+ +rowResult[result ? 0 : 1]+rowC+''+ (result ? 'Success' : 'Failure') +''+endRowC+endRowResult
+ +endBodyFrame;
+ if (txtObj.successcmd && txtObj.successcmd.length && result) {
+ _.each(txtObj.successcmd.split(' '),cmd => LibFunctions.sendAPI(cmd));
+ } else if (txtObj.failcmd && txtObj.failcmd.length && !result) {
+ _.each(txtObj.failcmd.split(' '),cmd => LibFunctions.sendAPI(cmd));
+ }
+ }
+ }
+ if (hasDescs) {
+ content += lastBodyFrame
+ +addDescs(txtObj,1)
+ +endBodyFrame;
+ }
+ content += endOuterFrame;
+ return content;
+ };
+
+ const RPGMspell = function( txt ) {
+ const spellDefaults = {prefix:'', title:'', name:'', splevel:'', school:'', range:'', components:'', duration:'', time:'', aoe:'', save:'', effects:''};
+ let k=1;
+ const txtObj = _.object([...txt.replace(/[\r\n]/g,'').matchAll(/\{\{(.+?)=(.*?)\}\}/g)].map(v => v.slice(1)).map(v => [v[0].replace(/[-\s]/g,'_').toLowerCase(),v[1]]));
+ const isLooksLike = !isGM && !!txtObj.looks_like;
+ _.defaults(txtObj,spellDefaults);
+ const content = outerFrame
+ +headerFrame
+ +header2+ (!isLooksLike ? txtObj.prefix : '')+txtObj.title+(!isLooksLike ? txtObj.name : '')+endHeader2
+ +(!isLooksLike ? (subtitle2+ txtObj.splevel +' * '+ txtObj.school +endSubtitle2) : '')
+ +settings
+ +endHeaderFrame
+ +lastBodyFrame
+ +(!isLooksLike ? (
+ row2col[++k%2]+rowL+'Range '+ txtObj.range +endRowL
+ +rowR+'Components '+ txtObj.components +endRowR+endRow2col
+ +row2col[++k%2]+rowL+'Duration '+ txtObj.duration +endRowL
+ +rowR+'Casting Time '+ txtObj.time +endRowR+endRow2col
+ +row2col[++k%2]+rowL+'Area of Effect '+ txtObj.aoe +endRowL
+ +rowR+'Saving Throw '+ txtObj.save +endRowR+endRow2col
+ +(txtObj.healing ? (row2col[++k%2]+rowC2+'Healing: '+ txtObj.healing +endRowC2+endRow2col) : '')
+ +(txtObj.damage ? (row2col[++k%2]+rowC2+'Damage: '+ txtObj.damage +endRowC2+endRow2col) : '')
+ +(txtObj.reference ? (row2col[++k%2]+rowC2+'Reference: '+ txtObj.reference +endRowC2+endRow2col) : '')
+ +(txtObj.materials ? (row2col[++k%2]+rowC2+'Materials: '+ txtObj.materials +endRowC2+endRow2col) : '')
+ +(txtObj.use ? (row2col[++k%2]+row2+'Use: '+ txtObj.use +endRow2+endRow2col) : '')
+ +(isGM && txtObj.gm_info ? (row2col[++k%2]+row2+'GM Info: '+ txtObj.gm_info +endRow2+endRow2col) : '')
+ ) : '')
+ +(txtObj.looks_like || txtObj.appearance ? (row2col[++k%2]+row2+(!isLooksLike ? 'Looks Like: ' : '')+ (txtObj.looks_like ? txtObj.looks_like : txtObj.appearance) +endRow2+endRow2col) : '')
+ +(!isLooksLike ? (
+ row2col[++k%2]+row2+'Effects: '+ txtObj.effects +endRow2+endRow2col
+ + addDescs(txtObj,++k)
+ ) : '');
+ +endBodyFrame
+ +endOuterFrame;
+ return content;
+ }
+
+ const RPGMmessage = function( txt ) {
+
+ const txtObj = _.object([...txt.replace(/[\r\n]/g,'').matchAll(/\{\{(.+?)=(.*?)\}\}/g)].map(v => v.slice(1)).map(v => [v[0].replace(/[-\s]/g,'_').toLowerCase(),v[1]]));
+ let content = outerFrame;
+ if (txtObj.name || txtObj.title) {
+ content += headerFrame
+ +header1+ (txtObj.title || '')+(txtObj.name || '') +endHeader1
+ +settings
+ +endHeaderFrame
+ +lastBodyFrame;
+ } else {
+ content += fullBodyFrame;
+ }
+ content += addDescs(txtObj,1)
+ +endBodyFrame
+ +endOuterFrame;
+ return content;
+ }
+
+ const RPGMdefault = function( txt ) {
+
+ const resultTest = function( t ) {
+ let result = false;
+ const test = t.match(/([\w\s_.+-]+?|[-+]?[\d.]+?)((?:<=|>=|<|>|=|<>|!=))(.+)/);
+ if (test) {
+ const value1 = (/^[-+]?[\d.]+/.test(test[1])|| _.isUndefined(txtObj[test[1]])) ? parseFloat(test[1]) : parseFloat(txtObj[test[1]].match(/[-+]?[\d.]+/));
+ const value2 = (/^[-+]?[\d.]+/.test(test[3])|| _.isUndefined(txtObj[test[3]])) ? parseFloat(test[3]) : parseFloat(txtObj[test[3]].match(/[-+]?[\d.]+/));
+ switch (test[2]) {
+ case '=': result = value1 == value2; break;
+ case '<': result = value1 < value2; break;
+ case '>': result = value1 > value2; break;
+ case '<=': result = value1 <= value2; break;
+ case '>=': result = value1 >= value2; break;
+ case '<>': result = value1 != value2; break;
+ case '!=': result = value1 != value2; break;
+ default: result = false;
+ }
+ }
+ return result;
+ };
+
+
+ const defDefaults = {prefix:'', title:'', name:''};
+ const txtObj = template ? _.object([...txt.replace(/[\r\n]/g,'').matchAll(/\{\{(.+?)=(.*?)\}\}/g)].map(v => v.slice(1))) : undefined;
+ const isLooksLike = !isGM && /{{\s*Looks\s?Like\s*=.*?}}/im.test(txt);
+ _.defaults(txtObj,defDefaults);
+ let content = outerFrame
+ +headerFrame
+ +header1+ (!isLooksLike ? txtObj.prefix : '')+txtObj.title+(!isLooksLike ? txtObj.name : '')+endHeader1
+ +(txtObj.subtitle && !isLooksLike ? (subtitle1+ txtObj.subtitle +endSubtitle1) : '')
+ +settings
+ +endHeaderFrame;
+ content += lastBodyFrame;
+ let j=1, crit=false, fumble=false, result=false;
+ _.each(txtObj,(t,k) => {
+ let key = (k.toLowerCase().replace(/\s/g,''));
+ if (key === 'crit_roll') crit = resultTest(t);
+ if (key === 'fumble_roll') fumble = resultTest(t);
+ if (key === 'result') result = resultTest(t);
+ });
+ _.each(txtObj,(t,k) => {
+ t = t.replace(/\/img,tableStyle);
+ t = t.replace(/\<\/table\>/img,endTableStyle);
+ txtObj[k] = t;
+ if (!t || !t.length) return;
+ let key = k.toLowerCase().replace(/\s/g,'');
+ if (key === 'lookslike') {
+ if (!isGM) {
+ content += (row2col[(j++)%2]+row2+ t +endRow2+endRow2col);
+ } else {
+ content += (row1col[(j++)%2]+rowHeader+ k +endRowHeader+rowBodyC+ t +endRowBodyC+endRow1col);
+ }
+ } else if (isLooksLike) {
+ return;
+ } else if (key === 'result' || key === 'crit_roll' || key === 'fumble_roll') {
+/* let result;
+ const test = t.match(/([\w\s_.+-]+?|[-+]?[\d.]+?)((?:<=|>=|<|>|=|<>|!=))(.+)/);
+ if (test) {
+ const value1 = (/^[-+]?[\d.]+/.test(test[1])|| _.isUndefined(txtObj[test[1]])) ? parseFloat(test[1]) : parseFloat(txtObj[test[1]].match(/[-+]?[\d.]+/));
+ const value2 = (/^[-+]?[\d.]+/.test(test[3])|| _.isUndefined(txtObj[test[3]])) ? parseFloat(test[3]) : parseFloat(txtObj[test[3]].match(/[-+]?[\d.]+/));
+ switch (test[2]) {
+ case '=': result = value1 == value2; break;
+ case '<': result = value1 < value2; break;
+ case '>': result = value1 > value2; break;
+ case '<=': result = value1 <= value2; break;
+ case '>=': result = value1 >= value2; break;
+ case '<>': result = value1 != value2; break;
+ case '!=': result = value1 != value2; break;
+ default: result = false;
+ }
+*/ switch (key) {
+ case 'result':
+ content += rowResult[result ? 0 : 1]+row1C+''+ (result ? 'Success' : 'Failure') +''+endRow1C+endRowResult;
+ if (txtObj.successcmd && txtObj.successcmd.length && result && !crit) {
+ LibFunctions.sendAPI(LibFunctions.parseStr(txtObj.successcmd));
+ } else if (txtObj.failcmd && txtObj.failcmd.length && !result && !fumble) {
+ LibFunctions.sendAPI(LibFunctions.parseStr(txtObj.failcmd));
+ };
+ break;
+ case 'crit_roll':
+ content += (!crit ? '' : (rowResult[0]+row1C+ (txtObj.crit || 'Critical Success!') +endRow1C+endRowResult));
+ if (txtObj.critcmd && txtObj.critcmd.length && crit) LibFunctions.sendAPI(LibFunctions.parseStr(txtObj.critcmd));
+ break;
+ case 'fumble_roll':
+ content += (!fumble ? '' : (rowResult[1]+row1C+ (txtObj.fumble || 'Critical Failure!') +endRow1C+endRowResult));
+ if (txtObj.fumblecmd && txtObj.fumblecmd.length && fumble) LibFunctions.sendAPI(LibFunctions.parseStr(txtObj.fumblecmd));
+ break;
+ }
+// }
+ } else if (key.startsWith('section')) {
+ content += row1col[(j++)%2]+row1C+ t +endRow1C+endRow1col;
+ } else if (key === 'gminfo') {
+ if (isGM) content += (row1col[(j++)%2]+rowHeader+ k +endRowHeader+rowBodyC+ t +endRowBodyC+endRow1col);
+ } else if (!['name','title','subtitle','successcmd','failcmd','crit','fumble','critcmd','fumblecmd','gmdesc'].includes(key) && !key.startsWith('desc')) {
+ content += row1col[(j++)%2]+rowHeader+ k +endRowHeader+rowBodyC+ t +endRowBodyC+endRow1col;
+ }
+ });
+ content += (isLooksLike ? '' : addDescs(txtObj,j))
+ + endBodyFrame + endOuterFrame;
+ return content;
+ }
+
+ let content;
+ switch (template.toLowerCase()) {
+ case 'rpgmattack':
+ content = RPGMattack( txt );
+ break;
+ case 'rpgmspell':
+ case 'rpgmpotion':
+ case 'rpgmitemspell':
+ case 'rpgmwandspell':
+ case 'rpgmscroll':
+ content = RPGMspell( txt );
+ break;
+ case 'rpgmmessage':
+ content = RPGMmessage( txt );
+ break;
+ case 'rpgmweapon':
+ case 'rpgmammo':
+ case 'rpgmmenu':
+ case 'rpgmarmour':
+ case 'rpgmitem':
+ case 'rpgmring':
+ case 'rpgmwand':
+ case 'rpgmclass':
+ case 'rpgmwarning':
+ case 'rpgmdefault':
+ content = RPGMdefault( txt );
+ break;
+ default:
+ content = (template ? '&{template:'+template+'}' : '' ) + txt;
+ break;
+ }
+ content = (content[0] === '!' ? '' : preamble) + content;
+ sendChat(as?as:defaultAs,content,null,{noarchive:!archive, use3d:use3Ddice});
+ return content;
+ }
+
+ /*
+ * Determine who to send a Response to: use who controls
+ * the character - if no one or if none of the controlling
+ * players are on-line send the response to the GM
+ */
+
+ LibFunctions.sendToWho = function(charCS,senderId,makePublic=false,embedded=false) {
+
+ var to, controlledBy, players, viewerID, isPlayer=LibFunctions.checkPlayersLive( charCS );
+ controlledBy = (!charCS ? '' : charCS.get('controlledby'));
+/* if (controlledBy.length > 0) {
+ controlledBy = controlledBy.split(',');
+ viewerID = (state.roundMaster && state.roundMaster.viewer && state.roundMaster.viewer.is_set) ? (state.roundMaster.viewer.pid || null) : null;
+ players = controlledBy.filter(id => id != viewerID);
+ if (players.length) {
+ isPlayer = _.some( controlledBy, function(playerID) {
+ players = findObjs({_type: 'player', _id: playerID, _online: true});
+ return (players && players.length > 0);
+ });
+ };
+ };
+*/ if (controlledBy.includes('all')) {
+ to = '';
+// } else if (playerIsGM(senderId) || !charCS || controlledBy.length == 0 || !isPlayer) {
+ } else if (playerIsGM(senderId) || !charCS || !isPlayer) {
+ to = embedded ? '/w gm ' : '/w gm ';
+ } else if (makePublic) {
+ to = '';
+ } else {
+ to = (embedded ? ('/w "'+charCS.get('name')+'" ') : ('/w "' + charCS.get('name') + '" '));
+ }
+ return to;
+ }
+
+ /*
+ * A more reliable form of function to determine who
+ * to send a Response to: use who controls
+ * the character - if no one or if none of the controlling
+ * players are on-line send the response to the GM
+ */
+
+ LibFunctions.sendMsgToWho = function(charCS,senderId,msg,div='',makePublic=false,embedded=false) {
+
+ var to, controlledBy, players, viewerID, isPlayer=false;
+// match = !embedded ? /(?<=^|}}\s*)^(?!\!|\/)/mg : /(? 0) {
+ controlledBy = controlledBy.split(',');
+ viewerID = (state.roundMaster && state.roundMaster.viewer && state.roundMaster.viewer.is_set) ? (state.roundMaster.viewer.pid || null) : null;
+ players = controlledBy.filter(id => id != viewerID);
+ if (players.length) {
+ isPlayer = _.some( controlledBy, function(playerID) {
+ players = findObjs({_type: 'player', _id: playerID, _online: true});
+ return (players && players.length > 0);
+ });
+ };
+ };
+ if (controlledBy.includes('all')) {
+ to = '';
+ } else if (playerIsGM(senderId) || !charCS || controlledBy.length == 0 || !isPlayer) {
+ to = embedded ? '/w gm ' : '/w gm ';
+ } else if (makePublic) {
+ to = '';
+ } else {
+ to = (embedded ? ('/w "'+charCS.get('name')+'" ') : ('/w "' + charCS.get('name') + '" '));
+ }
+ if (!embedded) msg = msg.replace(/^&{template:/img,(to+div+'$&'))
+ .replace(/^(?!\!|\/)/,('$&'+to+div))
+ .replace(/^\!.*^(?!\!|\/)/mg,('$&'+to+div))
+ .replace(/^\/(?:w|em|ooc|talktomyself|fx|desc|as|emas)\s.*?^(?!\!|\/)/img,('$&'+to+div));
+
+// log('sendMsgToWho: final to = '+to+', msg = '+msg);
+
+ return embedded ? to : msg;
+ }
+
+ /**
+ * Insert a whisper into a body with a template.
+ * If no template, inserts the whisper at the start of
+ * the first line not starting with an API call.
+ **/
+
+ LibFunctions.insertWhisper = function(to, msg='') {
+ let splitMsg = msg.match(/([^]*?)^.*?((?:&|\\amp|\\amp;){template:.*)/msi);
+ if (!splitMsg || !splitMsg.length > 2) return to+' '+msg;
+ return splitMsg[1]+'\n'+to+' '+splitMsg[2];
+ }
+
+ /**
+ * Send public message with 3d dice rolls (if enabled)
+ */
+
+ LibFunctions.sendPublic = function(msg,charCS,senderId) {
+ if (!msg)
+ {return undefined;}
+ var who;
+
+ if (charCS) {
+ who = 'character|'+charCS.id;
+ } else {
+ who = '';
+ }
+ sendChat(who,msg,null,{use3d:true});
+ clearWaitTimer();
+ };
+
+ /**
+ * Send API command to chat
+ */
+ LibFunctions.sendAPI = function(msg, senderId, from='') {
+ var as;
+ if (!msg) {
+ log('sendMagicAPI: no msg');
+ return undefined;
+ }
+ if (!senderId || senderId.length == 0) {
+ as = '';
+ } else {
+ as = 'player|' + senderId;
+ }
+ sendChat(as,msg, null,{noarchive:!archive, use3d:false});
+ };
+
+ /**
+ * Send locally parsed feedback to the GM only!
+ */
+ LibFunctions.sendFeedback = function(msg,as,img) {
+ if (!msg)
+ {return;}
+ var gm = findTheGM(),
+ div = ''
+ + ' '
+ + ' ';
+ sendChat(('player|'+gm),LibFunctions.sendMsgToWho(null,null,msg,div),null,{noarchive:!archive}); //,use3d:false
+ clearWaitTimer(gm);
+ };
+
+ /**
+ * Sends a response to everyone who controls the character
+ * RED: v0.003 Check the player(s) controlling the character are valid for this campaign
+ * if they are not, send to the GM instead - Transmogrifier can introduce invalid IDs
+ * Also check if the controlling player(s) are online. If they are not
+ * assume the GM is doing some testing and send the message to them.
+ */
+
+ LibFunctions.sendResponse = function(charCS,msg,senderId,as,img) {
+ if (!msg)
+ {return;}
+ if (!charCS || (senderId && playerIsGM(senderId))) {
+ LibFunctions.sendFeedback( msg, as, img );
+ } else {
+ var div = ''
+ + ' '
+ + ' ';
+ sendChat((senderId ? 'player|'+senderId : charCS.get('name')),LibFunctions.sendMsgToWho(charCS,senderId,msg,div),null,{noarchive:!archive, use3d:false});
+ clearWaitTimer(senderId);
+ }
+ };
+
+ /*
+ * Send a message to the player (rather than the character)
+ */
+
+ LibFunctions.sendResponseError = function(pid,msg,as,img) {
+ msg = '&{template:'+fields.warningTemplate+'}{{title=Warning!}}{{desc='+msg+'}}';
+ LibFunctions.sendResponsePlayer(pid,msg,as,img);
+ return;
+ }
+
+ /*
+ * Send an error message to the identified player.
+ * If that player is not online, send to the GM
+ */
+
+ LibFunctions.sendResponsePlayer = function(pid,msg,as,img) {
+ if (!pid || !msg)
+ {return null;}
+ var player = getObj('player',pid),
+ to;
+ if (player && player.get('_online')) {
+ to = '/w "' + player.get('_displayname') + '" ';
+ } else {
+ to = '/w gm ';
+ }
+ var content = to
+ + ''
+ + ' '
+ + ' '+msg;
+ sendChat((as?as:defaultAs),content,null,{noarchive:false, use3d:false});
+ clearWaitTimer(pid);
+ };
+
+ /*
+ * Send to all players other than those that control the specified character
+ * and/or other than the specified player
+ */
+
+ LibFunctions.sendToOthers = function(pid,msg,as,img,charCS) {
+ if (!msg || (!pid && !charCS))
+ {return null;}
+ let controllers = charCS ? charCS.get('controlledby').split(',') : [];
+ let players = filterObjs(obj => {
+ if (obj.get('_type') != 'player' || obj.id == pid) return false;
+ if (controllers.includes(obj.id)) return false;
+ return obj.get('_online');
+ });
+ _.each(players, p => LibFunctions.sendResponsePlayer(p,msg,as,img));
+ };
+
+ /**
+ * Send a simple error
+ */
+
+ LibFunctions.sendError = function(msg, cmd) {
+ var postErrorMsg = function( msg, cmd ) {
+ var content = '/w GM '
+ + ''
+ + ' '
+ + ' '
+ + errorMsgDiv + 'Error: ' + msg
+ + (cmd ? (' while processing command
' + cmd.content + ' ') : '')
+ + '';
+
+ sendChat(((cmd && cmd.who) ? cmd.who : defaultAs),content,null,{noarchive:false, use3d:false});
+ log('RPGMaster error: '+msg+ (cmd ? (' while processing command '+cmd.content) : ''));
+ };
+ setTimeout(postErrorMsg,500,msg,cmd);
+ };
+
+ /**
+ * Send an error caught by try/catch
+ */
+
+ LibFunctions.sendCatchError = function(apiName,msg,e,cmdStr='') {
+ var postCatchMsg = function(apiName,msg,e,cmdStr) {
+ if (!msg || !msg.content) {msg= {};msg.content = ''};
+ if (!cmdStr) cmdStr = msg.content;
+ log(apiName + ' error: ' + e.name + ', ' + e.message + ' when processing command ' + cmdStr);
+ let who=(getObj('player',msg.playerid)||{get:()=>'API'}).get('_displayname');
+ sendChat(apiName,`/w gm `+
+ ``+
+ ` There was an error while trying to run ${who}'s command: `+
+ ` ${cmdStr}
`+
+ ` Please send me this information so I can make sure this doesn't happen again (triple click for easy select in most browsers.): `+
+ ` `+
+ JSON.stringify({msg:msg, version:version, stack: e.stack, API_Meta})+
+ ` `+
+ ` `
+ )
+ };
+ setTimeout(postCatchMsg,500,apiName,msg,e,cmdStr);
+ };
+
+ /**
+ * Pare a message with ^^...^^ parameters in it and send to chat
+ * This allows character and token names for selected characters to be sent
+ * Must be called with a validated tokenID
+ */
+
+ LibFunctions.sendParsedMsg = function( tid, msg, senderId, msgFrom, t2id ) {
+ var cid, tname, charCS, cname, curToken,
+ parsedMsg = msg;
+
+ curToken = getObj( 'graphic', tid );
+ tname = (curToken ? curToken.get('name') : '');
+ cid = (curToken ? curToken.get('represents') : '');
+ charCS = getObj('character',cid);
+ cname = (charCS ? charCS.get('name') : '');
+
+ parsedMsg = parsedMsg.replace( /\^\^cid\^\^/gi , cid );
+ parsedMsg = parsedMsg.replace( /\^\^tid\^\^/gi , tid );
+ parsedMsg = parsedMsg.replace( /\^\^cname\^\^/gi , cname );
+ parsedMsg = parsedMsg.replace( /\^\^tname\^\^/gi , tname );
+
+ if (t2id) {
+ curToken = getObj( 'graphic', t2id );
+ tname = curToken.get('name');
+ cid = curToken.get('represents');
+ charCS = getObj('character',cid);
+ cname = charCS.get('name');
+
+ parsedMsg = parsedMsg.replace( /\^\^c2id\^\^/gi , cid );
+ parsedMsg = parsedMsg.replace( /\^\^t2id\^\^/gi , t2id );
+ parsedMsg = parsedMsg.replace( /\^\^c2name\^\^/gi , cname );
+ parsedMsg = parsedMsg.replace( /\^\^t2name\^\^/gi , tname );
+ }
+ LibFunctions.sendResponse( charCS, parsedMsg, senderId, msgFrom, null );
+ };
+
+ /*
+ * Check to see if a command string includes a gm roll query. If so,
+ * convert it to a normal roll query and send it to the GM to answer.
+ * Return true if a gm query has been found.
+ */
+
+ LibFunctions.sendGMquery = function( api, command, senderId ) {
+ var rollQuery;
+ if (command.toLowerCase().includes('gm{')) {
+ while ((rollQuery = command.match(/gm{.+?}/i))) {
+ if (!rollQuery || !rollQuery.length) break;
+ rollQuery = rollQuery[0].replace(/gm{/i,'?{').replace(/\//g,'|');
+ rollQuery = LibFunctions.parseStr(rollQuery);
+ command = command.replace(/gm{.+?}/i,rollQuery);
+ };
+ LibFunctions.sendFeedback( '&{template:'+fields.warningTemplate+'}{{title=DM Selection}}{{desc=As DM, you need to make [selections](!'+api+' '+senderId+' --'+command+') for '+getObj('player',senderId).get('_displayname')+'. Press the button and the selections and their reasons will be presented to you in Roll Querys in the centre of the screen.}}');
+ LibFunctions.sendResponsePlayer( senderId, '&{template:'+fields.messageTemplate+'}{{title=DM Selection}}{{desc=Please wait while the DM makes a choice or dice roll.}}' );
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ /*
+ * Send a formatted "please wait" message to the specified player.
+ */
+
+ LibFunctions.sendWait = function(senderId,timer=500,source='') {
+// log('sendWait: timer = '+timer+', senderId = '+(getObj('player',senderId)?getObj('player',senderId).get('_displayname'):'none')+', source = '+source);
+ if (timer === 0) {
+ clearWaitTimer(senderId);
+ return;
+// } else if (timer === 1) {
+// clearWaitTimer(senderId);
+ } else if (waitList[senderId]) {
+// return;
+ clearWaitTimer(senderId);
+ }
+ if (playerIsGM(senderId)) {
+ waitList[senderId] = setTimeout(() => sendChat(defaultAs,('/w GM ' + waitMsgDiv + 'Gathering data - please wait'),null,{noarchive:!archive}), timer);
+ } else {
+ var player = getObj('player',senderId),
+ to = '/w "' + (!player ? 'GM' : player.get('_displayname')) + '" ';
+ waitList[senderId] = setTimeout(() => sendChat('player|'+senderId,(to + waitMsgDiv + 'Gathering data - please wait'),null,{noarchive:!archive, use3d:false}), timer);
+ }
+ };
+
+
+ /* ------------------------------- Character Sheet Database Management -------------------------- */
+
+ /*
+ * Check the version of a Character Sheet database against
+ * the current version in the API. Return true if needs updating
+ */
+
+ LibFunctions.checkDBver = function( dbFullName, dbObj, silent ) {
+
+ dbFullName = dbFullName.replace(/_/g,'-');
+
+ var dbCS = findObjs({ type:'character', name:dbFullName },{caseInsensitive:true}),
+ dbVersion = 0.0,
+ msg, versionObj;
+
+ if (!dbCS || !dbCS.length) return true;
+
+ dbCS = dbCS[0];
+ dbVersion = parseFloat(LibFunctions.attrLookup( dbCS, fields.dbVersion ) || dbVersion);
+
+ if (dbVersion < (parseFloat(dbObj.version) || 0)) {log('checkDBver: dB '+dbFullName+' API version='+(parseFloat(dbObj.version) || 0)+', CS version='+dbVersion); return true;}
+
+ msg = dbFullName+' v'+dbVersion+' not updated as is already latest version';
+ if (!silent) LibFunctions.sendFeedback(msg,fields.feedbackName);
+ return false;
+ }
+
+ /*
+ * A function to read the abilities of a database character sheet
+ * and write them to a handout, so they can be cut&pasted to an API
+ * for saving as a new version.
+ */
+
+ LibFunctions.saveDBtoHandout = function( dbName, version ) {
+
+ var dbCS = findObjs({ type: 'character', name: dbName })[0] || undefined,
+ objDef,
+ objHeader = '',
+ foundItems = [],
+ dbHandout,csDBlist;
+
+ var encodeStr = (str,encoders=dbEncoders) => encoders.reduce((m, rep) => m.replace(rep[0], rep[1]), str);
+
+ if (!dbCS) {
+ LibFunctions.sendError(('Database '+dbName+' not found'),null);
+ return undefined;
+ }
+ if (!version || !version.length) {
+ version = (parseFloat(LibFunctions.attrLookup( dbCS, fields.dbVersion ) || '1.0') + 0.01).toFixed(2).toString();
+ } else if (version === '=') {
+ version = parseFloat(LibFunctions.attrLookup( dbCS, fields.dbVersion ) || '1.0');
+ }
+ dbHandout = findObjs({ type: 'handout', name: dbName+'-object v'+version });
+
+ if (!dbHandout || !dbHandout.length) {
+ dbHandout = createObj('handout',{name:(dbName+'-object v'+version)});
+ } else {
+ dbHandout = dbHandout[0];
+ }
+
+ objHeader = 'avatar:\''+dbCS.get('avatar')+'\', '
+ + 'version:'+version+', ';
+ objDef = 'db:[';
+ csDBlist = findObjs({ type: 'ability', characterid: dbCS.id });
+
+ _.each( _.sortBy(csDBlist,item => item.get('name')), function( item ) {
+ let itemName = item.get('name');
+ if (foundItems.includes(itemName)) return;
+ foundItems.push(itemName);
+
+ let objBody = encodeStr(item.get('action')),
+ objCT = (objBody.match(reDataSpeed) || ['',0])[1],
+ objChg = (objBody.match(reDataCharge) || ['','uncharged'])[1],
+ objCost = (objBody.match(reDataCost) || ['',0])[1],
+ objType = '',
+ specs = objBody.match(/}}\s*?specs\s*?=(.*?){{/im);
+
+ specs = specs ? [...('['+specs[0]+']').matchAll(reSpecClass)] : [];
+ for (let i=0; i < specs.length; i++) {
+ objType += (objType && objType.length) ? ('|' + specs[i][1]) : specs[i][1];
+ }
+
+ objBody = objBody.replace(/template:2Edefault/i,'template:\'+fields.CSdefaultTemplate+\'')
+ .replace(/template:2Espell/i,'template:\'+fields.CSspellTemplate+\'')
+ .replace(/template:2Eattack/i,'template:\'+fields.CSweaponTemplate+\'')
+ .replace(/template:RPGMdefault/i,'template:\'+fields.defaultTemplate+\'')
+ .replace(/template:RPGMspell/i,'template:\'+fields.spellTemplate+\'')
+ .replace(/template:RPGMweapon/i,'template:\'+fields.weaponTemplate+\'')
+ .replace(/template:RPGMpotion/i,'template:\'+fields.potionTemplate+\'')
+ .replace(/template:RPGMattack/i,'template:\'+fields.targetTemplate+\'')
+ .replace(/template:RPGMammo/i,'template:\'+fields.ammoTemplate+\'')
+ .replace(/template:RPGMarmour/i,'template:\'+fields.armourTemplate+\'')
+ .replace(/template:RPGMitem/i,'template:\'+fields.itemTemplate+\'')
+ .replace(/template:RPGMitemSpell/i,'template:\'+fields.itemSpellTemplate+\'')
+ .replace(/template:RPGMring/i,'template:\'+fields.ringTemplate+\'')
+ .replace(/template:RPGMscroll/i,'template:\'+fields.scrollTemplate+\'')
+ .replace(/template:RPGMwand/i,'template:\'+fields.wandTemplate+\'')
+ .replace(/template:RPGMwandSpell/i,'template:\'+fields.wandSpellTemplate+\'')
+ .replace(/template:RPGMmessage/i,'template:\'+fields.messageTemplate+\'')
+ .replace(/template:RPGMwarning/i,'template:\'+fields.warningTemplate+\'')
+ .replace(/template:RPGMclass/i,'template:\'+fields.classTemplate+\'');
+
+ objDef += '{name:\''+itemName+'\','
+ + 'type:\''+objType+'\','
+ + 'ct:\''+objCT+'\','
+ + 'charge:\''+objChg+'\','
+ + 'cost:\''+objCost+'\','
+ + 'body:\''+objBody+'\'}, ';
+ });
+ objDef += ']}, ';
+ dbHandout.set('notes',objHeader+objDef);
+ LibFunctions.sendFeedback('Extracted '+dbName+' v'+version,fields.feedbackName);
+ LibFunctions.setAttr( dbCS, fields.dbVersion, version );
+ return dbHandout;
+ }
+
+ /*
+ * Check the version of a Character Sheet database and, if
+ * it is earlier than the static data held in this API, update
+ * it to the latest version.
+ */
+
+ LibFunctions.buildCSdb = function( dbFullName, dbObj, typeList, silent ) {
+
+ dbFullName = dbFullName.replace(/_/g,'-');
+
+ const spells = dbObj.type.includes('spell') || dbObj.type.includes('power'),
+ charClass = dbObj.type.includes('class'),
+ rootDB = dbObj.root.toLowerCase();
+
+ var dbVersion = 0.0,
+ dbCS = findObjs({ type:'character', name:dbFullName },{caseInsensitive:true}),
+ errFlag = false,
+ lists = {},
+ foundItems = [],
+ csDBlist, specs, objType, objBody,
+ msg, versionObj, curDB;
+
+ if (LibFunctions.checkDBver( dbFullName, dbObj, silent )) {
+
+ if (dbCS && dbCS.length) {
+ let abilities = findObjs({ _type:'ability', _characterid:dbCS[0].id });
+ _.each( abilities, a => a.remove() );
+ dbCS = dbCS[0];
+ } else {
+ dbCS = createObj( 'character', {name:dbFullName} );
+ }
+
+ let sorted = _.sortBy(dbObj.db,'name');
+
+ _.each(sorted, item => {
+ if (!foundItems.includes(item.name)) {
+ foundItems.push(item.name);
+ item.body = LibFunctions.parseStr(item.body,dbReplacers);
+ if (!LibFunctions.setAbility( dbCS, item.name, item.body )) {
+ errFlag = true;
+ } else {
+ LibFunctions.setAttr( dbCS, [fields.CastingTimePrefix[0]+item.name, 'current'], item.ct );
+ LibFunctions.setAttr( dbCS, [fields.CastingTimePrefix[0]+item.name, 'max'], (spells ? item.cost : item.charge) );
+ LibFunctions.addMIspells( dbCS, item );
+ item.type.dbName().split('|').filter(t => !!t).map(t => {
+ let listType = typeList[t] ? typeList[t].type.toLowerCase() : (typeList.miscellaneous ? typeList.miscellaneous.type.toLowerCase() : undefined);
+ if (listType) {
+ if (!lists[listType]) lists[listType] = [];
+ if (!lists[listType].includes(item.name)) {
+ lists[listType].push(item.name);
+ }
+ } else if (_.isUndefined(listType)) {
+ LibFunctions.sendError(('Unable to identify item type '+t+' when updating '+item.name+' in database '+dbFullName));
+ };
+ });
+ };
+ };
+ });
+ if (errFlag) {
+ LibFunctions.sendError( ('Unable to completely update database '+dbFullName) );
+ } else {
+ _.each(typeList, dbList => dbList.field[0].length ? LibFunctions.setAttr( dbCS, [dbList.field[0],'current'], (lists[dbList.type.toLowerCase()] || ['']).join('|')) : '');
+ LibFunctions.setAttr( dbCS, fields.dbVersion, (dbObj.version || 1.0));
+ dbCS.set('avatar',(dbObj.avatar || ''));
+ dbCS.set('bio',(dbObj.bio || ''));
+ dbCS.set('controlledby',(dbObj.controlledby || 'All'));
+ dbCS.set('gmnotes',(dbObj.gmnotes || ''));
+ let msg = 'Updated database '+dbFullName+' to version '+String(dbObj.version);
+ if (!silent) LibFunctions.sendFeedback( msg, fields.feedbackName ); else log(msg);
+ }
+ }
+ return (errFlag);
+ }
+
+ /**
+ * Create an internal index of items in the databases
+ * to make searches much faster. Index entries indexed by
+ * database root name & short name (name in lower case with
+ * '-', '_' and ' ' ignored). index[0] = abilityID,
+ * index[1] = ct-attributeID
+ * v3.051 Check that other database-handling APIs have finished
+ * updating their databases and performed a handshake
+ **/
+
+ LibFunctions.updateDBindex = function() {
+ var rootDB, magicDB, validDB,
+ db, shortName, attrName, objList,
+ rootList = ['mu_spells_db','pr_spells_db','powers_db','mi_db','race_db','class_db','attacks_db','styles_db','locks_traps_db'],
+// index = [new Set()];
+ index = {};
+
+ _.each( dbNames, (dbFields, db) => {
+ _.each( dbFields.db, (item, i) => {
+ rootDB = db.toLowerCase().match( /[a-z_]+?_db/i );
+ if (!item || !item.name) log('updateDBindex: item='+item.name+', i='+i+', unable to create shortName');
+ shortName = item.name.dbName();
+ if (_.isUndefined(index[rootDB])) index[rootDB] = {};
+ if (_.isUndefined(index[rootDB][shortName])) index[rootDB][shortName] = ['',String(item.ct),db,i];
+ });
+ });
+
+ objList = filterObjs( function(obj) {
+ if (obj.get('type') != 'ability') return false;
+ if (!(magicDB = getObj('character',obj.get('characterid')))) {
+ return false;
+ }
+ db = magicDB.get('name').toLowerCase().replace(/-/g,'_');
+ if (/\s*v\d*\.\d*/.test(db)) {
+ return false;
+ }
+ let validDB = false;
+ for (const rDB of rootList) {
+ if (db.startsWith(rDB)) {
+ validDB = true;
+ rootDB = rDB;
+ break;
+ }
+ }
+ if (!validDB) {return false;}
+ let shortName = obj.get('name').dbName();
+
+ if (_.isUndefined(index[rootDB])) {index[rootDB] = {};}
+ if (_.isUndefined(index[rootDB][shortName]) || !index[rootDB][shortName][0].length || !stdDB.includes(db)) {
+ index[rootDB][shortName] = [obj.id,''];
+ }
+ return true;
+ });
+ objList = filterObjs( function(obj) {
+ if (obj.get('type') != 'attribute') {return false;}
+ attrName = obj.get('name');
+ if (!attrName || !attrName.toLowerCase().startsWith('ct-')) {return false;}
+ if (!(magicDB = getObj('character',obj.get('characterid')))) {
+ return false;
+ }
+ db = magicDB.get('name').toLowerCase().replace(/-/g,'_');
+ if (/\s*v\d*\.\d*/.test(db)) {return false;}
+ let validDB = false;
+ for (const rDB of rootList) {
+ if (db.startsWith(rDB)) {
+ validDB = true;
+ rootDB = rDB;
+ }
+ }
+ if (!validDB)
+ {return false;}
+ let shortName = attrName.dbName().substring(2);
+
+ if (!!!index[rootDB][shortName]) {
+ return false;
+ }
+ if (!stdDB.includes(db) || (!!!index[rootDB][shortName][1]) || (index[rootDB][shortName][1].length === 0)) {
+ index[rootDB][shortName][1] = obj.id;
+ };
+ return true;
+ });
+ magicList = {}; // Blank the internal index of items, as it might have changed and needs rebuilding
+// LibFunctions.sendFeedback( waitMsgDiv+'RPGMaster is now ready.' );
+
+ return index;
+ }
+
+ /*
+ * Check a character sheet database and update/create the
+ * required attributes from the definitions. This should
+ * be run after updating or adding item or spell definitions.
+ */
+
+ LibFunctions.checkCSdb = function( dbFullName ) {
+
+ var db = dbFullName.toLowerCase(),
+ lists = {},
+ spellsDB,
+ dbCSlist,
+ dbTypeList;
+
+ var checkObj = function( obj ) {
+ var objCS, objCSname, objName, objBody, type, objCT, objChg, objCost, specs, spellsDB, classDB;
+
+ if (!obj || obj.get('type') !== 'ability') return false;
+ objCS = getObj('character',obj.get('characterid'));
+ if (!objCS) {log('checkObj: not found database object');return false;}
+ objCSname = objCS.get('name').toLowerCase();
+ if (db && db.length && (db !== '-db' && !objCSname.startsWith(db))) return false;
+ if (!objCSname.includes('-db') || (/\s*v\d*\.\d*/.test(objCSname))) return false;
+ objBody = obj.get('action');
+ spellsDB = objCSname.includes('spells') || objCSname.includes('powers');
+ classDB = objCSname.includes('class') || objCSname.includes('race');
+ specs = objBody.match(reSpecs);
+ objName = obj.get('name');
+ if (specs) {
+ dbTypeList = (spellsDB ? spTypeLists : (classDB ? clTypeLists : miTypeLists));
+ specs = specs ? [...('['+specs[0]+']').matchAll(reSpecClass)] : [];
+ for (const i of specs) {
+ type = i[1];
+ if (type && type.length) {
+ let typeList = type.dbName().split('|');
+ for (const t of typeList) {
+ let itemType = dbTypeList[t] ? dbTypeList[t].type : (dbTypeList.miscellaneous ? dbTypeList.miscellaneous.type : undefined);
+ if (itemType) {
+ if (!lists[objCS.id]) lists[objCS.id] = {};
+ if (!lists[objCS.id][itemType]) lists[objCS.id][itemType] = [];
+ if (!lists[objCS.id][itemType].includes(objName)) {
+ lists[objCS.id][itemType].push(objName);
+ };
+// } else if (_.isUndefined(itemType)) {
+// LibFunctions.sendError((objName+' is of undefined type '+t+'. Please correct this item definition.'));
+ };
+ };
+ };
+ };
+ };
+ objCT = (objBody.match(reDataSpeed) || ['',0])[1];
+ objChg = (objBody.match(reDataCharge) || ['','uncharged'])[1];
+ objCost = (objBody.match(reDataCost) || ['',0])[1];
+ LibFunctions.setAttr( objCS, [fields.CastingTimePrefix[0]+objName, 'current'], objCT );
+ LibFunctions.setAttr( objCS, [fields.CastingTimePrefix[0]+objName, 'max'], (spellsDB ? objCost : objChg) );
+ LibFunctions.addMIspells( objCS, {name:objName,body:objBody} );
+ return true;
+ };
+
+ dbCSlist = filterObjs( obj => checkObj(obj) );
+ if (!dbCSlist || !dbCSlist.length) {
+ LibFunctions.sendFeedback('No databases found with a name that includes '+db,fields.feedbackName);
+ } else {
+ _.each(lists,(types,dbID) => {
+ let dbCS = getObj('character',dbID);
+ _.each(dbTypeList, dbList => {
+ if (types[dbList.type]) {
+ LibFunctions.setAttr( dbCS, [dbList.field[0],'current'], (types[dbList.type].sort().join('|') || '' ));
+ }
+ });
+ });
+ LibFunctions.sendFeedback(((!db || !db.length || db === '-db') ? 'All databases have' : ('Database '+dbFullName+' has')) + ' been updated',fields.feedbackName);
+ }
+ return;
+ }
+
+ /**
+ * Get a new DB index of all Ability Objects stored in
+ * database character sheets
+ **/
+
+ LibFunctions.getDBindex = function(forceUpdate = false) {
+ if (_.isUndefined(DBindex) || forceUpdate) {
+ DBindex = LibFunctions.updateDBindex();
+ }
+ return DBindex;
+ }
+
+ /**
+ * Update or create the help handouts
+ **/
+
+ LibFunctions.updateHandouts = function(handouts,silent,senderId) {
+
+ let classHelp = findObjs({ type:'handout', name:'Class Database Help' });
+ if (classHelp && classHelp[0]) classHelp[0].remove();
+ _.each(handouts,(obj,k) => {
+ let dbCS = findObjs({ type:'handout', name:obj.name },{caseInsensitive:true});
+ if (!dbCS || !dbCS[0]) {
+ log(obj.name+' not found. Creating version '+obj.version);
+ if (!silent) LibFunctions.sendFeedback(obj.name+' not found. Creating version '+obj.version);
+ dbCS = createObj('handout',{name:obj.name,inplayerjournals:(senderId || '')});
+ dbCS.set('notes',obj.bio);
+ dbCS.set('avatar',obj.avatar);
+ } else {
+ dbCS = dbCS[0];
+ dbCS.get('notes',function(note) {
+ let reVersion = new RegExp(obj.name+'\\s*?v(\\d+?.\\d*?)', 'im');
+ let version = note.match(reVersion);
+ version = (version && version.length) ? (parseFloat(version[1]) || 0) : 0;
+ if (version >= obj.version) {
+ if (!silent) LibFunctions.sendFeedback('Not updating handout '+obj.name+' as is already version '+obj.version);
+ return;
+ }
+ dbCS.set('notes',obj.bio);
+ dbCS.set('avatar',obj.avatar);
+ if (!silent) LibFunctions.sendFeedback(obj.name+' handout updated to version '+obj.version);
+ log(obj.name+' handout updated to version '+obj.version);
+ });
+ }
+ });
+ return;
+ }
+
+ /**
+ * Get the handout IDs for all handouts
+ **/
+
+ LibFunctions.getHandoutIDs = function() {
+
+ var handoutObjs = findObjs({ type: 'handout' }),
+ handoutIDs = {};
+ _.each( handoutObjs, h => {
+ let name = h.get('name').replace(/[-_&\s]/g,'');
+ handoutIDs[name] = h.id;
+ });
+ return handoutIDs;
+ };
+
+ /* -------------------------------- Utility Functions ---------------------------- */
+
+ /**
+ * Find the player's ID from a player name or a character name,
+ * or if no player name provided, return the GM's ID
+ **/
+
+ LibFunctions.findThePlayer = function(who) {
+ let playerObjs = findObjs({_type:'player',_displayname:who});
+ let GMid = findTheGM();
+ if (!playerObjs || !playerObjs.length) {
+ let charObj = LibFunctions.findCharacter(who);
+ if (charObj) {
+ let playerIds = charObj.get('controlledby').split(',').filter(id => id !== '' && id !== GMid);
+ if (!playerIds || !playerIds.length) return GMid;
+ if (playerIds[0] !== 'all') {
+ let pid = playerIds.find( p => (getObj('player',p) && !!getObj('player',p).get('_online')));
+ if (pid) return pid;
+ }
+ playerObjs = filterObjs(p => (p.get('_type') === 'player' && !!p.get('_online') && p.id !== GMid));
+ }
+ }
+ return (!playerObjs || !playerObjs.length) ? GMid : playerObjs[0].id;
+ };
+
+ /**
+ * Find a Character object given a name only,
+ * returning the first match or undefined
+ */
+
+ LibFunctions.findCharacter = function( name ) {
+ var charObj = findObjs({ _type: 'character' , name: name },{caseInsensitive: true});
+ return ((charObj && charObj.length) ? charObj[0] : undefined);
+ }
+
+ /**
+ * Function to find the ID of a live player
+ * that controls the specified character
+ */
+
+ LibFunctions.checkPlayersLive = function( charCS ) {
+ let playerID, controlledBy = (!charCS ? '' : charCS.get('controlledby'));
+ if (controlledBy.length > 0) {
+ controlledBy = controlledBy.split(',');
+ let viewerID = (state.roundMaster && state.roundMaster.viewer && state.roundMaster.viewer.is_set) ? (state.roundMaster.viewer.pid || null) : null;
+ let players = controlledBy.filter(id => id != viewerID);
+ if (players.length) {
+ playerID = _.find( controlledBy, function(playerID) {
+ players = findObjs({_type: 'player', _id: playerID, _online: true});
+ return (players && players.length > 0);
+ });
+ };
+ };
+ return playerID;
+ };
+
+ /**
+ * A function to return the specified player ID, or
+ * the first live player who controls the character,
+ * or the first live player who controls the token
+ * representing a character, or senderId, or the GM.
+ */
+
+ LibFunctions.fixSenderId = function( args, selected, senderId ) {
+
+ let playerID = args[0] || (selected && selected.length ? selected[0]._id : senderId),
+ playerObj = getObj('player',playerID);
+ if (!playerObj) playerID = LibFunctions.checkPlayersLive( getObj('character',args[0]) );
+ if (!playerID) playerID = LibFunctions.checkPlayersLive( LibFunctions.getCharacter(args[0]) );
+
+ return playerID || senderId;
+ };
+
+ /*
+ * Parse a data string for attribute settings
+ */
+
+ LibFunctions.parseData = function( attributes, reSpecs, def=true ) {
+
+// const txtObj = _.object([...txt.replace(/[\r\n]/g,'').replace(/\}\}\}/g,'} }}').matchAll(/\{\{(.+?)=(.*?)\}\}/g)].map(v => v.slice(1)).map(v => [v[0].replace(/[-\s]/g,'_').toLowerCase(),v[1]]));
+ var parsedData = {},
+ val;
+
+ _.each( reSpecs, spec => {
+ val = attributes.match(spec.re);
+ if (!!val && val.length>1 && val[1].length) {
+ parsedData[spec.field] = val[1];
+ } else if (!def) {
+ parsedData[spec.field] = undefined;
+ } else {
+ parsedData[spec.field] = spec.def;
+ }
+ });
+ return parsedData;
+ }
+
+ /*
+ * Follow an inheritance chain of Class or Race database objects and
+ * consolidate their parsed data and attribute specifications
+ */
+
+ LibFunctions.resolveData = function( name, dBase, reThisData, quals=[], defBase=true, doneList=[] ) {
+
+ var thisObj, thisSpecs, baseObj, thisData, thisAttr, parsedData,
+ baseData = [],
+ baseParsed = LibFunctions.parseData( '', reClassSpecs, defBase ),
+ baseAttr = LibFunctions.parseData( '', reAttr, defBase ),
+ debugging = false; //(name.dbName() === 'bronzedragon');
+
+ if (!name || !name.trim().length || doneList.includes(name.dbName())) {if (debugging) log('resolveData: no name or already processed '+name); return [baseParsed,baseAttr,baseData];}
+ thisObj = LibFunctions.abilityLookup( dBase, name, null, true );
+ if (!thisObj.obj) {if (debugging)log('resolveData: no definition of '+name+' in '+dBase);return [baseParsed,baseAttr,baseData];}
+ doneList.push(name.dbName());
+ thisSpecs = thisObj.specs();
+ if (!thisSpecs || !thisSpecs[0]) {if (debugging)log('resolveData: no Specs in definition of '+name);return [baseParsed,baseAttr,baseData];}
+ [baseParsed,baseAttr,baseData] = LibFunctions.resolveData( thisSpecs[0][4], dBase, reThisData, quals, defBase, doneList );
+ thisData = thisObj.data(reThisData);
+ if (!thisData || !thisData[0]) {if (debugging)log('resolveData: no data in definition of '+name+', thisData.length = '+(!thisData ? 0 : thisData.length));return [baseParsed,baseAttr,baseData];}
+ _.each( quals, (q,k) => thisData[0][0] = thisData[0][0].replace(new RegExp('\\?\\?'+k,'g'),q));
+ if (debugging) log('resolveData: quals = '+quals+', after ??# replacement, thisData[0][0] = '+thisData[0][0]);
+ thisData[0][0] = thisData[0][0].replace(/\?\?\d/g,'0');
+ parsedData = LibFunctions.parseData( thisData[0][0], reClassSpecs, false );
+ thisAttr = LibFunctions.parseData( parsedData.cattr+',', reAttr, false );
+ if (baseParsed) {
+ if (!parsedData.cattr) {
+ parsedData.cattr = baseParsed.cattr;
+ thisAttr = baseAttr;
+ } else if (baseAttr) {
+ thisAttr = _.mapObject(thisAttr, (attr,k) => attr == '-' ? '' : (!_.isUndefined(attr) ? attr : baseAttr[k]));
+ }
+ parsedData = _.mapObject(parsedData, (attr,k) => attr == '-' ? '' : (!_.isUndefined(attr) ? attr : baseParsed[k]));
+ }
+ if (debugging)log('resolveData: concatinating '+thisSpecs[0][4]+' baseData = '+baseData+'\nwith '+name+' thisData = '+thisData);
+ baseData.shift();
+ if (parsedData.numpowers && parsedData.numpowers[0]!=='=') thisData = thisData.concat(baseData);
+ if (debugging)log('resolveData: result is '+thisData.length+' long = '+thisData);
+ return [parsedData,thisAttr,thisData];
+ }
+
+ /*
+ * Function to replace special characters in a string
+ */
+
+ LibFunctions.parseStr = function(str,replaced=replacers){
+ return replaced.reduce((m, rep) => m.replace(rep[0], rep[1]), str);
+ }
+
+ /**
+ * Get valid character from a tokenID
+ */
+
+ LibFunctions.getCharacter = function( tokenID, silent=true ) {
+
+ var curToken,
+ charID,
+ charCS;
+
+ if (!tokenID) {
+ if (!silent) LibFunctions.sendError('Invalid token_id in arguments');
+ return undefined;
+ };
+
+ charCS = getObj( 'character', tokenID );
+ if (charCS) return charCS;
+
+ curToken = getObj( 'graphic', tokenID );
+
+ if (!curToken) {
+ if (!silent) LibFunctions.sendError('Invalid token_id in arguments');
+ return undefined;
+ };
+
+ charID = curToken.get('represents');
+
+ if (!charID) {
+ if (!silent) LibFunctions.sendError(('The token "'+curToken.get('name')+'" does not represent a character sheet'));
+ return undefined;
+ };
+
+ charCS = getObj('character',charID);
+
+ if (!charCS) {
+ if (!silent) LibFunctions.sendError(('The token "'+curToken.get('name')+'" does not represent a character sheet'));
+ return undefined;
+ };
+ return charCS;
+ };
+
+ /*
+ * Get Thac0 from the right place for this token. This should be from
+ * Bar2 current value on the token (to support multi-token monsters affected
+ * individually by +/- magic impacts on thac0) but checks if another bar allocated
+ * or, if none are, get from character sheet (monster or character)
+ */
+
+ LibFunctions.getTokenValue = function( curToken, tokenBar, field, altField, thac0_base ) {
+
+ var charCS = LibFunctions.getCharacter(curToken.id),
+ attr = field[0].toLowerCase(),
+ altAttr = altField ? altField[0].toLowerCase() : 'EMPTY',
+ property = field[1],
+ token_property = (property.toLowerCase() == 'current' ? 'value' : 'max'),
+ linkedToken = false,
+ barName, attrVal, attrObj, attrName, tokenField,
+ fieldIndex = state.RPGMaster.tokenFields.indexOf( field[0] );
+
+ if (!charCS) {return undefined;}
+
+ if (_.some( ['bar2_link','bar1_link','bar3_link'], linkName=>{
+ let linkID = curToken.get(linkName);
+ tokenField = linkName;
+ barName == '';
+ if (linkID && linkID.length) {
+ linkedToken = true;
+ attrObj = getObj('attribute',linkID);
+ if (attrObj) {
+ attrName = attrObj.get('name').toLowerCase();
+ barName = tokenField.substring(0,4);
+ return (attrName == attr) || (attrName == altAttr);
+ }
+ }
+ return false;
+ })) {
+ attrVal = curToken.get(barName+'_'+token_property);
+// attrObj.set(property,attrVal);
+ attrVal = !isNaN(attrVal) ? parseFloat(attrVal) : undefined;
+ }
+ if (isNaN(attrVal) && !linkedToken && fieldIndex >= 0) {
+ attrVal = parseFloat(curToken.get('bar'+(fieldIndex+1)+'_'+token_property));
+ attrName = barName = 'bar'+(fieldIndex+1);
+ }
+ if (isNaN(attrVal) && attr.includes('thac0')) {
+ if (!thac0_base) thac0_base = ['thac0-base','current','20'];
+ attrVal = parseFloat(LibFunctions.attrLookup( charCS, thac0_base ));
+ attrName = thac0_base[0];
+ barName = undefined;
+ }
+ if (isNaN(attrVal)) {
+ attrVal = parseFloat(LibFunctions.attrLookup( charCS, field ));
+ attrName = field[0];
+ barName = undefined;
+ }
+ if (isNaN(attrVal) && altField) {
+ attrVal = parseFloat(LibFunctions.attrLookup( charCS, altField ));
+ attrName = altField[0];
+ }
+ return {val:attrVal, name:(isNaN(attrVal) ? undefined : attrName), barName:(barName || attrName)};
+ }
+
+ /*
+ * Create an array of class objects for the classes
+ * of the specified character.
+ */
+
+ LibFunctions.classObjects = function( charCS, senderId ) {
+
+ try {
+ var charLevels = ((_.filter( fields, (elem,l) => {return l.toLowerCase().includes('_level')}).filter( elem => 0 < (LibFunctions.attrLookup( charCS, elem ) || 0))) || fields.Fighter_level);
+ var charClass, baseClass, charLevel, dB = fields.ClassDB;
+
+ var classDef = _.filter( classLevels, a => {
+ return _.some( charLevels, b => {
+ return (a[1].includes(b[0]))
+ })
+ })
+ .map( elem => {
+ charClass = LibFunctions.attrLookup(charCS,elem[0]) || '';
+ charLevel = LibFunctions.attrLookup( charCS, elem[1] ) || 0;
+ if (elem[0][0] == fields.Wizard_class[0]) {
+ baseClass = 'wizard';
+ } else if (elem[0][0] == fields.Priest_class[0]) {
+ baseClass = 'priest';
+ } else if (elem[0][0] == fields.Rogue_class[0]) {
+ baseClass = 'rogue';
+ } else if (elem[0][0] == fields.Psion_class[0]) {
+ baseClass = 'psion';
+ } else if (elem[1][0] == fields.Monster_hitDice[0]) {
+ let monsterHD = parseInt(LibFunctions.attrLookup( charCS, fields.Monster_hitDice )) || 0,
+ monsterHPplus = parseInt(LibFunctions.attrLookup( charCS, fields.Monster_hpExtra )) || 0,
+ monsterIntField = LibFunctions.attrLookup( charCS, fields.Monster_int ) || '',
+ monsterIntNum = parseInt((monsterIntField.match(/\d+/)||["1"])[0]) || 0,
+ monsterInt = monsterIntField.toLowerCase().includes('non') ? 0 : monsterIntNum;
+ charLevel = Math.ceil((monsterHD + Math.ceil(monsterHPplus/4)) / (monsterInt != 0 ? 1 : 2)); // Calculation based on p65 of DMG
+ baseClass = 'creature';
+ if (!charClass || !charClass.length) {
+ charClass = LibFunctions.attrLookup(charCS,fields.Race);
+ dB = fields.RaceDB;
+ };
+ if (!charClass || !charClass.length) {
+ charClass = 'creature';
+ dB = fields.ClassDB;
+ };
+
+ } else {
+ baseClass = 'warrior';
+ }
+ let classObj = LibFunctions.abilityLookup( dB, charClass, charCS, true );
+ if (!charClass.length || !classObj.obj) {
+ charClass = baseClass;
+ classObj = LibFunctions.abilityLookup( dB, baseClass, charCS, true );
+ }
+ return {name:charClass.dbName(), dB:classObj.dB, base:baseClass.dbName(), dBbase:fields.ClassDB, level:charLevel, obj:classObj.obj};
+ });
+// if (_.isUndefined(classDef) || !classDef.length) classDef = [{name:'creature', base:'warrior', level:0, obj:LibFunctions.abilityLookup( fields.ClassDB, 'creature', charCS ).obj}];
+// classDef = classDef.map(c => {[c.classData] = LibFunctions.resolveData(c.name, c.dB, reData);return c});
+ if (_.isUndefined(classDef) || !classDef.length) classDef = [{name:'creature', dB:fields.RaceDB, base:'warrior', dBbase:fields.ClassDB, level:0, obj:LibFunctions.abilityLookup( fields.ClassDB, 'creature', charCS ).obj}];
+ classDef = classDef.map(c => {[c.classData,c.attrData,c.rawData] = LibFunctions.resolveData((c.name || charClass), (c.dB || dB), reData);return c});
+
+ } catch (e) {
+ LibFunctions.sendCatchError( 'RPGM Library',(senderId ? msg_orig[senderId] : null),e,'RPGM Library classObjects()');
+ }
+ return classDef;
+ };
+
+ /*
+ * Determine if a particular item type or superType is an
+ * allowed type for a specific class.
+ */
+
+ LibFunctions.classAllowedItem = function( charCS, wname, wt, wst, allowedItemsByClass ) {
+
+ wt = wt ? wt.dbName() : '-';
+ wst = wst ? wst.dbName() : '-';
+ wname = wname ? wname.dbName() : '-';
+ allowedItemsByClass = allowedItemsByClass.dbName();
+
+ var typeDefaults = {weaps:'any',ac:'any',sps:'any',spm:'',spb:'',align:'any',race:'any'},
+ itemType = !_.isUndefined(typeDefaults[allowedItemsByClass]) ? allowedItemsByClass : 'weaps',
+ forceFalse = false,
+ reItemSpecs = { weapons: reClassSpecs.weapons,
+ armour: reClassSpecs.armour,
+ majorsphere:reClassSpecs.majorsphere,
+ minorsphere:reClassSpecs.minorsphere,
+ bannedsphere:reClassSpecs.bannedsphere,
+ alignment: reClassSpecs.alignment,
+ race: reClassSpecs.race,
+ };
+
+ var classAllowed = LibFunctions.classObjects( charCS ).some( elem => {
+ if ([wt,wst].includes('innate')) return true;
+
+ if (!elem.obj) return false;
+ let allowedItems = (elem.classData[itemType] || typeDefaults[itemType]).toLowerCase().replace(reIgnore,'').split('|');
+ return allowedItems.reduce((p,c) => {
+ let item = '!+'.includes(c[0]) ? c.slice(1) : c,
+ found = item.includes('any') || (wt.includes(item) || wst.includes(item) || (wt=='-' && wst=='-' && wname.includes(item)));
+ forceFalse = (forceFalse || (c[0] === '!' && found)) && !(c[0] === '+' && found);
+ return (p || found) && !forceFalse;
+ }, false);
+ }),
+ raceObj = LibFunctions.abilityLookup( fields.RaceDB, (LibFunctions.attrLookup( charCS, fields.Race ) || 'human') ),
+ raceAllowed = true;
+
+ forceFalse = false;
+ if (raceObj.obj) {
+ let allowedItems = LibFunctions.parseData((raceObj.data(/}}\s*?(?:Class|Race)Data\s*?=.*?{{/im)[0][0] || ''),reItemSpecs)[itemType];
+ raceObj = LibFunctions.abilityLookup( fields.RaceDB, (raceObj.specs()[0] || [])[4], charCS, true );
+ if (raceObj.obj) {
+ allowedItems += (allowedItems && allowedItems.length ? '|' : '')+LibFunctions.parseData((raceObj.data(/}}\s*?(?:Class|Race)Data\s*?=(.*?){{/im)[0][0] || ''),reItemSpecs)[itemType];
+ }
+ if (!allowedItems || !allowedItems.length) {
+ allowedItems = typeDefaults[itemType];
+ }
+ allowedItems = allowedItems.dbName().split('|');
+ raceAllowed = allowedItems.reduce((p,c) => {
+ let item = '!+'.includes(c[0]) ? c.slice(1) : c,
+ found = item.includes('any') || (wt.includes(item) || wst.includes(item) || (wt=='-' && wst=='-' && wname.includes(item)));
+ forceFalse = (forceFalse || (c[0] === '!' && found)) && !(c[0] === '+' && found);
+ return (p || found) && !forceFalse;
+ }, false);
+ };
+ return (classAllowed && raceAllowed);
+ };
+
+ /*
+ * For magic items that have stored spells or powers, extract
+ * these from the MI definition and create or update the
+ * related character sheet database attribute.
+ */
+
+ LibFunctions.addMIspells = function( dbCS, dbItem ) {
+
+ var itemData = dbItem.body.match(/}}[\s\w\-]*?(? {
+ let parsedData = LibFunctions.parseData( spell[0], reSpellSpecs );
+ if (parsedData && parsedData.spell && ['MU','PR','PW','AB'].includes(parsedData.spell.toUpperCase())) {
+ let spellType = parsedData.spell.toUpperCase();
+ spellSet[spellType][0].push(parsedData.name);
+ spellSet[spellType][1].push((spellType == 'PW') ? (parsedData.perDay+'.'+parsedData.perDay) : (parsedData.level+'.0'));
+ }
+ });
+// if (spellSet.PW[0].length || LibFunctions.attrLookup( dbCS, [fields.ItemPowersList[0]+dbItem.name,fields.ItemPowersList[1]], null, -1, 0, false, false )) {
+ if (spellSet.PW[0].length) {
+ LibFunctions.setAttr( dbCS, [fields.ItemPowersList[0]+dbItem.name,fields.ItemPowersList[1]], spellSet.PW[0].join() );
+ if (spellSet.PW[1].length) {
+ LibFunctions.setAttr( dbCS, [fields.ItemPowerValues[0]+dbItem.name,fields.ItemPowerValues[1]], spellSet.PW[1].join() );
+ }
+ }
+// if (spellSet.PR[0].length || LibFunctions.attrLookup( dbCS, [fields.ItemPRspellsList[0]+dbItem.name,fields.ItemPRspellsList[1]], null, -1, 0, false, false )) {
+ if (spellSet.PR[0].length) {
+ LibFunctions.setAttr( dbCS, [fields.ItemPRspellsList[0]+dbItem.name,fields.ItemPRspellsList[1]], spellSet.PR[0].join() );
+ if (spellSet.PR[1].length) {
+ LibFunctions.setAttr( dbCS, [fields.ItemPRspellValues[0]+dbItem.name,fields.ItemPRspellValues[1]], spellSet.PR[1].join() );
+ }
+ }
+// if (spellSet.MU[0].length || LibFunctions.attrLookup( dbCS, [fields.ItemMUspellsList[0]+dbItem.name,fields.ItemMUspellsList[1]], null, -1, 0, false, false )) {
+ if (spellSet.MU[0].length) {
+ LibFunctions.setAttr( dbCS, [fields.ItemMUspellsList[0]+dbItem.name,fields.ItemMUspellsList[1]], spellSet.MU[0].join() );
+ if (spellSet.MU[1].length) {
+ LibFunctions.setAttr( dbCS, [fields.ItemMUspellValues[0]+dbItem.name,fields.ItemMUspellValues[1]], spellSet.MU[1].join() );
+ }
+ }
+ return spellSet;
+ }
+
+ /**
+ * String together the value of the specified item type from
+ * all databases with the specified root name, separated
+ * by |. This is used to get a complete list of available
+ * magic spell or item macros across all databases of a
+ * specific type.
+ **/
+
+ LibFunctions.getMagicList = function( rootDB, mapObj, objType, senderId, defList='', other=false, otherMsg='Specify', alphabet=false ) {
+
+ objType = _.isArray(objType) ? objType.join().toLowerCase() : objType.toLowerCase();
+ if (!magicList[rootDB] || !magicList[rootDB][objType] || magicList[rootDB][objType].alpha != alphabet) {
+
+ var list = [],
+ alphaList = [],
+ rDB = rootDB.toLowerCase().replace(/-/g,'_'),
+ typeList;
+
+ var addItemToList = function( objIndex, objName, mapObj, objType ) {
+ var error = false;
+ try {
+ var typeList;
+ if (objIndex[0].length) {
+ let obj = getObj('ability',objIndex[0]);
+// log('addItemToList: adding '+objName+', _.isUndefined(obj) = '+_.isUndefined(obj));
+ if (!obj) return true;
+ let objDef = obj.get('action');
+ let specs = objDef.match(reSpecs);
+ specs = specs ? [...('['+specs[0]+']').matchAll(reSpecsAll)] : [];
+
+ outer_block: {
+ for (const s of specs) {
+ typeList = s[2].dbName().split('|');
+ for (const t of typeList) {
+ if (t==='magic') continue;
+ if ((mapObj[t] && !!mapObj[t].type && objType.includes(mapObj[t].type))
+ || (!mapObj[t] && mapObj.miscellaneous && objType.includes(mapObj.miscellaneous.type))) {
+ let listName = obj.get('name').dispName();
+ let listQuery = !mapObj[t] ? '' : (!mapObj[t].query ? '' : '%%'+mapObj[t].query).replace(/%/g,'%%')
+ .replace(/\&/g,'&')
+ .replace(/\?/g,'?')
+ .replace(/{/g,'&#123;')
+ .replace(/}/g,'&#125;')
+ .replace(/\|/g,'&#124;')
+ .replace(/\,/g,'&#44;');
+ list.push(listName+(alphabet ? ',' : ',')+listName+listQuery);
+ break outer_block;
+ }
+ }
+ }
+ }
+ } else {
+ typeList = dbNames[objIndex[2]].db[objIndex[3]].type.dbName().split('|');
+
+ for (const t of typeList) {
+ if (t === 'magic') continue;
+ if ((mapObj[t] && !!mapObj[t].type && objType.includes(mapObj[t].type))
+ || (!mapObj[t] && mapObj.miscellaneous && objType.includes(mapObj.miscellaneous.type))) {
+ let listName = dbNames[objIndex[2]].db[objIndex[3]].name.dispName();
+ let listQuery = !mapObj[t] ? '' : (!mapObj[t].query ? '' : '%%'+mapObj[t].query).replace(/%/g,'%%')
+ .replace(/\&/g,'&')
+ .replace(/\?/g,'?')
+ .replace(/{/g,'&#123;')
+ .replace(/}/g,'&#125;')
+ .replace(/\|/g,'&#124;')
+ .replace(/\,/g,'&#44;');
+ list.push(listName+(alphabet ? ',' : ',')+listName+listQuery);
+ break;
+ }
+ }
+ }
+ } catch (e) {
+ log('LibFunction getMagicList: JavaScript '+e.name+': '+e.message+' while processing object '+objName);
+ LibFunctions.sendCatchError('RPGMaster Library',(senderId ? msg_orig[senderId] : null),e);
+ error = true;
+
+ } finally {
+ return error;
+ }
+ };
+
+ if (_.isUndefined(DBindex[rDB])) {
+ for (const db of _.keys(DBindex)) {
+ if (rDB.startsWith(db)) {
+ rDB = db;
+ break;
+ }
+ }
+ }
+ _.each( DBindex[rDB], (objIndex,objName) => {
+ addItemToList( objIndex, objName, mapObj, objType );
+ });
+ if (!list.length || !list[0].length) {
+ list = defList.split('|');
+ }
+ list = _.uniq(list.filter( list => !!list ).sort(),true);
+
+ if (alphabet) {
+ for (let i=65; i<=90; i++) {
+ let subList = list.filter( n => n.toUpperCase().charCodeAt(0)==i )
+ .concat(list.filter( n => n.toUpperCase().startsWith('POTION OF ') && n.toUpperCase().charCodeAt(10)==i ),
+ list.filter( n => n.toUpperCase().startsWith('RING OF ') && n.toUpperCase().charCodeAt(8)==i ),
+ list.filter( n => n.toUpperCase().startsWith('SCROLL OF ') && n.toUpperCase().charCodeAt(10)==i ));
+ if (subList && subList.length) {
+ if (subList.length === 1) subList.push(subList[0]);
+ alphaList.push(String.fromCharCode(i)+',?{Choose from |'+(subList.join('|'))+'}');
+ }
+ };
+ list = alphaList;
+ }
+ if (other) {
+// if (!alphabet) list = list.map( e => e + ',' + e );
+ list.push('Other,?{'+otherMsg+'}');
+ }
+
+ if (!magicList[rootDB]) magicList[rootDB] = {};
+ if (!magicList[rootDB][objType]) magicList[rootDB][objType] = {};
+ magicList[rootDB][objType].list = list.join('|');
+ magicList[rootDB][objType].alpha = alphabet;
+ }
+// log('getMagicList: magicList['+rootDB+']['+objType+'] = '+magicList[rootDB][objType].list);
+ return magicList[rootDB][objType].list;
+ };
+
+ /**
+ * Get the displayable type of an item, derived from the
+ * item's database "Specs" field, for display in search-able
+ * containers
+ **/
+
+ LibFunctions.getShownType = function( miObj ) {
+ var specs = miObj.specs(),
+ mi, miType;
+ if (specs) {
+ let miClasses = specs.reduce((a,b) => a.concat([b[2]]), []).join('|');
+ let lowerMI = miClasses.toLowerCase();
+
+ mi = miClasses.split('|').find(itemClass => _.isUndefined(miTypeLists[itemClass.dbName()]) || !(['weapon','ammo','armour','armor'].includes(miTypeLists[itemClass.dbName()].type)));
+ if (!mi) {
+ mi = miClasses.split('|').find(itemClass => ['weapon','ammo','armour','armor'].includes(miTypeLists[itemClass.dbName()].type));
+ }
+ miType = miTypeLists[mi.dbName()] ? miTypeLists[mi.dbName()].type : 'miscellaneous';
+
+ switch (miType) {
+ case 'weapon':
+ case 'ammo':
+ mi = (specs.find(itemSpecs => itemSpecs[2].toLowerCase().includes(mi.toLowerCase())) || ['','','','','mi'])[4];
+ break;
+ case 'armour':
+ case 'armor':
+ mi = (specs.find(itemSpecs => itemSpecs[2].toLowerCase().includes(mi.toLowerCase())) || ['','mi'])[1];
+ break;
+ case 'miscellaneous':
+ let data = miObj.data(/}}[\s\w\-]*?(? itemSpecs[2].toLowerCase().includes(mi.toLowerCase())) || ['','','','','mi'])[4];
+ }
+ break;
+ }
+ }
+ return mi.replace(/[-_]/g,' ').replace(/\|/g,'/');
+ };
+
+ /**
+ * Find an item identified as a Power, but which might actually
+ * be in a different database, as powers can be anything magical
+ **/
+
+ LibFunctions.findPower = function( charCS, power, silent=false, def=true ) {
+
+ if (!power || !power.length) return LibFunctions.abilityLookup( fields.PowersDB, '', charCS, true, false );
+
+ const dbList = [['PW-',fields.PowersDB],['MU-',fields.MU_SpellsDB],['PR-',fields.PR_SpellsDB],['MI-',fields.MagicItemDB]];
+
+ var powerType = power.substring(0,3),
+ powerLib;
+
+ if (_.some(dbList,dB=>dB[0]===powerType.toUpperCase())) power = power.slice(powerType.length);
+
+ if (!_.some(dbList, dB => {
+ if (powerType.toUpperCase() === dB[0]) {
+ powerLib = LibFunctions.abilityLookup( dB[1], power, null, true, def );
+ return true;
+ } else {
+ return false;
+ }
+ })) {
+ _.some(dbList, dB => {
+ powerLib = LibFunctions.abilityLookup( dB[1], power, null, true, false );
+ return !_.isUndefined(powerLib.obj);
+ });
+ };
+ if (!powerLib.obj) {
+ powerLib = LibFunctions.abilityLookup( fields.PowersDB, power, charCS, silent, def );
+ }
+ powerLib.name = power;
+ return powerLib;
+ }
+
+ /**
+ * Find and return total level of a character
+ **/
+
+ LibFunctions.characterLevel = function( charCS ) {
+ var level = parseInt((LibFunctions.attrLookup( charCS, fields.Total_level ) || 0),10);
+ if (!level) {
+ level = Math.max(((parseInt((LibFunctions.attrLookup( charCS, fields.Monster_hitDice ) || 0),10)
+ + ((parseInt((LibFunctions.attrLookup( charCS, fields.Monster_hpExtra ) || 0),10) >= 3) ? 1 : 0)) || 0),
+ ((parseInt((LibFunctions.attrLookup( charCS, fields.Fighter_level ) || 0),10)
+ + parseInt((LibFunctions.attrLookup( charCS, fields.Wizard_level ) || 0),10)
+ + parseInt((LibFunctions.attrLookup( charCS, fields.Priest_level ) || 0),10)
+ + parseInt((LibFunctions.attrLookup( charCS, fields.Rogue_level ) || 0),10)
+ + parseInt((LibFunctions.attrLookup( charCS, fields.Psion_level ) || 0),10)) || 0));
+ }
+ return level;
+ }
+
+ /*
+ * Find and return the level for spell casting.
+ * MU: Wizard_level
+ * PR: Priest_level
+ * POWER or MI: all levels added
+ */
+
+ LibFunctions.caster = function( charCS, casterType ) {
+
+ var level=0, castingLevel=0, charClass, castingClass;
+
+ if (casterType == 'MI' || casterType == 'POWER' || casterType == 'PW') {
+ level = LibFunctions.characterLevel( charCS );
+ return {lv:level,cl:'',clv:level,ccl:''};
+ }
+
+ for (const casterData of casterLevels) {
+ charClass = (LibFunctions.attrLookup( charCS, casterData[0] ) || '');
+ castingClass = charClass.dbName().replace(reIgnore,'');
+ level = LibFunctions.attrLookup(charCS,casterData[1]) || 0;
+// log('caster: castingClass = '+castingClass+': exists = '+!(_.isUndefined(spellsPerLevel[castingClass]) || _.isUndefined(spellsPerLevel[castingClass][casterType]))+', level = '+level);
+ if (level > 0 && (_.isUndefined(spellsPerLevel[castingClass]) || _.isUndefined(spellsPerLevel[castingClass][casterType]))) {
+ if (casterType == 'MU' && casterData[0][0] == fields.Wizard_class[0]) {
+ castingClass = 'WIZARD';
+ } else if (casterType == 'PR' && casterData[0][0] == fields.Priest_class[0]) {
+ castingClass ='PRIEST';
+ } else {
+ level = 0;
+ }
+ }
+ if (level > 0) break;
+ }
+ if (level>0 && castingClass) {
+ castingLevel = Math.min(Math.max((1+parseInt(level) - spellsPerLevel[castingClass][casterType][0][1]),0),spellsPerLevel[castingClass][casterType][0][2]);
+ if (castingLevel <= 0) castingLevel = -1;
+ };
+// log('caster: charClass = '+charClass+', castingClass = '+castingClass+', level = '+level+', castingLevel = '+castingLevel);
+ return {lv:level,cl:charClass,clv:castingLevel,ccl:castingClass};
+ };
+
+ /* ---------------------------- Game Rule-Specific Functions -------------------------------- */
+
+ /*
+ * Return the base Thac0 of a character based on class & level
+ */
+
+ LibFunctions.handleGetBaseThac0 = function( charCS, type ) {
+
+ if (!type) {
+ return Math.min( LibFunctions.attrLookup( charCS, fields.MonsterThac0 ) || 20,
+ baseThac0table[0][LibFunctions.attrLookup( charCS, fields.Fighter_level ) || 0],
+ baseThac0table[1][LibFunctions.attrLookup( charCS, fields.Wizard_level ) || 0],
+ baseThac0table[2][LibFunctions.attrLookup( charCS, fields.Priest_level ) || 0],
+ baseThac0table[3][LibFunctions.attrLookup( charCS, fields.Rogue_level ) || 0],
+ baseThac0table[4][LibFunctions.attrLookup( charCS, fields.Psion_level ) || 0]
+ );
+ } else if (!isNaN(type)) {
+ return parseInt(type);
+ } else {
+ type = type.split('=');
+ let fromType = type[0].split('|'),
+ toType = (type[1].toUpperCase() || 'F')[0],
+ classNum = toType === 'O' ? 4
+ :(toType === 'W' ? 1
+ :(toType === 'P' ? 2
+ :(toType === 'R' ? 3
+ : 0 ))),
+ thac0 = 20,
+ field;
+
+ _.each( fromType, t => {
+ switch (t[0].toUpperCase()) {
+ default: field = fields.Fighter_level;break;
+ case 'W': field = fields.Wizard_level; break;
+ case 'P': field = fields.Priest_level; break;
+ case 'R': field = fields.Rogue_level; break;
+ case 'O': field = fields.Psion_level; break;
+ }
+ thac0 = Math.min( thac0, baseThac0table[classNum][LibFunctions.attrLookup( charCS, field ) || 0]);
+ });
+ return thac0;
+ }
+ }
+
+ /*
+ * Parse the Class Databases to update internal rule tables with
+ * any changes held for specific Class definitions
+ */
+
+ LibFunctions.parseClassDB = function(forceUpdate=false) {
+
+ var doParse = function( rootDB, saveMods ) {
+ let isClass = rootDB === fields.ClassDB,
+ indexDB = rootDB.toLowerCase().replace(/-/g,'_');
+ if (!DBindex[indexDB]) return;
+ for (const ClassName in DBindex[indexDB]) {
+ let parsedData, parsedAttr, classData;
+
+ let def = LibFunctions.abilityLookup(rootDB, ClassName),
+ type = !def.obj ? '' : def.obj[1].type,
+ classSpecs = def.specs(reSpecs) || [['','','','','']],
+ isCreature = type.toLowerCase().includes('creature') || (classSpecs && classSpecs[0] && classSpecs[0][4] && String(classSpecs[0][4]).toLowerCase().includes('creature'));
+
+ [parsedData,parsedAttr,classData] = LibFunctions.resolveData( ClassName, rootDB, /}}\s*?(?:Class|Race)Data\s*?=(.*?){{/im, [], false );
+
+ if (isClass) {
+ let classType;
+ if (classSpecs && !_.isNull(classSpecs)) {
+ if (classSpecs.some( s => {
+ if (s && s.length >= 5) {
+ classType = (s[1]||'').dbName();
+ return (((s[4]||'').dbName() == 'wizard' ) && !ordMU.includes(classType) && (parsedData.specmu == 1));
+ }
+ return false;
+ })) {
+ if (!specMU.includes(classType)) specMU.push(classType);
+ } else {
+ if (!ordMU.includes(classType)) ordMU.push(classType);
+ };
+ };
+ }
+
+ if (classData) {
+ for (let r=0; r {
+ pen = pen.toLowerCase().split('=');
+ pen[0] = pen[0].dbName();
+ pen[1] = parseInt(pen[1]) || 0;
+ return pen;
+ });
+ }
+ let rowArray = rowData.toLowerCase().replace(/\[/g,'').replace(/\]/g,'').split(','),
+ svlArray = rowArray.filter(elem => elem.startsWith('svl'));
+
+ if (svlArray && svlArray.length) {
+ svlArray.sort((a,b)=>{parseInt((a.match(/svl(\d+):/)||[0,0])[1])-parseInt((b.match(/svl(\d+):/)||[0,0])[1]);});
+ saveLevels[name] = [];
+ baseSaves[name] = [];
+ let oldLevel = 0,
+ baseIndex = 0;
+ svlArray.forEach(svl => {
+ let sv = svl.match(/svl(\d+):([\d\|]+)/),
+ level = parseInt(sv[1] || 0),
+ saves = (sv[2] || '20|20|20|20|20').split('|');
+ saveLevels[name].length = level+1;
+ saveLevels[name].fill(baseIndex,oldLevel,level+1);
+ if (baseIndex == 0 && level != 0) {
+ baseSaves[name].push([16,18,17,20,19]);
+ baseIndex++;
+ }
+ saves.length = 5;
+ baseSaves[name].push(saves);
+ baseIndex++
+ oldLevel = level+1;
+ });
+ };
+ svlArray = rowArray.filter(elem => {return /^\s*sv[a-z]{3}:/.test(elem);});
+ if (svlArray && svlArray.length) {
+ saveMods[name] = {att:'con',par:0.0,poi:0.0,dea:0.0,rod:0.0,sta:0.0,wan:0.0,pet:0.0,pol:0.0,bre:0.0,spe:0.0,str:0.0,con:0.0,dex:0.0,int:0.0,wis:0.0,chr:0.0};
+ svlArray.forEach(svm => {
+ let sv = svm.match(/sv([a-z]{3}):([+-]?\d+\.?\d*|\w{3})(L\d+)?/i);
+ if (sv[1] == 'all') {
+ saveMods[name] = _.mapObject(saveMods[name], (v,k) => {return k != 'att' ? v + (parseFloat(sv[2] || 0) || 0) : v;});
+ } else if (['sav','atr','chk'].includes(sv[1])) {
+ let saves = sv[1] === 'sav' ? saveFormat.Saves : (sv[1] === 'atr' ? saveFormat.Attributes : saveFormat.Checks);
+ _.each(saves, s => saveMods[name][s.tag] = saveMods[name][s.tag] + (parseFloat(sv[2] || 0) || 0));
+ } else {
+ let plv = parseInt(sv[3]) || 1;
+ saveMods[name][sv[1]] = (sv[1] != 'att') ? (String(parseFloat(sv[2] || 0) || 0)+(sv[3] || '')) : (sv[2] || 'con').dbName();
+ }
+ });
+ };
+ svlArray = rowArray.filter(elem => {return /^\s*sv[a-z]{3}\+:/.test(elem);});
+ if (svlArray && svlArray.length) {
+ classSaveMods[name] = {att:'con',par:0.0,poi:0.0,dea:0.0,rod:0.0,sta:0.0,wan:0.0,pet:0.0,pol:0.0,bre:0.0,spe:0.0,str:0.0,con:0.0,dex:0.0,int:0.0,wis:0.0,chr:0.0};
+ svlArray.forEach(svm => {
+ let sv = svm.match(/sv([a-z]{3})\+:([+-]?\d+\.?\d*|\w{3})/);
+ if (sv[1] == 'all') {
+ classSaveMods[name] = _.mapObject(classSaveMods[name], (v,k) => {return k != 'att' ? v + (parseFloat(sv[2] || 0) || 0) : v;});
+ } else if (['sav','atr','chk'].includes(sv[1])) {
+ let saves = sv[1] === 'sav' ? saveFormat.Saves : (sv[1] === 'atr' ? saveFormat.Attributes : saveFormat.Checks);
+ _.each(saves, s => classSaveMods[name][s.tag] = classSaveMods[name][s.tag] + (parseFloat(sv[2] || 0) || 0));
+ } else {
+ classSaveMods[name][sv[1]] = (sv[1] != 'att') ? (parseFloat(sv[2] || 0) || 0) : (sv[2] || 'con').dbName();
+ }
+ });
+ };
+ };
+ };
+ if (isCreature) {
+ if (!clTypeLists[classSpecs[0][2].toLowerCase()]) clTypeLists[classSpecs[0][2].toLowerCase()] = {type:'creature',field:fields.RaceCreatureList,query:''};
+ if (parsedData.query && parsedData.query.length) {
+ let query = LibFunctions.parseStr(parsedData.query).split('|');
+ let question = query.shift();
+ clTypeLists[classSpecs[0][2].toLowerCase()].query = '?{'+question + '|'
+ + query.map( q => {
+ let sq = q.split('%');
+ return sq[0]+','+sq.join('%%');
+ }).join('|')
+ + '}';
+ };
+ };
+ };
+ return;
+ };
+ if (classesParsed && !forceUpdate) return;
+ doParse( fields.ClassDB, classSaveMods );
+ doParse( fields.RaceDB, raceSaveMods );
+ classesParsed = true;
+ LibFunctions.sendFeedback( waitMsgDiv+'RPGMaster is now ready.' );
+
+ return;
+ };
+
+ /*
+ * Scan Race, Class, Level and MI data to set the saving throws table
+ * for a particular Token
+ */
+
+ LibFunctions.handleCheckSaves = function( args, senderId, selected, silent=false ) {
+
+ const blankMods = {par:0,poi:0,dea:0,rod:0,sta:0,wan:0,pet:0,pol:0,bre:0,spe:0,str:0,con:0,dex:0,int:0,wis:0,chr:0,rules:[]},
+ xlate = {att:'Attribute',par:'Paralysis',poi:'Poison',dea:'Death',rod:'Rod',sta:'Staff',wan:'Wand',pet:'Petrify',pol:'Polymorph',bre:'Breath',spe:'Spell',str:'Strength',con:'Constitution',dex:'Dexterity',int:'Intelligence',wis:'Wisdom',chr:'Charisma'},
+ types = {par:'sav',poi:'sav',dea:'sav',rod:'sav',sta:'sav',wan:'sav',pet:'sav',pol:'sav',bre:'sav',spe:'sav',str:'atr',con:'atr',dex:'atr',int:'atr',wis:'atr',chr:'atr'},
+ reSave = /[,\[\s]sv([a-z]{3}):([-\+]?\d+)[,\s\]]/g,
+ reRules = /[,\[\s]rules:(.*?)[,\s\]]/i;
+
+ var tokenID,
+ charCS,
+ attkMenu,
+ msg = '';
+
+ var checkThisSave = function(attkMenu,curToken,senderId,silent) {
+
+ return new Promise(resolve => {
+ try {
+ tokenID = attkMenu ? curToken.id : curToken._id;
+ charCS = LibFunctions.getCharacter( tokenID, true );
+
+ if (!charCS) {
+ return;
+ }
+ var tokenName = getObj('graphic',tokenID).get('name'),
+ classes = LibFunctions.classObjects( charCS ),
+ race = (LibFunctions.attrLookup( charCS, fields.Race ) || 'human').dbName(),
+ ItemNames = LibFunctions.getTableField( charCS, {}, fields.Items_table, fields.Items_name ),
+ saves = [],
+ classSaves, classMods,
+ mods = _.isUndefined(raceSaveMods[race]) ? (_.find(raceSaveMods, (m,k) => race.includes(k)) || raceSaveMods.human) : raceSaveMods[race],
+ raceBonus = _.isUndefined(classSaveMods[race]) ? (_.find(classSaveMods, (m,k) => race.includes(k)) || blankMods) : classSaveMods[race],
+ setFlags = {att:false,par:false,poi:false,dea:false,rod:false,sta:false,wan:false,pet:false,pol:false,bre:false,spe:false,str:false,con:false,dex:false,int:false,wis:false,chr:false},
+ miMods = {},
+ attribute, attrVal, item,
+ addedText = {},
+ itemText = '',
+ content = silent ? '' : '&{template:'+fields.defaultTemplate+'}';
+
+ content += silent ? '' : '{{name='+tokenName+'\'s Saving Throws}}';
+
+ classes.forEach( c => {
+ if (!saveLevels[c.name]) {
+ classSaves = baseSaves[c.base][saveLevels[c.base][Math.min(c.level,saveLevels[c.base].length-1)]];
+ } else {
+ classSaves = baseSaves[c.name][saveLevels[c.name][Math.min(c.level,saveLevels[c.name].length-1)]];
+ }
+ if (!saves || !saves.length) {
+ saves = classSaves;
+ } else {
+ saves = saves.map((v,k)=> Math.min(v,classSaves[k]));
+ }
+ if (!silent) itemText += '{{'+c.obj[1].name+'=Level '+c.level+'='+classSaves+'}}';
+ });
+ switch (mods.att.toLowerCase()) {
+ case 'str':
+ attribute = fields.Strength;
+ break;
+ case 'dex':
+ attribute = fields.Dexterity;
+ break;
+ case 'con':
+ attribute = fields.Constitution;
+ break;
+ case 'int':
+ attribute = fields.Intelligence;
+ break;
+ case 'wis':
+ attribute = fields.Wisdom;
+ break;
+ case 'chr':
+ attribute = fields.Charisma;
+ break;
+ default:
+ attribute = undefined;
+ };
+ if (attribute) {
+ attrVal = parseInt(LibFunctions.attrLookup( charCS, attribute )) || -1;
+ } else {
+ attrVal = -1;
+ }
+ if (!silent && _.some(mods,(m,k)=>!!m && k!='att')) itemText += '{{'+LibFunctions.attrLookup( charCS, fields.Race )+'=';
+ mods = _.mapObject(mods,(v,k) => {
+ if (k == 'att') {
+ return v;
+ } else {
+ if (!silent && v != 0) itemText += xlate[k]+':'+(Math.floor(attrVal != -1 ? (attrVal/v) : v)+raceBonus[k])+', ';
+ return Math.floor(v != 0 ? (attrVal != -1 ? (attrVal/v) : v) : 0)+raceBonus[k];
+ }
+ });
+ if (!silent && _.some(mods,(m,k)=>!!m && k!='att')) itemText += '}}';
+
+ let dexBonus = 0-(parseInt(LibFunctions.attrLookup( charCS, fields.Dex_acBonus )) || 0);
+ if (dexBonus) {
+ mods.dex += dexBonus;
+ itemText += '{{Dexterity of '+LibFunctions.attrLookup( charCS, fields.Dexterity )+'='+(dexBonus > 0 ? 'Bonus' : 'Penalty')+' of '+dexBonus+'}}';
+ }
+
+ classes.forEach( c => {
+ classMods = classSaveMods[c.name] || classSaveMods[c.base] || classSaveMods.undefined;
+ classMods = _.mapObject(classMods,v=>{
+ let plv = (v || '').match(/([-\+]?\d+)L(\d+)/i);
+ if (plv && plv[2] != 0) v = plv[1] * Math.ceil(c.level/plv[2]);
+ return parseInt(v);
+ });
+ if (!mods && !mods.length) {
+ mods = classMods;
+ } else {
+ mods = _.mapObject(mods,(v,k)=>{return k != 'att' ? v+classMods[k] : v});
+ }
+ if (classMods.att) classMods.att = classMods.par;
+ if (!silent && _.some(classMods)) {
+ itemText += '{{'+c.name+' Mods=';
+ let vals = _.chain(classMods).values().uniq().value();
+ if (vals.length == 1) {
+ itemText += 'All mods:'+vals[0];
+ } else {
+ _.mapObject(classMods,(v,k)=> ((k!='att' && v) ? (itemText += xlate[k]+':'+v+' ') : ''));
+ }
+ itemText += '}}';
+ }
+ });
+ for (let itemRow = 0; !_.isUndefined(item = ItemNames.tableLookup( fields.Items_name, itemRow, false )); itemRow++) {
+ if (item && item.length && item != '-') {
+ let trueItem = ItemNames.tableLookup( fields.Items_trueName, itemRow );
+ let itemObj = LibFunctions.abilityLookup( fields.MagicItemDB, trueItem, charCS );
+ if (itemObj.obj) {
+ let specsArray = itemObj.specs(/}}\s*specs=\s*?(.*?)\s*?{{/im);
+ let miClass = specsArray ? (specsArray[0][2].dbName() || 'magicitem') : 'magicitem',
+ dataArray = itemObj.data(/}}\s*\w*?data\s*=.*?sv[a-z]{3}:.*?{{/img); // [...itemDef.matchAll(/}}\s*\w*?data\s*=.*?sv[a-z]{3}:.*?{{/g)];
+
+ if (miClass.includes('ring') && miClass.includes('protection')) {
+ let leftRing = LibFunctions.attrLookup( charCS, fields.Equip_leftTrueRing ) || '-',
+ rightRing = LibFunctions.attrLookup( charCS, fields.Equip_rightTrueRing ) || '-';
+ if (![leftRing,rightRing].includes(trueItem)) {
+ if (!silent) itemText += '{{'+item+'=Is not currently worn}}';
+ continue;
+ }
+ }
+ let classArray = miClass.dbName().split('|'),
+ modsClass = classArray[0];
+ _.each( dataArray, data => {
+ if (!data) return;
+ if (!miMods[modsClass]) miMods[modsClass] = {par:0,poi:0,dea:0,rod:0,sta:0,wan:0,pet:0,pol:0,bre:0,spe:0,str:0,con:0,dex:0,int:0,wis:0,chr:0,rules:[]};
+ let svRules = (data[0].match(reRules) || ['',''])[1].toLowerCase().replace(/[_\s]/g,'').split('|').map(r => r.replace(/\-/g,(match,i,s)=>(i>0?'':match))),
+ inHand = !svRules.includes('+inhand') || !_.isUndefined(LibFunctions.getTableField( charCS, {}, fields.InHand_table, fields.InHand_trueName ).tableFind( fields.InHand_trueName, trueItem )),
+ worn = !svRules.includes('+worn') || LibFunctions.classAllowedItem( charCS, trueItem, specsArray[0][1].dbName(), specsArray[0][4].dbName(), 'ac' ),
+ conflict = '',
+ testRules = [],
+ adds = !(_.some(miMods,(mi,c) => {conflict=c;return (svRules.includes( '-'+c ) || _.some(classArray,mic => {return mi.rules.includes('-'+mic);}))}));
+ if (_.isUndefined(addedText[modsClass]) && (!inHand || !worn || !adds)) addedText[modsClass] = '';
+ if (!inHand && !silent) addedText[modsClass] += '{{'+item+'=Is not currently in hand}}';
+ if (!worn && !silent) addedText[modsClass] += '{{'+item+'=Is not of a usable type}}';
+ if (!adds && !silent) addedText[modsClass] += '{{'+item+'=Does not combine with items of class '+conflict+'}}';
+ if (!inHand || !worn || !adds) return;
+
+ let saveMods = [...data[0].matchAll(reSave)];
+ _.each( saveMods, m => {
+ if (_.isUndefined(addedText[modsClass])) addedText[modsClass] = '';
+ if (!silent) addedText[modsClass] += '{{'+item+'=';
+ let every = m[1] === 'all',
+ attr = m[1] === 'atr',
+ save = m[1] === 'sav';
+ if (save || every || attr) {
+ let msg = 'All '+(every ? '' : (attr ? 'attribute ' : 'save '))+'mods: '+m[2];
+ if (!silent) addedText[modsClass] += msg;
+ let tempObj = miMods[modsClass];
+ miMods[modsClass] = _.mapObject(tempObj, function(v,k) {
+ if (k != 'att' && k != 'rules') {
+ if (every || types[k] == m[1]) {
+ if ('+-'.includes(m[2][0]) && !setFlags[m[1]]) {
+ return (v+(parseInt(m[2]) || 0));
+ } else if (m[2][0] == '=') {
+ let newVal = parseInt(m[2].substring(1)) || 0;
+ if (setFlags[m[1]]) {
+ if (!silent && v < newVal) addedText[modsClass] = '{{'+item+'='+msg;
+ return Math.max(v,newVal);
+ } else {
+ setFlags[m[1]] = true;
+ if (!silent) addedText[modsClass] = '{{'+item+'='+msg;
+ return newVal;
+ }
+ } else if (!setFlags[m[1]]) {
+ if (!silent && v < (parseInt(m[2]) || 0)) addedText[modsClass] = '{{'+item+'='+msg;
+ return Math.max(v,(parseInt(m[2]) || 0));
+ } else {
+ return v;
+ }
+ } else {
+ return v;
+ }
+ } else {
+ return v;
+ }
+ log('handleCheckSaves: checked everything, should not get here');
+ return v;
+ });
+ } else if (!_.isUndefined(mods[m[1]]) && !_.isUndefined(miMods[modsClass])) {
+ let v = miMods[modsClass][m[1]] || 0;
+ if (m[1] != 'att') {
+ if (!silent) addedText[modsClass] += xlate[m[1]]+': '+m[2]+', ';
+ if ('+-'.includes(m[2][0]) && !setFlags[m[1]]) {
+ miMods[modsClass][m[1]] += (parseInt(m[2]) || 0);
+ } else if (m[2][0] == '=') {
+ let newVal = parseInt(m[2].substring(1)) || 0;
+ if (setFlags[m[1]]) {
+ miMods[modsClass][m[1]] = Math.max(v,newVal);
+ } else {
+ setFlags[m[1]] = true;
+ miMods[modsClass][m[1]] = newVal;
+ }
+ } else if (!setFlags[m[1]]) {
+ miMods[modsClass][m[1]] = Math.max(v,(parseInt(m[2]) || 0));
+ }
+ } else {
+ miMods[modsClass].att = v;
+ }
+ };
+ if (!silent) addedText[modsClass] += '}}';
+ });
+ miMods[modsClass].rules = miMods[modsClass].rules ? miMods[modsClass].rules.concat(svRules) : svRules;
+ });
+ };
+ };
+ };
+ _.mapObject(miMods, function(s,c) {
+ mods = _.mapObject(mods, function(v,k) {
+ return (setFlags[k] ? s[k] : (v + s[k]));
+ });
+ });
+ if (!silent) itemText += _.reduce(addedText, (t,i) => (t + i));
+
+ LibFunctions.setAttr( charCS, fields.Saves_monParalysis, saves[0] );
+ LibFunctions.setAttr( charCS, fields.Saves_monPoison, saves[0] );
+ LibFunctions.setAttr( charCS, fields.Saves_monDeath, saves[0] );
+ LibFunctions.setAttr( charCS, fields.Saves_monRod, saves[1] );
+ LibFunctions.setAttr( charCS, fields.Saves_monStaff, saves[1] );
+ LibFunctions.setAttr( charCS, fields.Saves_monWand, saves[1] );
+ LibFunctions.setAttr( charCS, fields.Saves_monPetri, saves[2] );
+ LibFunctions.setAttr( charCS, fields.Saves_monPolymorph, saves[2] );
+ LibFunctions.setAttr( charCS, fields.Saves_monBreath, saves[3] );
+ LibFunctions.setAttr( charCS, fields.Saves_monSpell, saves[4] );
+ LibFunctions.setAttr( charCS, fields.Saves_paralysis, saves[0] );
+ LibFunctions.setAttr( charCS, fields.Saves_poison, saves[0] );
+ LibFunctions.setAttr( charCS, fields.Saves_death, saves[0] );
+ LibFunctions.setAttr( charCS, fields.Saves_rod, saves[1] );
+ LibFunctions.setAttr( charCS, fields.Saves_staff, saves[1] );
+ LibFunctions.setAttr( charCS, fields.Saves_wand, saves[1] );
+ LibFunctions.setAttr( charCS, fields.Saves_petrification, saves[2] );
+ LibFunctions.setAttr( charCS, fields.Saves_polymorph, saves[2] );
+ LibFunctions.setAttr( charCS, fields.Saves_breath, saves[3] );
+ LibFunctions.setAttr( charCS, fields.Saves_spell, saves[4] );
+ LibFunctions.setAttr( charCS, fields.Saves_modParalysis, mods.par );
+ LibFunctions.setAttr( charCS, fields.Saves_modPoison, mods.poi );
+ LibFunctions.setAttr( charCS, fields.Saves_modDeath, mods.dea );
+ LibFunctions.setAttr( charCS, fields.Saves_modRod, mods.rod );
+ LibFunctions.setAttr( charCS, fields.Saves_modStaff, mods.sta );
+ LibFunctions.setAttr( charCS, fields.Saves_modWand, mods.wan );
+ LibFunctions.setAttr( charCS, fields.Saves_modPetrification, mods.pet );
+ LibFunctions.setAttr( charCS, fields.Saves_modPolymorph, mods.pol );
+ LibFunctions.setAttr( charCS, fields.Saves_modBreath, mods.bre );
+ LibFunctions.setAttr( charCS, fields.Saves_modSpell, mods.spe );
+ LibFunctions.setAttr( charCS, fields.Saves_modStrength, mods.str );
+ LibFunctions.setAttr( charCS, fields.Saves_modConstitution, mods.con );
+ LibFunctions.setAttr( charCS, fields.Saves_modDexterity, mods.dex );
+ LibFunctions.setAttr( charCS, fields.Saves_modIntelligence, mods.int );
+ LibFunctions.setAttr( charCS, fields.Saves_modWisdom, mods.wis );
+ LibFunctions.setAttr( charCS, fields.Saves_modCharisma, mods.chr );
+
+ if (!silent) content +='{{Saves='
+ + '**'+saves[0]+'** | Paralysis('+(mods.par>=0?'+':'')+mods.par+'), Poison('+(mods.poi>=0?'+':'')+mods.poi+'), Death('+(mods.dea>=0?'+':'')+mods.dea+') | '
+ + '**'+saves[1]+'** | Rod('+(mods.rod>=0?'+':'')+mods.rod+'), Staff('+(mods.sta>=0?'+':'')+mods.sta+'), Wand('+(mods.wan>=0?'+':'')+mods.wan+') | '
+ + '**'+saves[2]+'** | Petrification('+(mods.pet>=0?'+':'')+mods.pet+'), Polymorph('+(mods.pol>=0?'+':'')+mods.pol+') | '
+ + '**'+saves[3]+'** | Breath('+(mods.bre>=0?'+':'')+mods.bre+') | '
+ + '**'+saves[4]+'** | Spell('+(mods.spe>=0?'+':'')+mods.spe+') | '
+ + ' }}'
+ + '{{Attribute Checks='
+ + '**'+LibFunctions.attrLookup(charCS,fields.Strength)+'** | Strength('+(mods.str>=0?'+':'')+mods.str+') | '
+ + '**'+LibFunctions.attrLookup(charCS,fields.Constitution)+'** | Constitution('+(mods.con>=0?'+':'')+mods.con+') | '
+ + '**'+LibFunctions.attrLookup(charCS,fields.Dexterity)+'** | Dexterity('+(mods.dex>=0?'+':'')+mods.dex+') | '
+ + '**'+LibFunctions.attrLookup(charCS,fields.Intelligence)+'** | Intelligence('+(mods.int>=0?'+':'')+mods.int+') | '
+ + '**'+LibFunctions.attrLookup(charCS,fields.Wisdom)+'** | Wisdom('+(mods.wis>=0?'+':'')+mods.wis+') | '
+ + '**'+LibFunctions.attrLookup(charCS,fields.Charisma)+'** | Charisma('+(mods.chr>=0?'+':'')+mods.chr+') | '
+ + ' }}'
+ + ((selected.length == 1) ? itemText : '');
+ } catch (e) {
+ sendCatchError('RPGM Library',null,e,'RPGM Library handleCheckSaves()');
+ content = '';
+ } finally {
+ setTimeout(() => {
+ resolve(content);
+ }, 1);
+ };
+ });
+ };
+
+ async function checkAllSaves( args, selected, senderId, silent ) {
+ try {
+ var who = LibFunctions.sendToWho(null,senderId);
+
+ if (attkMenu = (args && args[0])) {
+ selected = [];
+ selected.push(getObj('graphic',args[0]));
+ }
+
+ for (const token of selected) {
+ if (msg && msg.length) msg += '\n'+who;
+ msg += await checkThisSave( attkMenu, token, senderId, silent );
+ };
+
+ if (!silent && (attkMenu || (args && args[1]))) {
+ if (!msg) msg = '&{template:'+fields.defaultTemplate+'}';
+ msg += '{{desc=[Return to Menu]('+(attkMenu ? ('!attk --button '+(args[1] || 'SAVES')+'|'+tokenID) : ('!cmd --button '+args[1]))+')}}';
+ }
+ if (!silent) {
+ LibFunctions.sendResponse( charCS, msg, senderId );
+ } else {
+ clearWaitTimer(senderId);
+ }
+ return;
+ } catch (e) {
+ sendCatchError( 'RPGM Library', msg_orig[senderId], e);
+ }
+ };
+
+ checkAllSaves( args, selected, senderId, silent );
+ return;
+ }
+
+ /*
+ * Reload all weapons in the InHand tables, to set correct
+ * data after a race, class or level change. Will not work
+ * for weapons entered manually into the weapon tables
+ */
+
+ LibFunctions.handleCheckWeapons = function( tokenID, charCS ) {
+
+ var InHand = LibFunctions.getTable( charCS, fieldGroups.INHAND ),
+ itemIndex = InHand.tableLookup( fields.InHand_index, 0 );
+ if (itemIndex.length && !isNaN(itemIndex)) {
+ LibFunctions.sendAPI('!attk --button PRIMARY|'+tokenID+'|'+itemIndex+'|0||silent');
+ }
+ itemIndex = InHand.tableLookup( fields.InHand_index, 1 );
+ if (itemIndex.length && !isNaN(itemIndex)) {
+ LibFunctions.sendAPI('!attk --button OFFHAND|'+tokenID+'|'+itemIndex+'|1||silent');
+ }
+ itemIndex = InHand.tableLookup( fields.InHand_index, 2 );
+ if (itemIndex.length && !isNaN(itemIndex)) {
+ LibFunctions.sendAPI('!attk --button BOTH|'+tokenID+'|'+itemIndex+'|2||silent');
+ }
+
+ for (let r=3; !_.isUndefined(itemIndex = InHand.tableLookup( fields.InHand_index, r, false )); r++) {
+ if (itemIndex.length && !isNaN(itemIndex)) {
+ LibFunctions.sendAPI('!attk --button HAND|'+tokenID+'|'+itemIndex+'|'+r+'||silent');
+ }
+ }
+ return;
+ }
+
+
+/* --------------------------------------------------- End of Library Functions ---------------------------------------------------- */
+
+
+/* ---------------------------------------------------- Finish Initialisation ---------------------------------------------- */
+
+ LibFunctions.sendFeedback( waitMsgDiv+'Please wait while RPGMaster initialises...' );
+ apis.magic = ('undefined' !== typeof MagicMaster);
+ apis.attk = ('undefined' !== typeof attackMaster);
+ apis.init = ('undefined' !== typeof initMaster);
+ DBindex = undefined;
+
+ setTimeout( del_Old_DBs, 5000 );
+
+ // RED: v1.036 create help handouts from stored data
+ setTimeout( () => LibFunctions.updateHandouts(handouts,true,findTheGM()),300);
+ setTimeout( () => displayReleaseNotesLink(), 5000 );
+ }
+ }
+
+ const handleChatMessage = (msg) => {
+ try {
+ var preamble, targetid,
+ playerid = msg.playerid;
+
+ msg_orig[playerid] = msg;
+
+ if (msg.type === "api") {
+ return;
+ } else if (msg.content.trim().startsWith('!')) {
+ log('lib handleChatMessage: msg not api but starts with ! so re-send. Msg = '+msg.content);
+// sendChat('',processInlinerolls(msg),null,{noarchive:!archive, use3d:use3Ddice});
+ return;
+ }
+ if (msg.rolltemplate && msg.rolltemplate.startsWith('RPGM')) {
+
+ targetid = findTheGM();
+ if (msg.target) {
+ if (msg.target != 'gm') {
+ let targetObjs = findObjs({_type:'player',_displayname:msg.who});
+ targetid = (!targetObjs || !targetObjs.length) ? targetid : targetObjs[0].id;
+ }
+ }
+ let newMsg = Object.create(msg);
+ newMsg = processInlinerolls(newMsg);
+ const template = newMsg.match(/^([^{]*)({{[^]*}}).*?$([^]*)/im);
+ switch (msg.type.toLowerCase()) {
+ case 'emote':
+ preamble = '/em';
+ break;
+ case 'desc':
+ preamble = '/desc';
+ break;
+ case 'whisper':
+ preamble = '/w "'+msg.target_name+'"';
+ break;
+ default:
+ preamble = '';
+ break;
+ }
+ preamble += ' '+template[1];
+ LibFunctions.parseOutput( msg.who, preamble, msg.rolltemplate, template[2], targetid );
+ }
+ return;
+ } catch (e) {
+ log('RPGMaster Library handleChatMessage: JavaScript '+e.name+': '+e.message+' while processing a chat message');
+// sendDebug('RPGMaster Library handleChatMessage: JavaScript '+e.name+': '+e.message+' while processing a chat message');
+ LibFunctions.sendCatchError('RPGMaster Library',msg_orig[playerid],e);
+ }
+ };
+
+ const tryInit = ()=>{
+ if(Campaign()) {
+ LibFunctions.init();
+ } else {
+ setTimeout(tryInit,10);
+ }
+ };
+ setTimeout(tryInit,0);
+
+ const checkInstall = () => {
+ log('-=> libRPGMaster v'+version+' <=- ['+(new Date(lastUpdate*1000))+']');
+
+ if( ! state.hasOwnProperty('libRPGMaster') || state.libRPGMaster.version !== schemaVersion) {
+ switch(state.libRPGMaster && state.libRPGMaster.version) {
+
+ case 0.1:
+ /* break; // intentional dropthrough */
+
+ case 'UpdateSchemaVersion':
+ state.libRPGMaster.version = schemaVersion;
+ break;
+
+ default:
+ state.libRPGMaster = {
+ version: schemaVersion
+ };
+ break;
+ }
+ }
+ };
+
+ const registerLib = () => {
+ on('chat:message',handleChatMessage);
+ };
+
+ on('ready', function () {
+ checkInstall();
+ registerLib();
+ });
+
+ return {
+ getRPGMap: (...a) => LibFunctions.getRPGMap(...a),
+ getTableField: (...a) => LibFunctions.getTableField(...a),
+ getTable: (...a) => LibFunctions.getTable(...a),
+ getLvlTable: (...a) => LibFunctions.getLvlTable(...a),
+ initValues: (...a) => LibFunctions.initValues(...a),
+ attrLookup: (...a) => LibFunctions.attrLookup(...a),
+ setAttr: (...a) => LibFunctions.setAttr(...a),
+ abilityLookup: (...a) => LibFunctions.abilityLookup(...a),
+ setAbility: (...a) => LibFunctions.setAbility(...a),
+ doDisplayAbility: (...a) => LibFunctions.doDisplayAbility(...a),
+ getAbility: (...a) => LibFunctions.getAbility(...a),
+ parseTemplate: (...a) => LibFunctions.parseTemplate(...a),
+ redisplayOutput: (...a) => LibFunctions.redisplayOutput(...a),
+ parseOutput: (...a) => LibFunctions.parseOutput(...a),
+ sendToWho: (...a) => LibFunctions.sendToWho(...a),
+ sendMsgToWho: (...a) => LibFunctions.sendMsgToWho(...a),
+ sendPublic: (...a) => LibFunctions.sendPublic(...a),
+ sendAPI: (...a) => LibFunctions.sendAPI(...a),
+ sendFeedback: (...a) => LibFunctions.sendFeedback(...a),
+ sendResponse: (...a) => LibFunctions.sendResponse(...a),
+ sendResponsePlayer: (...a) => LibFunctions.sendResponsePlayer(...a),
+ sendResponseError: (...a) => LibFunctions.sendResponseError(...a),
+ sendToOthers: (...a) => LibFunctions.sendToOthers(...a),
+ sendError: (...a) => LibFunctions.sendError(...a),
+ sendCatchError: (...a) => LibFunctions.sendCatchError(...a),
+ sendParsedMsg: (...a) => LibFunctions.sendParsedMsg(...a),
+ sendGMquery: (...a) => LibFunctions.sendGMquery(...a),
+ sendWait: (...a) => LibFunctions.sendWait(...a),
+ checkDBver: (...a) => LibFunctions.checkDBver(...a),
+ saveDBtoHandout: (...a) => LibFunctions.saveDBtoHandout(...a),
+ buildCSdb: (...a) => LibFunctions.buildCSdb(...a),
+ checkCSdb: (...a) => LibFunctions.checkCSdb(...a),
+ getDBindex: (...a) => LibFunctions.getDBindex(...a),
+ updateHandouts: (...a) => LibFunctions.updateHandouts(...a),
+ findThePlayer: (...a) => LibFunctions.findThePlayer(...a),
+ findCharacter: (...a) => LibFunctions.findCharacter(...a),
+ fixSenderId: (...a) => LibFunctions.fixSenderId(...a),
+ getCharacter: (...a) => LibFunctions.getCharacter(...a),
+ getTokenValue: (...a) => LibFunctions.getTokenValue(...a),
+ classObjects: (...a) => LibFunctions.classObjects(...a),
+ addMIspells: (...a) => LibFunctions.addMIspells(...a),
+ getMagicList: (...a) => LibFunctions.getMagicList(...a),
+ getShownType: (...a) => LibFunctions.getShownType(...a),
+ parseClassDB: (...a) => LibFunctions.parseClassDB(...a),
+ handleCheckSaves: (...a) => LibFunctions.handleCheckSaves(...a),
+ handleCheckWeapons: (...a) => LibFunctions.handleCheckWeapons(...a),
+ getHandoutIDs: (...a) => LibFunctions.getHandoutIDs(...a),
+ classAllowedItem: (...a) => LibFunctions.classAllowedItem(...a),
+ resolveData: (...a) => LibFunctions.resolveData(...a),
+ findPower: (...a) => LibFunctions.findPower(...a),
+ handleGetBaseThac0: (...a) => LibFunctions.handleGetBaseThac0(...a),
+ characterLevel: (...a) => LibFunctions.characterLevel(...a),
+ caster: (...a) => LibFunctions.caster(...a),
+ };
+
+})();
+
+{try{throw new Error('');}catch(e){API_Meta.libRPGMaster.lineCount=(parseInt(e.stack.split(/\n/)[1].replace(/^.*:(\d+):.*$/,'$1'),10)-API_Meta.libRPGMaster.offset);}}
diff --git a/RPGMlibrary AD+D2e/libRPGMaster2e.js b/RPGMlibrary AD+D2e/libRPGMaster2e.js
index 3bae13b8f..dece4c849 100644
--- a/RPGMlibrary AD+D2e/libRPGMaster2e.js
+++ b/RPGMlibrary AD+D2e/libRPGMaster2e.js
@@ -146,15 +146,23 @@ API_Meta.libRPGMaster={offset:Number.MAX_SAFE_INTEGER,lineCount:-1};
* RPGMaster suite APIs. Removed potential setTimeout() issues with asynchronous
* use of variable values – passed as parameters instead.
* v2.2.1 11/09/2023 Updated Sleeping Creature & Dead Body macros for DM interaction
- * v2.2.2 16/09/2023 Added Secret Panel lock. Added ability to pass dice roll specs into macros
- * as a parameter of the --display-ability command.
+ * v2.3.0 16/09/2023 Added Secret Panel lock and Thrusting Blade Trap. Added ability to pass dice
+ * roll specs into macros as a parameter of the --display-ability command. Added
+ * new attributes to RaceDara specifications: Age, Magic resistance, and Spell
+ * Speed Override. Added 'store' data attribute to Magic Items for type of spell-
+ * storing capability. New 'query' attribute for RaceData which adds a level of
+ * selection such as age. New creatures, with powers, weapons, classes and effects.
+ * New 'specmu' ClassData attribute to flag specialist MU class. Several database fixes.
+ * New maths evaluator to resolve creature data qualifiers. Improved setAttr() error
+ * handling. Fixed character level of creature that has both HD & caster level.
+ * Fixed parsing of magic item save mod values. Additional misc Magic Items.
**/
const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
'use strict';
- const version = '2.2.2';
+ const version = '2.3.0';
API_Meta.libRPGMaster.version = version;
- const lastUpdate = 1695145573;
+ const lastUpdate = 1697186733;
const schemaVersion = 0.1;
log('now in seconds is '+Date.now()/1000);
@@ -228,12 +236,15 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
PlayerID: ['playerid','current'],
Race: ['race','current',''],
Gender: ['gender','current',''],
+ Age: ['age','current',''],
+ AgeVal: ['age','max',''],
Total_level: ['level-total','current'],
Fighter_class: ['class1','current'],
Wizard_class: ['class2','current'],
Priest_class: ['class3','current'],
Rogue_class: ['class4','current'],
Psion_class: ['class5','current'],
+ Monster_class: ['class1','current'],
Fighter_level: ['level-class1','current'],
Wizard_level: ['level-class2','current'],
Priest_level: ['level-class3','current'],
@@ -254,6 +265,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
Monster_dmg3: ['monsterdmg3','current'],
Monster_spAttk: ['monsterspecattacks','current'],
Monster_spDef: ['monsterspecdefenses','current'],
+ Monster_mr: ['monstermagicresist','current'],
Monster_size: ['monstersize','current','M'],
ClassWarriorList: ['spellmem','current'],
ClassWizardList: ['spellmem2','current'],
@@ -467,6 +479,8 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
MW_magicThac0: ['thac0','max',''],
MW_noAttks: ['attacknum','current','1'],
MW_attkCount: ['attacknum','max','0'],
+ MW_attkRound: ['attackround','current','0'],
+ MW_curCount: ['attackround','max','0'],
MW_styleAttks: ['stylenum','current','0'],
MW_offhandAdj: ['stylenum','max','0'],
MW_adj: ['attackadj','current','0'],
@@ -481,8 +495,8 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
MW_profLevel: ['prof-level','current','0'],
MW_dancingProf: ['prof-level','max','0'],
MW_critHit: ['crit-thresh','current','20'],
- MW_styleCH: ['style-crit','current','20'],
MW_critMiss: ['crit-thresh','max','1'],
+ MW_styleCH: ['style-crit','current','20'],
MW_styleCM: ['style-crit','max','1'],
MW_slash: ['weaptype-slash','current','0'],
MW_pierce: ['weaptype-pierce','current','0'],
@@ -517,9 +531,11 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
RW_speed: ['weapspeed2','current',''],
RW_dancing: ['weapspeed2','max','0'],
RW_noAttks: ['attacknum2','current','1'],
+ RW_attkCount: ['attacknum2','max','0'],
+ RW_attkRound: ['attackround','current','0'],
+ RW_curCount: ['attackround','max','0'],
RW_thac0: ['thac02','current','20'],
RW_magicThac0: ['thac02','max',''],
- RW_attkCount: ['attacknum2','max','0'],
RW_styleAttks: ['stylenum2','current','0'],
RW_adj: ['attackadj2','current','0'],
RW_preInit: ['attackadj2','max','0'],
@@ -534,8 +550,8 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
RW_profLevel: ['prof-level2','current','0'],
RW_dancingProf: ['prof-level2','max','0'],
RW_critHit: ['crit-thresh2','current','20'],
- RW_styleCH: ['style-crit2','current','20'],
RW_critMiss: ['crit-thresh2','max','1'],
+ RW_styleCH: ['style-crit2','current','20'],
RW_styleCM: ['style-crit2','max','1'],
RW_size: ['size2','current',''],
RW_miName: ['size2','max',''],
@@ -608,6 +624,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
SpellRowRef: ['spellrowref','current'],
SpellColIndex: ['spellref','current'],
SpellCharges: ['spellcharges','current'],
+ SpellSpeedOR: ['spellcharges','max'],
CastingLevel: ['casting-level','current'],
Wizard_Level: ['level-wizard','current'],
Priest_Level: ['level-priest','current'],
@@ -884,14 +901,14 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Tallfellow-Halfling',type:'HumanoidRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Tallfellow Halfling}}{{subtitle=Race}}Specs=[Tallfellow Halfling,HumanoidRace,0H,Humanoid]{{Alignment=Any (usually NG)}}{{Languages=Often *common, halfling, dwarf, elf, gnome, goblin, orc,* and any one Elven language}}{{Height=Males [40+2d8](!\\amp#13;\\amp#47;r 40+2d8 ins height)ins, Females [38+2d8](!\\amp#13;\\amp#47;r 38+2d8 ins height)ins}}{{Weight=Males [52+5d4](!\\amp#13;\\amp#47;r 52+5d4 lbs weight)lbs, Females [48+5d4](!\\amp#13;\\amp#47;r 48+5d4 lbs weight)lbs}}{{Life Expectancy=Average at 180 years}}{{Section=**Attributes**}}{{Minimum=Con:10, Dex:8, Int:6, Wis:7, Chr:5}}{{Maximum=Str:17, Dex:19, Wis:19}}{{Adjustment=Wis *or* Dex:+1, Str:-1}}{{Section1=**Powers**}}{{Section2=None}}{{Section3=**Special Advantages**}}{{Secret Doors=Like elves, a Tallfellow can recognize a secret door on a [1 in 6](!\\amp#13;\\amp#47;r 1d6\\lt1) if passing within 10 feet.}}{{Magic Resistance=Magic-resistant, giving a bonus to saving throws against magical wands, staves, rods, and spells of +1 for every 3.5 points of Constitution score.}}{{Poison Resistance=Save vs. poison at +1 for every 3.5 points of Constitution score.}}{{Attack bonus=+1 To Hit with slings and thrown weapons}}{{Hide in Wood=Tallfellows receive a +2 bonus to surprise rolls when in forest or wooded terrain under all circumstances.}}{{Other Surprise=Enemies get a –4 penalty to surprise if the halfling is: 1) moving alone, 2) is 90 feet away from the rest of their party, or 3) is with other elves or halflings and all are in nonmetal armor. If the halfling must open a door or screen to get to the enemy, the penalty is reduced to –2.}}{{Section5=**Special Disadvantages**}}{{Infravision=***None***}}RaceData=[w:Tallfellow Halfling, attr:str=3:17|con=10|dex=8:19|int=6|wis=7:19|chr=5, align:any, weaps:any, ac:any, thmod:throwing=1|dart=1|hand-axe=1|magical-stone=1|slings=1, svatt:con, svpoi:3.5 svrod:3.5, svsta:3.5, svwan:3.5, svspe:3.5, ns:1],[cl:PW,w:Elf Detect Secret Doors,lv:0,sp:0,pd:-1]{{desc=This subrace of halflings is not so common as the Stout or Hairfoot but exists in significant numbers in many areas of temperate woodland. Averaging a little over 4\' in height, Tallfellows are slender and light-boned, weighing little more than the average Hairfoot.\nThey enjoy the company of elves, and most Tallfellow villages will be found nearby populations of that sylvan folk, with a flourishing trade between the two peoples.\nTallfellows display the greatest affinity toward working with wood of any halfling. They make splendid carpenters (often building boats or wagons for human customers), as well as loggers, carvers, pipesmiths, musicians, shepherds, liverymen, dairymen, cheesemakers, hunters, and scouts. They are better farmers than Stouts (although not as good as Hairfeet) and more adept than any other subrace at harvesting natural bounties of berries, nuts, roots, and wild grains.\nThe only halflings who enjoy much proficiency at riding, Tallfellows favor small ponies. Indeed, many unique breeds of diminutive horse have been bred among Tallfellow clans: fast, shaggy-maned, nimble mounts with great endurance. In a charge, of course, they lack the impact of a human-mounted warhorse; nonetheless, Tallfellow companies have served admirably as light lancers and horsearchers during many a hardfought campaign.\nOn foot, Tallfellows wield spears with rare skill. They are adept at forming bristling `porcupine\' formations with these weapons, creating such a menacing array that horses and footmen alike are deterred from attacking. This is one of the few halfling formations capable of standing toe-to-toe with a larger opponent in the open field.}}'},
{name:'Tinker-Gnome',type:'HumanoidRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Tinker Gnome}}{{subtitle=Race}}Specs=[Tinker Gnome,HumanoidRace,0H,Gnome]{{Alignment=Any (Usually NG)}}{{Languages=*Tinker Gnome, Gnome Common, various human tongues*}}{{Height=Males [38+1d6](!\\amp#13;\\amp#47;r 38+1d6 ins height)ins, Females [36+1d6](!\\amp#13;\\amp#47;r 36+1d6 ins height)ins}}{{Weight=Males [72+5d4](!\\amp#13;\\amp#47;r 72+5d4 lbs weight)lbs, Females [68+5d4](!\\amp#13;\\amp#47;r 68+5d4 lbs weight)lbs}}{{Life Expectancy=250 to 300 years (rare)}}{{Section=**Attributes**}}{{Minimum=Str:6, Con:8, Dex:8, Int:8}}{{Maximum=Wis:12}}{{Adjustment=Dex:+2, Str:-1, Wis:-1}}{{Section1=**Powers**}}{{Expert Miners=Detect slopes, unsafe walls, cielings \\amp floors, determine approximate depth and direction underground}}{{Section3=**Special Advantages**}}{{Infravision=*Infravision* to 60ft.}}{{Magic Resistance=Gnomes are magic-resistant, giving a bonus to saving throws against magical wands, staves, rods, and spells of +1 for every 3.5 points of Constitution score.}}{{Attack bonus=+1 To Hit kobolds and goblins}}{{Small size=Gnolls, bugbears, ogres, trolls, ogre magi, giants, and titans suffer a -4 penalty to attack}}{{Section5=**Special Disadvantages**}}{{Item failure=20% chance for failure of any magical item except weapons, armor, shields, illusionist items, and (if the character is a thief) items that duplicate thieving abilities.}}RaceData=[w:Tinker Gnome, attr:str=6|con=8|Dex=8|int=8|Wis=3:12]{{desc=The Tinkers are a very courageous and curious bunch of gnomes.\nTinkers resemble the rest of gnomedom - in the fact that they do value various types of stones, attributing to them great and supernatural powers. However, whereas the other subraces seek gems, the Tinkers hold a different substance as the grandest rock of all: coal. The Tinkers hold that coal (also known as the "Father of Steam") is the most valuable substance of the world, and those places where it can be mined quickly become Tinker Gnome warrens.\nIn size and stature, the Tinkers resemble Rock Gnomes--so much so that the difference is not immediately apparent, at least when based only upon appearance.\nTinkers who live out their lives can attain an age of 250 or 300 years, but it must be noted that this is a rare occurrence among the members of this subrace. If one of his or her own inventions doesn\'t do a Tinker in, chances are good that one of his or her neighbor\'s gadgets will.\nEven in childhood, Tinkers are encouraged to experiment with gadgets and gimmicks, trying different means of making things to perform tasks that could otherwise be easily done by hand. The Tinker reaches adulthood at about the age of fifty (by which time perhaps 10-15% of them have already succumbed to the common fate of their kind). Despite this high attrition, it\'s not until maturity that a Tinker Gnome\'s activities begin to get really dangerous.\nUpon reaching adulthood, the Tinker Gnome must select a guild for himself or herself. The number of guilds available varies by location, but in Mount Nevermind on Krynn--which is the center of Tinker civilization and by far the largest community of these inventive creatures anywhere--there are more than 150 active guilds. These include virtually all areas of practical endeavor, and quite a few impractical ones as well.\nAfter selecting a guild, each member of the subrace settles upon a Life-quest. The actual choice of the quest may take several decades, but once it has been decided, it becomes the reason behind that Tinker\'s existence. The Lifequest is an attempt to reach a perfect understanding of some device (anything from a spelljamming helm to a screw), a task at which the Tinker very rarely succeeds. Indeed, the best estimate is that less than 1% of these gnomes ever do fully grasp the nature of the object that has occupied their attention for so much of their adult lives; the rest of these easily-distracted gnomes get hopelessly sidetracked somewhere along the way.\nDespite the vagaries of their existence, the Tinkers are a fun-loving and generally sociable race. Their speech is unique in both its speed and complexity. Two Tinkers can rattle off information and opinion to each other in a succession of thousand-word sentences, speaking simultaneously and yet listening and understanding (as much as is possible, given the esoteric nature of many discussions) each other even as they voice their own points of view. Those Tinkers who have had some experience interacting with other races have learned to slow the pace of their communication but never quite overcome their frustration with those who can\'t talk and listen at the same time.}}'},
]},
- Race_DB_Creatures:{bio:'Creatures Database v1.32 11/07/2023
This sheet holds definitions of pre-defined creatures from The Monsterous Compendium that can be used by the RPGMaster API system (creatures can also be added directly to a character sheet by editing the Monster tab on the sheet). The definitions include automatically setable attributes, valid alignments, the weapons & armour each creature can use, bonuses and penalties to saves, attacks, surprise etc, and the powers that the creature gets. Depending on API configuration, the APIs can restrict creatures to these specifications, or not as desired.',
- gmnotes:'Change Log: v1.33 13/08/2023 Added a basic chest to act as the basis for the *Drag & Drop* container system v1.32 11/07/2023 Added creatures that can be contained in an Iron Flask v1.31 07/06/2023 Corrected some spattk & spdef entries with wrong syntax v1.30 30/04/2023 Added creatures to support Figurines of Wonderous Power and other MIs v1.28 03/03/2023 Added Elephant, Rhino and Mouse to support Wand of Wonder v1.27 12/02/2023 Added Adder as a creature to support Staff of the Serpent (Adder) v1.26 16/01/2023 Added both attkmsg & dmgmsg to display with attack & damage respectively. v1.25 14/01/2023 Switched round creature attack names and dice rolls so will work with character sheet buttons as well as APIs v1.15-24 16/12/2022 Added more creatures and changed format for inherrited template fields v1.14 25/11/2022 Added more creatures, especially undead at DM request v1.10 14/11/2022 Initial live release of a sample creatures database v1.02 10/11/2022 Fixes and additional creatures v1.01 01/11/2022 First version of Race-DB-Creatures',
+ Race_DB_Creatures:{bio:'Creatures Database v2.01 29/09/2023
This sheet holds definitions of pre-defined creatures from The Monsterous Compendium that can be used by the RPGMaster API system (creatures can also be added directly to a character sheet by editing the Monster tab on the sheet). The definitions include automatically setable attributes, valid alignments, the weapons & armour each creature can use, bonuses and penalties to saves, attacks, surprise etc, and the powers that the creature gets. Depending on API configuration, the APIs can restrict creatures to these specifications, or not as desired.',
+ gmnotes:'Change Log: v2.01 29/09/2023 Added several families of Giants, and all Chromatic & Metalic Dragons, Titans, & others with substantial functional upgrades v1.34 24/09/2023 Fixed issues with Goblin definition v1.33 13/08/2023 Added a basic chest to act as the basis for the *Drag & Drop* container system v1.32 11/07/2023 Added creatures that can be contained in an Iron Flask v1.31 07/06/2023 Corrected some spattk & spdef entries with wrong syntax v1.30 30/04/2023 Added creatures to support Figurines of Wonderous Power and other MIs v1.28 03/03/2023 Added Elephant, Rhino and Mouse to support Wand of Wonder v1.27 12/02/2023 Added Adder as a creature to support Staff of the Serpent (Adder) v1.26 16/01/2023 Added both attkmsg & dmgmsg to display with attack & damage respectively. v1.25 14/01/2023 Switched round creature attack names and dice rolls so will work with character sheet buttons as well as APIs v1.15-24 16/12/2022 Added more creatures and changed format for inherrited template fields v1.14 25/11/2022 Added more creatures, especially undead at DM request v1.10 14/11/2022 Initial live release of a sample creatures database v1.02 10/11/2022 Fixes and additional creatures v1.01 01/11/2022 First version of Race-DB-Creatures',
root:'Race-DB',
api:'cmd',
type:'class,race',
controlledby:'all',
avatar:'https://s3.amazonaws.com/files.d20.io/images/241737383/GL25pkAS2z5JJ4S9cMKkjw/max.png?1629918721',
- version:1.33,
+ version:2.01,
db:[{name:'Adder',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Poison-Snake-20}{{}}Specs=[Poison Snake,CreatureRace,0H,Poison Snake 20]{{}}RaceData=[w:Poison Snake 20]{{title=Adder}}'},
{name:'Advanced-Bullywug',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=, Advanced}}RaceData=[w:Advanced Bullywug, cattr:int=8:10|size=M]{{subtitle=Creature}}%{Race-DB-Creatures|Bullywug}{{Intelligence=Average (8 to 10)}}{{Size=M, 5-6ft tall}}Specs=[Bullywug Leader,CreatureRace,0H,Bullywug]{{desc1=**Advanced Bullywug:** A small number of bullywugs are larger and more intelligent than the rest of their kind. These bullywugs make their homes in abandoned buildings and caves, and send out regular patrols and hunting parties. These groups tend to be well equipped and organized, and stake out a regular territory, which varies with the size of the group. They are more aggressive than their smaller cousins, and will fight not only other bullywugs but other monsters as well. The intelligent bullywugs also organize regular raids outside their territory for food and booty, and especially prize human flesh. Since they are chaotic evil, all trespassers, including other bullywugs, are considered threats or sources of food.}}'},
{name:'Advanced-Bullywug-Shaman',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=, Advanced Shaman}}RaceData=[w:Advanced Bullywug Shaman, cattr:int=8:10|size=M|cl=pr:Shaman|lv=2]{{subtitle=Creature}}%{Race-DB-Creatures|Bullywug}{{Intelligence=Average (8 to 10)}}{{Size=M, 5-6ft tall}}Specs=[Advanced Bullywug Shaman,CreatureRace,0H,Bullywug]{{desc=**Advanced Bullywug Shaman:** For every 10 advanced bullywugs in a community, there is a 10% chance of a 2nd-level shaman being present. The creature requires the spellbook setting up, and spells to be memorised}}'},
@@ -920,10 +937,14 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Beholder-70-75HP',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= 70 to 75HP}}RaceData=[w:Beholder 70-75HP, cattr:hd=15|hp=70:75|thac0=5]{{subtitle=Creature}}%{Race-DB-Creatures|Beholder-45-49HP}{{Hit Points=45 to 49HP. Body=2/3rds, Central Eye 1/3rd, Eye stalks=additional 1d8+4HP each}}Specs=[Beholder,CreatureRace,0H,Beholder-45-49HP]{{}}'},
{name:'Birdcharmer',type:'CreatureRace',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Birdcharmer Snake, cattr:mov=9|hd=3+2r3|thac0=17|size=M| attk1=1:Bite:0:P|attk2=1d3:Constrict:0:B|dmgmsg=$$If successfully hit as well as damage this round \\lbrak;all future rounds\\rbrak;\\lpar;!rounds --target single¦`{selected¦token_id}¦\\amp#64;{target¦Who is the Unfortunate Victim?¦token_id}¦Constrict¦\\amp#91;\\lbrak;99\\rbrak;\\amp#93;¦0¦Argh... The squeeze is on...¦back-pain\\rpar; automatically hit and do crushing damage.\nRemember the birdcharmer charm can work on Animal intelligence \\lpar;1\\rpar; creatures, spattk:Once coiled victim takes crushing damage each round. Birdcharmer charm power vs. animal intelligence creatures, ns:1],[cl:PW,w:Birdcharmer Charm,sp:10,pd:-1]{{}}Specs=[Constrictor Snake,CreatureRace,0H,Constrictor Snake]{{}}%{Race-DB-Creatures|Constrictor-Snake}{{title=Birdcharmer Constrictor Snake}}{{Attacks=Bite and attempt to charm, coil \\amp constrict}}{{Charm=Can sway \\amp charm creatures of animal intelligence(1)}}{{desc=**Birdcharmer:** Some constrictor snakes are known as birdcharmers; these innately magical snakes can mesmerize their prey by swaying slowly and steadily while staring down their victims. Creatures of animal intelligence or less must make a saving throw against paralyzation or be effectively paralyzed for as long as the snake continues to sway, and for 2d6 rounds thereafter.}}'},
{name:'Black-Bear',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Black Bear}}{{subtitle=Creature}}Specs=[Black Bear,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Semi- (2 to 4)}}{{AC=7}}{{Alignment=Neutral}}{{Move=12}}{{Hit Dice=3+3}}{{THAC0=17}}{{Attack=2 x Claw 1d3, 1 x Bite 1d6}}{{Languages=None}}{{Size=M, 6ft tall}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=**Hug:** If score a critical hit (natural roll of 18 or better), then also do a hug for 2d4 additional damage}}{{Section6=**Special Disadvantages**}}{{Section7=None}}RaceData=[w:Black Bear, align:N, cattr:int=2:4|mov=12|ac=7|size=M|hd=3+3r3|thac0=17|ch=18|attk1=1d3:Claw1:0:S|attk2=1d3:Claw2:0:S|attk3=1d6:Bite:1:P|dmgmsg=If get a Critical Hit \\lpar;18 or better natural roll\\rpar; also get to \\lbrak;Hug for another 2d4\\rbrak;\\lpar;!\\amp#13;\\amp#47;gmroll 2d4 Hug damage\\rpar;,spattk:Hug if roll a critical hit of 18 or better]{{Section9=**Description**}}{{desc=A rather common omnivorous mammal, bears tend to avoid humans unless provoked. Exceptions to this rule can be a most unfortunate occurrence. Bears are, in general, large and powerful animals which are found throughout the world\'s temperate and cooler climates. With dense fur protecting them from the elements and powerful claws protecting them from other animals, bears are the true rulers of the animal kingdom in the areas where they live.\nThe so-called black bear actually ranges in color from black to light brown. It is smaller than the brown bear and the most widespread species by far.}}{{desc1=**Combat:** Although black bears are usually not aggressive, they are able fighters when pressed. If a black bear scores a paw hit with an 18 or better it also hugs for 2-8 (2d4) points of additional damage.}}'},
+ {name:'Black-Dragon',type:'DragonRace',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}Specs=[Black-Dragon,DragonRace,2H,Red-Dragon]{{}}RaceData=[w:Black Dragon, cattr:int=8:10|mov=12|fly=30C|swim=12|ac=5-??1|hd=(12+??2)d8r1|mr=(v(^((??1-4);0);1)*(??1-3)*5)|cl=mu:black-dragon|lv=4+??1|thac0=9-??2|dmg=??1|size=G|attk1=1d6:Claw x 2 or Claw+Kick:0:S|attk2=3d6:Bite:0:P|attk3=2d6:Tail Swipe:0:B|attkmsg=Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$\\lbrak;Show the radius\\rbrak;\\lpar;!rounds ~~aoe `{selected¦token_id}¦arc180¦feet¦0¦\\lbrak;\\lbrak;`{selected¦age¦max}*7\\rbrak;\\rbrak;¦\\lbrak;\\lbrak;`{selected¦age¦max}*14\\rbrak;\\rbrak;¦black\\rpar; then up to \\lbrak;\\lbrak;`{selected¦age¦max}\\rbrak;\\rbrak; opponents in the area take damage and Save vs. Petrification with the penalty shown below or be \\lbrak;Stunned\\rbrak;\\lpar;!rounds ~~target area¦`{selected¦token_id}¦\\amp#64;{target¦Select the stunned creature¦token_id}¦Stunned¦\\lbrak;\\amp#91;1+1d4\\amp#93;\\rbrak;¦-1¦Stunned by a dragon tail slap¦back-pain\\rpar; for 1d4+1 rounds., spattk:*Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*, spdef:Magic resistance @{selected|monstermagicresist}% and immune to acid. Has innate *water breathing* so is amphibious, ns:=11],[cl:PW,w:Black-Dragon-Breath,pd:-1,sp:1],[cl:PW,age:4,w:PW-Black-Dragon-Darkness,pd:3,sp:1],[cl:PW,w:PW-Corrupt-Water,age:6,pd:1,sp:1],[cl:PW,w:PR-Plant-Growth,age:8,pd:1,sp:1],[cl:PW,w:PR-Summon-Insects,age:10,pd:1,sp:1],[cl:PW,w:PW-Charm-Reptiles,age:12,pd:3,sp:1]{{}}%{Race-DB-Creatures|Red-Dragon}{{title=Black}}{{Intelligence=Average (8-10)}}{{AC=Varies with age, adult black dragon is AC -1}}{{Move=12, FL 30(C), Sw 12}}{{Hit Dice=Varies with age, adult black dragon is 14 HD}}{{THAC0=Varies with age, adult black dragon is 7}}{{Section1=**Attacks:** Damage bonus varies with age, adult black dragon is +6. 2 x Claws for 1d6 HP each, possibly with 1 or 2 kicks for 1d6 each, bite for 3d6, and tail slap for 2d6 and possible *stun* within an area varying with age. Several other attacks possible - see *Powers*}}{{Languages=*Black Dragon* and *Evil Dragon Common*, and 10% of hatchlings (+5% per age level) can perform universal communication with any intelligent creature}}{{Breath Weapon=A blast of acid, 5ft wide extending 60ft from the dragon. Damage varies by age from 2d4+1 to 24d4+12. Save vs. Breath Weapon to take half damage}}{{Spell Casting=Knows a number of random wizard spells cast at a level from 5 to 16 varying with age. All spells are cast at a speed of 1 segment regardless of the spell}}{{Spell-like Powers=*Juvenile* dragons can cast *darkness* x 3 per day for 10ft radius per age category, *Adults* gain *Corrupt Water* once a day, *Old* dragons gains *Plant Growth* once a day, *Venerable* gain *Summon Insects* x 1 per day, and *Great Wyrms* gain *Charm Reptiles* x 3 per day}}{{desc8=**Black Dragons:** Black dragons are abusive, quick to anger, and resent intrusions of any kind. They like dismal surroundings, heavy vegetation, and prefer darkness to daylight. Although not as intelligent as other dragons, black dragons are instinctively cunning and malevolent.\nAt birth, a black dragon\'s scales are thin, small, and glossy. But as the dragon ages, its scales become larger, thicker, and duller, which helps it camouflage itself in swamps and marshes.\nBlack dragons are found in swamps, marshes, rain forests, and jungles. They revel in a steamy environment where canopies of trees filter out most of the sunlight, swarms of insects fill the air, and stagnant moss-covered ponds lie in abundance. Black dragons are excellent swimmers and enjoy lurking in the gloomy depths of swamps and bogs. They also are graceful in flight; however, they prefer to fly at night when their great forms are hidden by the darkness of the sky. Black dragons are extremely selfish, and the majority of those encountered will be alone. When a family of black dragons is encountered, the adults will protect their young. However, if it appears the adults\' lives are in jeopardy they will abandon their young to save themselves.\nThey lair in large, damp caves and multi-chambered subterranean caverns. Older dragons are able to hide the entrance to their lairs with their plant growth ability. Black dragons are especially fond of coins. Older black dragons sometimes capture and question humans, before killing them, to find out where stockpiles of gold, silver, and platinum coins are kept.}}{{desc9=**Combat:** Black dragons prefer to ambush their targets, using their surroundings as cover. Their favorite targets are men, who they will sometimes stalk for several minutes in an attempt to gauge their strength and wealth before attacking. Against a band of men or a formidable creature, of the marsh can weaken the targets before the dragon joins the fight. Black dragons will also use their breath weapon before closing in melee. When fighting in heavily vegetated swamps and marshes, black dragons attempt to stay in the water or along the ground; the numerous trees and leafy canopies limit their flying maneuverability. When faced with an opponent which poses too much of a threat, a black dragon will attempt to fly out of sight, so it will not leave tracks, and hide in a deep pond or bog.}}'},
{name:'Black-Rat',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Rat}}RaceData=[w:Black Rat, align:N, weaps:none, ac:none, cattr:int=1|mov=15|ac=7|hd=1-6r6|hp=1:2|thac0=20|size=T|attk1=1:Bite:0:P|dmgmsg=If hit \\lbrak;5% chance\\rbrak;\\lpar;!\\amp#13;\\amp#47;gr 1d100\\lt5 if 5 or less rat carries disease\\rpar; of the ratcarrying disease. Save vs. Poison or \\lbrak;catch disease\\rbrak;\\lpar;!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who\'s been bitten?¦token_id}¦Rat Disease¦99¦0¦Caught disease from a rat¦death-zone\\rpar;, spattk:5% chance of carrying disease. On successful hit target save vs. poison or catch disease]{{subtitle=Creature}}Specs=[Black Rat,CreatureRace,0H,Creature]{{title=Black }}{{Section=**Attributes**}}{{Intelligence=Animal (1)}}{{AC=7}}{{Alignment=Neutral}}{{Move=15, Climb 3}}{{Hit Dice=¼ HD}}{{THAC0=20}}{{Attacks=Bite for 1HP damage \\amp 5% chance of save vs. poison or disease}}{{Size=T, 8ins long}}{{Life Expectancy=Short}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=**Possible disease:** There is a 5% chance that the rat carries disease of some type. If diseased, suffering a bite requires a save vs. poison or contract the diease}}{{Area Effects To Hit=}}{{Section6=**Special Disadvantages**}}{{Fear of Fire=Unless driven by hunger or magic, will avoid fire}}{{Section9=**Description**}}{{desc8=Rats are long-tailed rodents 5-12 inches long. They are aggressive, omnivorous, and adaptable, and they often carry diseases. The black rat is about 8 inches long, with a tail at least that long, a lean body, pointed nose, and long ears. The "black" rat is dark gray with brownish patches, and a gray or white belly. It is a good climber (climb 3) and jumper, but cannot swim. If rats infest a building, black rats inhabit the upper floors, and brown rats occupy the lower floor and the cellars.}}{{desc9=**Combat:** Rats normally flee anything bigger than themselves, but a trapped rat will do anything to survive and a pack of starving rats will attack anything in order to feed. Rats attack with their sharp front teeth and often carry diseases, so that a rat bite has a 5% chance of infecting its victim with a serious disease unless the victim makes a successful saving throw vs. poison. Normal rats fear fire, but brave it when very hungry.}}'},
{name:'Blink-Dog',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Blink Dog}}{{subtitle=Creature}}Specs=[Blink Dog,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Average (8 to 10)}}{{AC=5}}{{Alignment=Lawful Good}}{{Move=12}}{{Hit Dice=4}}{{THAC0=17}}{{Attack=Bite 1d6}}{{Languages=Blink Dog}}{{Size=M, 4ft long}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=**Teleport:** A dog will teleport on a roll of 7 or better on a 12-sided die. To determine where the dog appears, roll a 12-sided die: 1 = in front of opponent, 2 = shielded (or offhand) front flank, 3 = unshielded (or primary hand) front flank, 4-12 = behind. When blinking, the dog will appear from 1 to 3 feet from its opponent and will immediately be able to attack. Innate ability, never into objects}}{{Section6=**Special Disadvantages**}}{{Section7=None}}RaceData=[w:Blink Dog, align:LG, cattr:int=8:10|mov=12|ac=5|size=M|hd=4r3|thac0=17|attk1=1d6:Bite:0:P|attkmsg=Teleport on \\lbrak;7 on d12\\rbrak;\\lpar;!\\amp#13;\\amp#47;gr 1d12cs\\gt7 teleports on 7 or better\\rpar; to 1=front 2=shield/offhand 3=prime hand 4-12 rear on \\lbrak;1d12\\rbrak;\\lpar;!\\amp#13;\\amp#47;gr 1d12\\rpar; just before next attack (no retreating attack),spattk:Teleport just before attack, 75% to behind opponent]{{Section9=**Description**}}{{desc=Blink dogs are yellowish brown canines which are stockier and more muscular than other wild dogs. They are intelligent and employ a limited form of teleportation when they hunt.\nA blink dog attack is well organized. They will blink to and fro without any obvious pattern, using their powers to position themselves for an attack. Fully 75% of the time they are able to attack their targets from the rear. A dog will teleport on a roll of 7 or better on a 12-sided die. To determine where the dog appears, roll a 12-sided die: 1 = in front of opponent, 2 = shielded (or left) front flank, 3 = unshielded (or right) front flank, 4-12 = behind. When blinking, the dog will appear from 1 to 3 feet from its opponent and will immediately be able to attack.\nBlinking is an innate power and the animal will never appear inside a space occupied by a solid object. If seriously threatened, the entire pack will blink out and not return. Blink dogs are intelligent, and communicate in a complex language of barks, yaps, whines, and growls.}}'},
+ {name:'Blue-Dragon',type:'DragonRace',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}Specs=[Blue-Dragon,DragonRace,2H,Red-Dragon]{{}}RaceData=[w:Blue Dragon, cattr:int=11:12|mov=9|fly=30C|burrow=4|ac=4-??1|hd=(14+??2)d8r1|mr=(v(^((??1-4);0);1)*(??1-1)*5)|cl=mu:blue-dragon/pr:blue-dragon|lv=6+??1/6+??1|thac0=7-??2|dmg=??1|size=G|attk1=1d8:Claw x 2 or Claw+Kick:0:S|attk2=3d8:Bite:0:P|attk3=2d8:Tail Swipe:0:B|attkmsg=Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$\\lbrak;Show the radius\\rbrak;\\lpar;!rounds ~~aoe `{selected¦token_id}¦arc180¦feet¦0¦\\lbrak;\\lbrak;`{selected¦age¦max}*8\\rbrak;\\rbrak;¦\\lbrak;\\lbrak;`{selected¦age¦max}*16\\rbrak;\\rbrak;¦black\\rpar; then up to \\lbrak;\\lbrak;`{selected¦age¦max}\\rbrak;\\rbrak; opponents in the area take damage and Save vs. Petrification with the penalty shown below or be \\lbrak;Stunned\\rbrak;\\lpar;!rounds ~~target area¦`{selected¦token_id}¦\\amp#64;{target¦Select the stunned creature¦token_id}¦Stunned¦\\lbrak;\\amp#91;1+1d4\\amp#93;\\rbrak;¦-1¦Stunned by a dragon tail slap¦back-pain\\rpar; for 1d4+1 rounds., spattk:*Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*, spdef:Magic resistance @{selected|monstermagicresist}% and immune to electricity from birth, ns:=11],[cl:PW,w:Blue-Dragon-Breath,pd:-1,sp:1],[cl:PW,age:3,w:PR-Create-Water,pd:3,sp:1],[cl:PW,age:3,w:PR-Destroy-Water,pd:3,sp:1],[cl:PW,w:PW-Sound-Imitation,age:4,pd:-1,sp:1],[cl:PW,w:PR-Dust-Devil,age:6,pd:1,sp:1],[cl:PW,w:MU-Ventriloquism,age:8,pd:1,sp:1],[cl:PW,w:MU-Hallucinatory-Terrain,age:10,pd:1,sp:1],[cl:PR,lv:1,w:]{{}}%{Race-DB-Creatures|Red-Dragon}{{title=Blue}}{{Intelligence=Very intelligent (11-12)}}{{AC=Varies with age, adult blue dragon is AC -2}}{{Move=9, FL 30(C), Burrow 4}}{{Hit Dice=Varies with age, adult blue dragon is 16 HD}}{{THAC0=Varies with age, adult blue dragon is 5}}{{Section1=**Attacks:** Damage bonus varies with age, adult blue dragon is +6. 2 x Claws for 1d8 HP each, possibly with 1 or 2 kicks for 1d8 each, bite for 3d8, and tail slap for 2d8 and possible *stun* within an area varying with age. Several other attacks possible - see *Powers*}}{{Languages=*Blue Dragon* and *Evil Dragon Common*, and 12% of hatchlings (+5% per age level) can perform universal communication with any intelligent creature}}{{Breath Weapon=A bolt of electricity, 5ft wide extending 100ft from the dragon. Damage varies by age from 2d8+1 to 24d8+12. Save vs. Breath Weapon to take half damage}}{{Spell Casting=Knows a number of random wizard and priest spells cast at a level from 10 to 18 varying with age. All spells are cast at a speed of 1 segment regardless of the spell}}{{Spell-like Powers=*Young* dragons can cast *create or destroy water* x 3 per day, *Juveniles* can do *Sound Imitation* at will, *Adult* dragons gain *Dust Devil* once a day, *Old* dragons gain *Ventriloquism* x 1 per day, and *Venerable* gain *Hallucinatory Terrain* x 1 per day}}{{desc8=**Blue Dragons:** Blue dragons are extremely territorial and voracious. They love to spend long hours preparing ambushes for herd animals and unwary travelers, and they spend equally long hours dwelling on their success and admiring their trophies.\nThe size of a blue dragon\'s scales increases little as the dragon ages, although they do become thicker and harder. The scales vary in color from an iridescent azure to a deep indigo, retaining a glossy finish through all of the dragon\'s stages because the blowing desert sands polish them. This makes blue dragons easy to spot in barren desert surroundings. However, the dragons often conceal themselves, burrowing into the sand so only part of their heads are exposed.\nBlue dragons love to soar in the hot desert air; usually flying in the daytime when temperatures are the highest. Some blue dragons nearly match the color of the desert sky and use this coloration to their advantage in combat.\nBlue dragons are found in deserts; arid, windswept plains; and hot humid badlands. They enjoy the bleak terrain because there are few obstacles-only an occasional rock outcropping or dune-to interrupt the view of their territories. They spend hours looking out over their domains, watching for trespassers and admiring their property. Most of the blue dragons encountered will be alone because they do not want to share their territories with others. However, when a family is encountered the male dragon will attack ferociously, protecting his property-his mate and young. The female dragon also will join in the attack if the threat proves significant.\nBlue dragons\' enemies are men, who kill the dragons for their skin and treasure, and brass dragons, which share the same environment. If a blue dragon discovers a brass dragon in the same region, it will not rest until the trespassing dragon is killed or driven away.\nBlue dragons lair in vast underground caverns in which they store their treasure. Although blue dragons will collect anything which looks valuable, they are fond of gems - especially sapphires.}}{{desc9=**Combat:** Blue dragons prefer to fight from a distance so their opponents can clearly witness the full force of their breath weapon and so little or no threat is posed to themselves. Often blue dragons will attack from directly above or will burrow beneath the sands until opponents come within 100 feet. Older blue dragons will use their special abilities, such as hallucinatory terrain, in concert with these tactics to mask the land and aid in their chances to surprise. Blue dragons will only run from a fight if they are severely damaged, since they view retreat as cowardly.}}'},
{name:'Boalisk',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Boalisk, cattr:mov=12|hd=5+1r3|thac0=17|size=L| attk1=1d3:Bite:0:P|attk2=1+1d6:Constrict:0:B|attkmsg=A single creature meeing gaze e.g. surprised or attacking without -4 penalty must save vs. petrification or \\lbrak;suffer rot\\rbrak;\\lpar;!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who\'s the Victim?¦\\token_id}¦Boalisk Rot¦1¦1¦Suffering from a rotting disease. Oh... it\'ll be alright...?¦radioactive\\rpar;. Can do as a 3rd attack$$If successfully hit as well as damage this round \\lbrak;all future rounds\\rbrak;\\lpar;!rounds --target single¦`{selected¦token_id}¦\\amp#64;{target¦Who is the Unfortunate Victim?¦token_id}¦Boalisk Constrict¦\\amp#91;\\lbrak;99\\rbrak;\\amp#93;¦0¦Argh... The squeeze is on...¦back-pain\\rpar; automatically hit and do crushing damage, spattk:Once coiled victim takes crushing damage each round. Gaze attack causes rotting disease]{{}}Specs=[Constrictor Snake,CreatureRace,0H,Constrictor Snake]{{}}%{Race-DB-Creatures|Constrictor-Snake}{{title=Boalisk}}{{Move=12}}{{Hit Dice=5+1}}{{Attacks=Bite, attempt to coil \\amp constrict, and *Gaze* inflicts rotting disease}}{{Size=L, 25ft long}}{{Life Expectancy=Unknown}}{{Section5=**Constriction:** Suffering damage every round. Constricted humanoid creatures can escape the coils of normal constrictors with a successful open doors roll (at a -1 penalty).\n**Gaze Attack:** Any creature meeting its gaze (failing a saving throw vs. petrification) is infected with a magical rotting disease, identical to that inflicted by a mummy. Characters refusing to look at the boalisk automatically avoid its gaze but suffer a -4 penalty to their AC. Surprised victims always meet its gaze and gain no saving throw. The boalisk can use its gaze on a single victim each round in addition to normal biting and constriction attacks.}}'},
{name:'Boar',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Wild Boar}}RaceData=[w:Boar, align:N, weaps:none, ac:none, cattr:int=1|mov=15|ac=7|hd=3+3r4|thac0=17|size=M|attk1=3d4:Bite:0:P]{{subtitle=Creature}}Specs=[Boar,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Animal (1)}}{{AC=7}}{{Alignment=Neutral}}{{Move=15}}{{Hit Dice=3+3 HD}}{{THAC0=17}}{{Attacks=Bite for 3d4. Resilient in battle, meaning will continue to fight down to -7 HP}}{{Size=M}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=*Resilient in battle* meaning the Boar will continue to fight down to -7 HP}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=Wild boar continue to attack until they are reduced to -7 hit points. The giant boar is often called an alothere.}}'},
+ {name:'Brass-Dragon',type:'DragonRace',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}Specs=[Brass-Dragon,DragonRace,2H,Red-Dragon]{{}}RaceData=[w:Brass Dragon, cattr:int=13:14|mov=12|fly=30C|burrow=6|ac=1-??1|hd=(12+??2)d8r1|mr=(v(^((??1-4);0);1)*(??1-2)*5)|cl=mu:brass-dragon/pr:brass-dragon|lv=5+??1/5+??1|thac0=9-??2|dmg=??1|size=G|attk1=1d6:Claw x 2 or Claw+Kick:0:S|attk2=4d4:Bite:0:P|attk3=2d6:Tail Swipe:0:B|attkmsg=Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$\\lbrak;Show the radius\\rbrak;\\lpar;!rounds ~~aoe `{selected¦token_id}¦arc180¦feet¦0¦\\lbrak;\\lbrak;`{selected¦age¦max}*7\\rbrak;\\rbrak;¦\\lbrak;\\lbrak;`{selected¦age¦max}*14\\rbrak;\\rbrak;¦black\\rpar; then up to \\lbrak;\\lbrak;`{selected¦age¦max}\\rbrak;\\rbrak; opponents in the area take damage and Save vs. Petrification with the penalty shown below or be \\lbrak;Stunned\\rbrak;\\lpar;!rounds ~~target area¦`{selected¦token_id}¦\\amp#64;{target¦Select the stunned creature¦token_id}¦Stunned¦\\lbrak;\\amp#91;1+1d4\\amp#93;\\rbrak;¦-1¦Stunned by a dragon tail slap¦back-pain\\rpar; for 1d4+1 rounds., spattk:*Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*, spdef:Magic resistance @{selected|monstermagicresist}% and immune to fire and heat from birth, ns:=11],[cl:PW,w:Brass-Dragon-Breath,pd:-1,sp:1],[cl:PW,age:3,w:PR-Create-Water,pd:3,sp:1],[cl:PW,age:3,w:PR-Destroy-Water,pd:3,sp:1],[cl:PW,w:PR-Dust-Devil,age:4,pd:1,sp:1],[cl:PW,w:MU-Suggestion,age:6,pd:1,sp:1],[cl:PW,w:PR-Control-Temperature-10ft-Radius,age:7,pd:3,sp:1],[cl:PW,w:PR-Control-Winds,age:8,pd:1,sp:1],[cl:PW,w:PW-Summon-Djinni,age:12,pd:1,sp:1],[cl:PR,lv:1,w:],[cl:PR,lv:2,w:]{{}}%{Race-DB-Creatures|Red-Dragon}{{title=Brass}}{{Intelligence=Highly intelligent (13-14)}}{{AC=Varies with age, adult brass dragon is AC -2}}{{Move=12, FL 30(C), Burrow 6}}{{Hit Dice=Varies with age, adult brass dragon is 14 HD}}{{THAC0=Varies with age, adult brass dragon is 7}}{{Section1=**Attacks:** Damage bonus varies with age, adult brass dragon is +6. 2 x Claws for 1d6 HP each, possibly with 1 or 2 kicks for 1d6 each, bite for 4d4, and tail slap for 2d6 and possible *stun* within an area varying with age. Several other attacks possible - see *Powers*}}{{Languages=*Brass Dragon* and *Good Dragon Common*, and can *speak with animals* freely from birth. 12% of hatchlings (+5% per age level) can perform universal communication with any intelligent creature}}{{Breath Weapon=A brass dragon has two breath weapons: a cone of sleep gas 70\' long, 5\' wide at the dragon\'s mouth, and 20\' wide at its end; or a cloud of blistering desert heat 50\' long, 40\' wide, and 20\' high. Creatures caught in the gas, regardless of Hit Dice or level, must save vs. breath weapon for half or fall asleep (as per *sleep* spell). Damage from the heat breath weapon varies by age from 2d4+1 to 24d4+12. Save vs. Breath Weapon to take half damage}}{{Spell Casting=Knows a number of random wizard and priest spells cast at a level from 10 to 17 varying with age. All spells are cast at a speed of 1 segment regardless of the spell}}{{Spell-like Powers=*Young* dragons can cast *create or destroy water* x 3 per day, *Juveniles* can do *Dust Devil* x1 per day, *Adult* dragons gain *Suggestion* once a day, *Mature Adults* can do *Control Temperature 10ft Radius* x3 per day, *Old* dragons *Control Winds* x 1 per day, and a *Great Wyrm* can *Summon a Djinni* x 1 per day}}{{desc8=**Brass Dragons:** Brass dragons are great talkers, but not particularly good conversationalists. They are egotistical and often boorish. They oftern have useful information, but will divulge it only after drifting off the subject many times and after hints that a gift would be appreciated.\nAt birth, a brass dragon\'s scales are dull. Their color is a brassy, mottled brown. As the dragon gets older, the scales become more brassy, until they reach a warm burnished appearance.\nBrass dragons are found in arid, warm climates; ranging from sandy deserts to dry steppes. They love intense, dry heat and spend most of their time basking in the sun. They lair in high caves, preferably facing east where the sun can warm the rocks, and their territories always contain several spots where they can bask and trap unwary travelers into conversation.\nBrass dragons are very social. They usually are on good terms with neighboring brass dragons and sphinxes. Brass dragons are dedicated parents. If their young are attacked they will try to slay the enemy, using their heat breath weapons and taking full advantage of their own immunity. Because they share the same habitat, blue dragons are brass dragons\' worst enemies. Brass dragons usually get the worst of a one-on-one confrontation, mostly because of the longer reach of the blue dragon\'s breath weapon. Because of this, brass dragons usually try to evade blue dragons until they can rally their neighbors for a mass attack.}}{{desc9=**Combat:** Brass dragons would rather talk than fight. If an intelligent creature tries to take its leave of a brass dragon without talking to it at length, the dragon might have a fit of pique and try to force a conversation with suggestion or by giving the a dose of sleep gas. If the victim falls asleep it will awaken to find itself pinned under the dragon or buried to the neck in the sand until the dragon\'s thirst for small talk is slaked. Before melee, brass dragons create a cloud of dust with dust devil or control winds, then charge or snatch. Brass dragons often use control temperature to create heat to discomfort their opponents. When faced with real danger, younger brass dragons will fly out of sight, then hide by burrowing. Older dragons spurn this ploy.}}'},
+ {name:'Bronze-Dragon',type:'DragonRace',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}Specs=[Bronze-Dragon,DragonRace,2H,Red-Dragon]{{}}RaceData=[w:Bronze Dragon, cattr:int=15:16|mov=9|fly=30C|swim=12|ac=2-??1|hd=(14+??2)d8r1|mr=(v(^((??1-4);0);1)*(??1-1)*5)|cl=mu:bronze-dragon/pr:bronze-dragon|lv=7+??1/7+??1|thac0=8-??2|dmg=??1|size=G|attk1=1d8:Claw x 2 or Claw+Kick:0:S|attk2=4d6:Bite:0:P|attk3=2d8:Tail Swipe:0:B|attkmsg=Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$\\lbrak;Show the radius\\rbrak;\\lpar;!rounds ~~aoe `{selected¦token_id}¦arc180¦feet¦0¦\\lbrak;\\lbrak;`{selected¦age¦max}*10\\rbrak;\\rbrak;¦\\lbrak;\\lbrak;`{selected¦age¦max}*20\\rbrak;\\rbrak;¦black\\rpar; then up to \\lbrak;\\lbrak;`{selected¦age¦max}\\rbrak;\\rbrak; opponents in the area take damage and Save vs. Petrification with the penalty shown below or be \\lbrak;Stunned\\rbrak;\\lpar;!rounds ~~target area¦`{selected¦token_id}¦\\amp#64;{target¦Select the stunned creature¦token_id}¦Stunned¦\\lbrak;\\amp#91;1+1d4\\amp#93;\\rbrak;¦-1¦Stunned by a dragon tail slap¦back-pain\\rpar; for 1d4+1 rounds., spattk:*Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*, spdef:Magic resistance @{selected|monstermagicresist}% and immune to electricity from birth, ns:=11],[cl:PW,w:Bronze-Dragon-Breath,pd:-1,sp:1],[cl:PW,age:1,w:MU-Water-Breathing,pd:-1,sp:1],[cl:PW,age:3,w:PR-Create-Food-and-Water,pd:3,sp:1],[cl:PW,w:MU-Polymorph-Self,age:3,pd:3,sp:1],[cl:PW,w:MU-Wall-of-Fog,age:4,pd:1,sp:1],[cl:PW,w:MU-ESP,age:6,pd:3,sp:1],[cl:PW,w:PW-Bronze-Dragon-Airy-Water,age:7,pd:3,sp:1],[cl:PW,w:PR-Weather-Summoning,age:8,pd:1,sp:1],[cl:PR,lv:1,w:],[cl:PR,lv:2,w:],[cl:PR,lv:3,w:]{{}}%{Race-DB-Creatures|Red-Dragon}{{title=Bronze}}{{Intelligence=Exceptional (15-16)}}{{AC=Varies with age, adult bronze dragon is AC -4}}{{Move=9, FL 30(C), Swim 12}}{{Hit Dice=Varies with age, adult bronze dragon is 16 HD}}{{THAC0=Varies with age, adult bronze dragon is 6}}{{Section1=**Attacks:** Damage bonus varies with age, adult bronze dragon is +6. 2 x Claws for 1d8 HP each, possibly with 1 or 2 kicks for 1d8 each, bite for 4d6, and tail slap for 2d8 and possible *stun* within an area varying with age. Several other attacks possible - see *Powers*}}{{Languages=*Bronze Dragon* and *Good Dragon Common*, and can *speak with animals* freely from birth. 16% of hatchlings (+5% per age level) can perform universal communication with any intelligent creature}}{{Breath Weapon=A bronze dragon has two breath weapons: a stroke of lightning 100\' long and 5\' side or a cloud of repulsion gas 20\' long, 30\' wide, and 30\' high. Creatures caught in the gas must save vs. breath weapon or move away from the dragon for two minutes per age level of the dragon, plus 1-6 minutes. Creature caught in the lightning take damage, save vs. breath weapon for half. Damage from the lightning breath weapon varies by age from 2d8+1 to 24d8+12. Save vs. Breath Weapon to take half damage}}{{Spell Casting=Knows a number of random wizard and priest spells cast at a level from 11 to 19 varying with age. All spells are cast at a speed of 1 segment regardless of the spell}}{{Spell-like Powers=*Young* dragons can *create food and water* and *polymorph self* x 3 per day, *Juveniles* can do *Wall of Fog* x1 per day, *Adult* dragons gain *ESP* x3 a day, *Mature Adults* can do *Air Water* x3 per day in a [[10*@{selected|age|max}]]ft radius, and *Old* dragons can *Summon Weather* x 1 per day}}{{desc8=**Bronze Dragons:** Bronze dragons are inquisitive and fond of humans and demi-humans. They enjoy polymorphing into small, friendly animals so they can unobtrusively observe humans and demi-humans, especially adventurers. Bronze dragons thrive on simple challenges such as riddles and harmless contests. They are fascinated by warfare and will eagerly join an army if the cause is just and the pay is good.\nAt birth, a bronze dragon\'s scales are yellow tinged with green, showing only a hint of bronze. As the dragon approached adulthood, its color deepens slowly changing to a rich bronze tone that gets darker as the dragon ages. Dragons from the very old stage on develop a blue-black tint to the edges of their scales, similar to a patina on ancient bronze armor or statues.\nBronze dragons like to be near deep fresh or salt water. They are good swimmers and often visit the depths to cool off or to hunt for pearls or treasure from sunken ships. They prefer caves that are accessible only from the water, but their lairs are always dry--they do not lay eggs, sleep, or store treasure under water.\nBronze dragons are fond of sea mammals, especially dolphins and whales. These animals provide the dragons with a wealth of information on shipwrecks, which the dragons love to plunder, and detail the haunts of large sharks. Bronze dragons detest pirates, disabling or destroying their ships.}}{{desc9=**Combat:** Bronze dragons dislike killing creatures with animal intelligence and would rather bribe them (perhaps with food), or force them away with repulsion. When confronted with intelligent opponents bronze dragons use their ESP ability to learn their opponents\' intentions. When attacking they blind their opponents with wall of fog, then charge. Or, if they are flying they will snatch opponents. When fighting under water, they use airy water to maintain the effectiveness of their breath weapons, and to keep away purely aquatic opponents. Against boats or ship they summon a storm or use their tail slap to smash the vessels\' hulls. If the dragon is inclined to be lenient, seafaring opponents might merely find themselves becalmed, fog bound, or with broken masts.}}'},
{name:'Broom-of-Animated-Attack',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Broom of Animated Attack}}RaceData=[w:Broom of Animated Attack, align:N, weaps:none, ac:none, cattr:int=0|mov=12|ac=7|hd=4|hp=18|thac0=17|size=M|attk1=1d3:Handle End x 2:0:B|attk2=0:Broom End x 2:0:S|attkmsg=$$Instead of doing damage the broom end blinds for 1 round on a successful hit|dmgmsg=$$Blinds victim for 1 round]{{subtitle=Creature}}Specs=[Broom of Animated Attack,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Not (0)}}{{AC=7}}{{Alignment=Neutral}}{{Move=12}}{{Hit Dice=4 HD}}{{Hit Points=18HP}}{{THAC0=17}}{{Attacks=2 x bludgeoning with handle for 1d3 each, 2 x slashes with broom which blinds if hits}}{{Size=M}}{{Section2=**Powers**}}{{Section3=Broom animates if commanded to act like a *Broom of Flying*}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=If a command word ("fly,\'\' "soar,\'\' etc.) is spoken, the broom will do a loop-the-loop with its hopeful rider, dumping him on his head from 1d4 + 5 feet off the ground. The broom will then attack the stunned victim, swatting the face with the straw/twig end to blind and beating with the handle end.\nThe broom gets two attacks per round with each end (two swats with the straw, two with the handle). It attacks as if it were a 4-Hit-Dice monster. The straw end causes blindness for one round if it hits. The other end causes 1d3 points of damage when it hits. The broom is Armor Class 7 and takes 18 hit points to destroy.}}'},
{name:'Brown-Bear',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Brown }}{{name=Bear}}{{subtitle=Creature}}Specs=[Brown Bear,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Semi- (2 to 4)}}{{AC=6}}{{Alignment=Neutral}}{{Move=12}}{{Hit Dice=5+5}}{{THAC0=15}}{{Attack=2 x Claw 1d6, 1 x Bite 1d8}}{{Languages=None}}{{Size=L, 9ft tall}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=**Hug:** If score a critical hit (natural roll of 18 or better), then also do a hug for 2d6 additional damage}}{{Section6=**Fortitude:** Continue to fight for 1-4 melee rounds after reaching 0 to -8 hit points. At -9 or fewer hit points, they are killed immediately.}}{{Section7=**Special Disadvantages**}}{{Section8=None}}RaceData=[w:Brown Bear, cattr:int=2:4|mov=12|ac=6|size=L|hd=5+5r3|thac0=15|ch=18|attk1=1d6:Claw1:0:S|attk2=1d6:Claw2:0:S|attk3=1d8:Bite:1:P|dmgmsg=If get a Critical Hit \\lpar;18 or better natural roll\\rpar; also get to \\lbrak;Hug for another 2d6\\rbrak;\\lpar;!\\amp#13;\\amp#47;gmroll 2d6 Hug damage\\rpar;. Continue to fight for 4 rounds to -8HP,spattk:Hug if roll a critical hit of 18 or better \\amp continue to fight to -8HP]{{Section9=**Description**}}{{desc=The brown bear, of which the infamous grizzly is the most well known variety, is a bear of very aggressive disposition. Brown bears are more carnivorous than their smaller cousins, the black bears. The grizzly in particular will often bring down large game such as deer and elk.\nBrown bears are aggressive hunters. If a brown bear scores a paw hit with a roll of 18 or better it will also hug for 2-12 (2d6) points of additional damage. Brown bears will continue to fight for 1-4 melee rounds after reaching 0 to -8 hit points. At -9 or fewer hit points, they are killed immediately.}}'},
{name:'Brown-Rat',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Brown Rat, cattr:swim=3]{{}}Specs=[Brown Rat,CreatureRace,0H,Black Rat]{{}}%{Race-DB-Creatures|Black-Rat}{{title=Brown }}{{Move=15, Swim 3}}{{desc8=Rats are long-tailed rodents 5-12 inches long. They are aggressive, omnivorous, and adaptable, and they often carry diseases. The brown rat, also known as the sewer rat or the wharf rat, is 5-10 inches long, and its tail is shorter than the black rat\'s. Its eyes and ears are also smaller, but it has a larger, fatter body. Brown rats may be gray, white, black, or piebald in color. They cannot climb, but are excellent swimmers (swim 3) and burrowers.If rats infest a building, black rats inhabit the upper floors, and brown rats occupy the lower floor and the cellars.}}'},
@@ -942,8 +963,19 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Bullywug-Sub-Chief',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Sub-Chief/Leader}}RaceData=[w:Bullywug Sub-Chief, cattr:hd=2r6|dmg=+1|size:M]{{subtitle=Creature}}%{Race-DB-Creatures|Bullywug}{{Hit Dice=2}}{{Hit Points=12+ HP}}{{Size=M, 5-6ft tall}}{{Strength=Strength gives a bonus of +1 on damage}}Specs=[Bullywug Sub-Chief,CreatureRace,0H,Bullywug]{{desc=**Bullywug Sub-Chief:** Communities of 30 or more bullywugs have a powerful leader (2 HD, 12+ hp, +1 to damage). Communities of 60 or more bullywugs have five subchieftains (2 HD, 12+ hp, +1 to damage).}}'},
{name:'Carrion-Crawler',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Carrion Crawler}}{{subtitle=Creature}}Specs=[Carrion Crawler,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Non (0)}}{{AC=7 (except head = 3)}}{{Alignment=Neutral}}{{Move=12}}{{Hit Dice=3d8+1}}{{THAC0=17}}{{Attack=8 paralysing tenticles \\amp 1d2 bite}}{{Languages=None}}{{Size=L, 9ft long,}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Paralysation=On a hit with a tenticle, save to negate}}{{Section4=**Special Advantages**}}{{Keen senses=Rely on exceptional sight and smell}}RaceData=[w:Carrion Crawler, align:N, cattr:int=0|mov=12|size=L|hd=3+1|thac0=17|attk1=0:Tenticle:0:B|attk2=1d2:Bite:1:P|dmgmsg=Save vs Paralysation or \\lbrakParalysed\\rbrak(!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Select Target¦token_id}¦Paralysation¦\\amp#91;\\lbrak;10\\amp#42;2d6\\rbrak;\\amp#93;¦-1¦Paralysed by a Carrion Crawler tenticle¦padlock) for 2d6 turns$$]{{Section9=**Description**}}{{desc=The carrion crawler is a scavenger of subterranean areas, feeding primarily upon carrion. When such food becomes scarce, however, it will attack and kill living creatures.\nThe crawler looks like a cross between a giant green cutworm and a cephalopod. Like so many other hybrid monsters, the carrion crawler may well be the result of genetic experimentation by a mad, evil wizard.\nThe monster\'s head, which is covered with a tough hide that gives it Armor Class 3, sprouts eight slender, writhing tentacles. The body of the carrion crawler is not well protected and has an armor class of only 7.\nThe monster is accompanied by a rank, fetid odor which often gives warning of its approach.}}{{desc1=**Combat:** The carrion crawler can move along walls, ceilings and passages very quickly, using its many clawed feet for traction.\nWhen attacking, the monster lashes out with its 2\' long tentacles, each of which produces a sticky secretion that can paralyze its victims for 2-12 turns. A save versus paralyzation is allowed to escape these effects. They kill paralyzed creatures with their bite which inflicts 1-2 points of damage. The monster will always attack with all of its tentacles.\nCarrion crawlers are non-intelligent, and will continue to attack as long as any of their opponents are unparalyzed. Groups of crawlers attacking together will not fight in unison, but will each concentrate on paralyzing as many victims as they can. When seeking out prey, they rely primarily on their keen senses of sight and smell. Clever travelers have been known to fool an approaching carrion crawler with a sight and smell illusion, thus gaining time to make good their escape.}}'},
{name:'Cave-Bear',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Cave }}RaceData=[w:Cave Bear, cattr:size=H|hd=6+6r3|thac0=17|attk1=1d8:Claw1:0:S|attk2=1d8:Bite:0:S|attk3=1d12:Bite:1:P|dmgmsg=If get a Critical Hit \\lpar;18 or better natural roll\\rpar; also get to \\lbrak;Hug for another 2d8\\rbrak;\\lpar;!\\amp#13;\\amp#47;gmroll 2d8 Hug damage\\rpar;. Continue to fight for 4 rounds to -8HP,spattk:Hug if roll a critical hit of 18 or better \\amp continue to fight to -8HP]{{subtitle=Creature}}%{Race-DB-Creatures|Brown-Bear}{{Hit Dice=6+6}}{{THAC0=13}}Specs=[Cave Bear,CreatureRace,0H,Brown-Bear]{{Attack=2 x Claw 1d8, 1 x Bite 1d12}}{{Size=H, 12ft tall}}{{Section5=**Hug:** If score a critical hit (natural roll of 18 or better), then also do a hug for 2d8 additional damage}}{{desc=Cave bears are quite aggressive, willing to attack well-armed parties without provocation. If a cave bear scores a paw hit with an 18 or better it also hugs for 2-16 (2d8) points of additional damage. Cave bears will continue to fight for 1-4 melee rounds after reaching 0 to -8 hit points. At -9 or fewer hit points, they are killed immediately.}}'},
+ {name:'Centaur',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Centaur}}RaceData=[w:Centaur, align:N|NN|NG|CG, ac:magicitem|ring|cloak, cattr:int=5:10|mov=18|ac=5|hd=4r3|thac0=17|size=L|attk1=1d6:Hooves x 2:0:B, ns:1],[cl:WP,%:50,prime:Morningstar],[cl:WP,%:15,prime:composite-shortbow,items:sheaf-arrows:10*1d3],[cl:WP,%:10,prime:composite-longbow,items:flight-arrows:10*1d3]{{subtitle=Creature}}Specs=[Centaur,CreatureRace,2H,Creature]{{Section=**Attributes**}}{{Intelligence=Low to Average (5-10)}}{{AC=4 is natural AC. Do not wear armour, but may use a shield}}{{Alignment=Neutral or Chaotic Good}}{{Move=18}}{{Hit Dice=4HD}}{{THAC0=17}}{{Section1=**Attacks:** 2 x Hooves for 1d6 HP damage, and either using a large Club (equivalent of a morningstar) for 1d6 damage (50%), or a Composite long- or shortbow with flight or sheaf arrows (25%). The remaining 25% are leaders.}}{{Languages=Their own language and some among them (about 10%) can converse in the tongue of elves.}}{{Size=L, 8ft to 9ft tall}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Spell Casting=}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=Centaurs are woodland beings who shun the company of men. They dwell in remote, secluded glades and pastures.\nThe appearance of a centaur is unmistakable: they have the upper torso, arms, and head of a human being and the lower body of a large, powerful horse.\nCentaurs are sociable creatures, taking great pleasure in the society of others of their kind. Their overall organization is tribal, with a tribe divided into family groups living together in harmony. The size of the tribe varies, it range from 3-4 families to upwards of 20 families. Since males have the dangerous roles of hunter and protector, females outnumber males by two to one. The centaur mates for life, and the entire tribe participates in the education of the young.\nThe lair is located deep within a forest, and consists of a large, hidden glade and pasture with a good supply of running water. Depending upon the climate, the lair may contain huts or lean-tos to shelter the individual families. Centaurs are skilled in horticulture, and have been known to cultivate useful plants in the vicinity of their lair. In dangerous, monster infested areas, centaurs will sometimes plant a thick barrier of tough thorn bushes around their lair and even set traps and snares. In the open area, away from the trees, are hearths for cooking and warmth. If encountered in their lair, there will be 1-6 additional males, females equal to twice the number of males, and 5-30 young. The females (3 Hit Dice) and the young (1-3 Hit Dice) will fight only with their hooves, and only in a life or death situation.\nCentaurs survive through a mixture of hunting, foraging, fishing, agriculture and trade. Though they shun dealings with humans, centaurs have been known to trade with elves, especially for food and wine. The elves are paid from the group treasury, which comes from the booty of slain monsters. \nThe territory of a centaur tribe varies with its size and the nature of the area it inhabits. Centaurs are also not above sharing a territory with elves.\nCentaurs will take the treasure of their fallen foes, and are fully aware of its value. Most male centaurs have a small coin supply, while the tribe has a treasury which may well include some magical items. This treasure is used to buy food for the group, or to ransom (90% likely) captured or threatened members of the tribe.\nWhile basically neutral or chaotic good, centaurs have been known to become rowdy, boorish, and aggressive when under the influence of alcohol. They are also extremely protective of their females and young. Centaurs are basically pastoral, but will react with violence if their lifestyle and survival is threatened.}}{{desc9=**Combat:** A band of centaurs is always armed. Half of the centaurs will be wielding oaken clubs (the equivalent of morning stars), one quarter will carry composite bows and have 10-30 arrows (either flight or sheaf, depending on the current state of affairs in the area). The remainder of the band will be leaders. Centaurs make 3 attacks each round in melee: once with their weapons and twice with their hooves.\nThe attitude of a centaur toward a stranger in its territory will vary with the visitor. Humans and dwarves will usually be asked to leave in a polite manner, while halflings or gnomes will be tolerated, and elves will be welcomed. Monsters will be dealt with in a manner according to the threat they represent to the welfare and survival of the tribe. Were a giant or dragon to enter the territory, the centaurs would pull up stakes and relocate, while trolls and orcs and their like will be killed.}}'},
+ {name:'Centaur-Druid',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Centaur Druid, cattr:cl=pr:druid|lv=3, ns:1]{{}}Specs=[Centaur Druid,CreatureRace,2H,Centaur-Leader]{{}}%{Race-DB-Creatures|Centaur-Leader}{{name=Druid}}{{Spell Casting=Each tribe will have a priest who is treated as a leader but has the spell abilities of a 3rd level druid.}}{{desc7=**Centaur Druid:** A band of centaurs is always armed, and the leaders carry shields. 25% of any band of Centaurs will be leaders (AC4; HD5) using medium shields and medium horse lances. Each tribe will have a priest who is treated as a leader but has the spell abilities of a 3rd level druid.}}'},
+ {name:'Centaur-Leader',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Centaur Leader, ac:shield|magicitem|ring|cloak, cattr:int=8:10|hd=5r3, ns:1],[cl:WP,prime:Light-Horse-Lance,offhand:shield]{{}}Specs=[Centaur Leader,CreatureRace,2H,Centaur]{{}}%{Race-DB-Creatures|Centaur}{{name=Leader}}{{Intelligence=Average (8-10)}}{{AC=4 is natural AC. May use a shield}}{{Hit Dice=5HD}}{{Section1=**Attacks:** 2 x Hooves for 1d6 HP damage, and a light horse lance}}{{desc7=**Centaur Leader:** A band of centaurs is always armed, and the leaders carry shields. 25% of any band of Centaurs will be leaders (AC4; HD5) using medium shields and medium horse lances.}}'},
{name:'Chest',type:'Container',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Ordinary Untrapped, Unlocked Chest}}{{subtitle=Container}}Specs=[Ordinary-unlocked-untrapped-chest,Container,0H,Container]{{Size=3ft x 2ft x 2ft}}{{Slots=This chest has stackable 8 slots}}RaceData=[w:Ordinary Unlocked Untrapped Chest, slots:8, lock:No-Lock, trap:No-Trap, cimg:https://s3.amazonaws.com/files.d20.io/images/163011054/LD6xZDT2SlYSow0Q5QHb3g/thumb.png?1599509586|70|50, oimg:https://s3.amazonaws.com/files.d20.io/images/352175458/BYTfuvbA_JvbL0IUjeM0Ug/thumb.png?1690472095],{{Use=Items can be stored in this container and it can be looted without configuring or setting off any traps or overcoming any locks}}{{desc=This is an ordinary unlocked \\amp untrapped chest. When searched, it will automatically open and list its contents. Resetting it just closes it again. The GM can change its images by selecting the token and using the [Configure Container] action button}}'},
+ {name:'Cloud-Castle-Giant',type:'CreatureRace',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Cloud Castle Giant, align:NG, ns:3],[cl:PW,w:MU-Levitate,sp:2,pd:3],[cl:PW,w:MU-Fog-Cloud, sp:2, pd:3],[cl:PW,w:MU-Wall-Of-Fog,sp:1, pd:1]{{{}}Specs=[Cloud-Giant-Priest,CreatureRace,2H,Cloud-Giant]{{}}%{Race-DB-Creatures|Cloud-Giant}{{name=Priest}}{{Section3=}}{{Spell Casting=10% of good cloud giants live in castles on enchanted clouds. All giants dwelling there are able to levitate their own weight plus 2,000 pounds three times a day, create a fog cloud three times a day, and create a wall of fog once a day. These abilities are performed as a 6th level wizard.}}'},
+ {name:'Cloud-Giant',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=Cloud }}{{title=Giant}}RaceData=[w:Cloud Giant, align:NG|NE, ac:magicitem|ring|cloak, cattr:int=8:12|mov=15|ac=0|hd=16+1d6+1r1|thac0=5|tohit=+5|dmg=+11|size=H|attk1=1d10:Fist:0:B, ns:1],[cl:WP,prime:Cloud-Giant-Morningstar,items:CG-Rock:1d4+1]{{subtitle=Creature}}Specs=[Cloud-Giant,CreatureRace,2H,Creature]{{Section=**Attributes**}}{{Intelligence=Average to Very (8-12)}}{{AC=0 is natural AC. Do not wear armour, but prize magical devices (and 5% will have one)}}{{Alignment=Neutral, 50% NG, 50% NE, often living in small groups of no more than 6}}{{Move=15}}{{Hit Dice=16HD +1d6+1}}{{THAC0=5}}{{Section1=**Attacks:** +5 on ToHit rolls from strength. 1 x Fist for 1d10 HP damage, or using a Cloud Giant Morningstar for 6d4 plus strength bonus of +11. Throw rocks 3 to 230 yards doing 2d12 damage}}{{Languages=*Cloud Giant* and *Giant Common*. In addition, 60% of Cloud Giants speak *Common*}}{{Size=H, 24ft tall}}{{Life Expectancy=About 400 years}}{{Section2=**Powers**}}{{Section3=None}}{{Spell Casting=}}{{Levitate=}}{{Fog Cloud=}}{{Wall of Fog=}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc7=**Cloud giants:** consider themselves above all other giants, save storm giants, whom they consider equals.\nThey are creative, appreciate fine things, and are master strategists in battle. Cloud giants have muscular human builds and handsome, well-defined features. The typical cloud giant is 24 feet tall and weighs 11,500 pounds. Female cloud giants can be 1 to 2 feet shorter and 1,000 to 2,000 pounds lighter. Cloud giants\' skin ranges in color from a milky-white tinged with blue to a light sky blue. Their hair is silvery white or brass and their eyes are an iridescent blue.\nCloud giants dress in clothing made of the finest materials available and wear jewelry. Many of the giants consider their appearance an indication of their station; the more jewelry and the better the clothes, the more important the giant. Cloud giants also appreciate music, and the majority of giants are able to play one or more instruments (their favorite is the harp). Unlike most other giant races, cloud giants leave their treasure in their lairs, carrying with them only food, throwing rocks, 10-100 (10d10) coins, and a musical instrument.\nCloud giants live in small clans of no more than six giants. However, these clans know the location of 1-8 other clans and will band together with some of these clans for celebrations, battles, or to trade. These joined clans will recognize one among them to be their leader -- this is usually an older cloud giant who has magical abilities. One in 10 cloud giants will have spells equivalent to a 4th level wizard, and one in 20 cloud giants will be the equivalent of a 4th level priest. A cloud giant cannot have both priest and wizard abilities.\nThe majority of cloud giants live on cloud-covered mountain peaks in temperate and sub-tropical areas. These giants make their lairs in crude castles.}}{{desc9=**Combat:** Cloud giants fight in well-organized units, using carefully developed battle plans. They prefer to fight from a position above their opponents. A favorite tactic is to circle the enemy, barraging them with rocks while the giants with magical abilities assault them with spells. Cloud giants can hurl rocks to a maximum of 240 yards, causing 2-24 (2d12) points of damage. Their huge morningstars do 6-24 (6d4)+11 points of damage, three times normal (man-sized) damage plus their strength bonus. One in 10 cloud giants will have a magical weapon.}}'},
+ {name:'Cloud-Giant-Juvenile-1',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Cloud Giant Juvenile 1,cattr:hd:13+1d4+1|tohit=+4|dmg=+10,ns:=1],[cl:WP,both:Cloud-Giant-Morningstar]{{}}Specs=[Cloud-Giant-Juvenile-1,CreatureRace,2H,Cloud-Giant]{{}}%{Race-DB-Creatures|Cloud-Giant}{{name= Juvenile-1}}'},
+ {name:'Cloud-Giant-Juvenile-2',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Cloud Giant Juvenile 2,cattr:hd:14+1d4+1|tohit=+4|dmg=+10,ns:=1],[cl:WP,both:Cloud-Giant-Morningstar]{{}}Specs=[Cloud-Giant-Juvenile-2,CreatureRace,2H,Cloud-Giant]{{}}%{Race-DB-Creatures|Cloud-Giant}{{name= Juvenile-2}}'},
+ {name:'Cloud-Giant-Juvenile-3',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Cloud Giant Juvenile 3,cattr:hd:15+1d4+1|tohit=+4|dmg=+10,ns:=1],[cl:WP,both:Cloud-Giant-Morningstar]{{}}Specs=[Cloud-Giant-Juvenile-3,CreatureRace,2H,Cloud-Giant]{{}}%{Race-DB-Creatures|Cloud-Giant}{{name= Juvenile-3}}'},
+ {name:'Cloud-Giant-Priest',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Cloud Giant Priest,cattr:cl=mu:wizard|lv=4]{{}}Specs=[Cloud-Giant-Priest,CreatureRace,2H,Cloud-Giant]{{}}%{Race-DB-Creatures|Cloud-Giant}{{name=Priest}}{{Section3=}}{{Spell Casting=One in 20 cloud giants will be the equivalent of a 4th level priest. A cloud giant cannot have both priest and wizard abilities.}}'},
+ {name:'Cloud-Giant-Wizard',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Cloud Giant Wizard,cattr:cl=mu:wizard|lv=4],[cl:MU,lv:1,w:random|random|random|random|random|random|random|random|random|random],[cl:MU,lv:2,w:random|random|random|random|random|random|random|random|random|random]{{}}Specs=[Cloud-Giant-Wizard,CreatureRace,2H,Cloud-Giant]{{}}%{Race-DB-Creatures|Cloud-Giant}{{name=Wizard}}{{Section3=}}{{Spell Casting=One in 10 cloud giants will have spells equivalent to a 4th level wizard. A cloud giant cannot have both priest and wizard abilities.}}'},
{name:'Constrictor-Snake',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Constrictor Snake, cattr:mov=9|hd=3+2r3|thac0=17|size=M| attk1=1:Bite:0:P|attk2=1d3:Constrict:0:B|dmgmsg=$$If successfully hit as well as damage this round \\lbrak;all future rounds\\rbrak;\\lpar;!rounds --target single¦`{selected¦token_id}¦\\amp#64;{target¦Who is the Unfortunate Victim?¦token_id}¦Constrict¦\\amp#91;\\lbrak;99\\rbrak;\\amp#93;¦0¦Argh... The squeeze is on...¦back-pain\\rpar; automatically hit and do crushing damage, spattk:Once coiled victim takes crushing damage each round]{{}}Specs=[Constrictor Snake,CreatureRace,0H,Poison Snake 1-4]{{}}%{Race-DB-Creatures|Poison-Snake-1-4}{{title=Constrictor Snake}}{{Move=9}}{{Hit Dice=3+2}}{{THAC0=17}}{{Attacks=Bite and attempt to coil \\amp constrict}}{{Size=M 10-20ft long}}{{Life Expectancy=Various}}{{Section5=**Constriction:** Suffering damage every round. Constricted humanoid creatures can escape the coils of normal constrictors with a successful open doors roll (at a -1 penalty).}}{{desc8=Snakes are long, slender reptiles that can be found anywhere in the entire world, even in the coldest arctic regions.\nThere are basically two types of snakes, in all manner of sizes. The poisonous snakes make up for their relatively smaller size with deadly venoms, while the larger constrictors squeeze their victims to death. Both types sleep for days after eating. All snakes shed their skin several times each year.\nCommon constrictor species include anacondas, boas, and reticulate pythons, all of which can reach lengths of 30 feet. Their skin is valuable, with an unblemished skin selling for as much as 100 gp.}}{{desc9=**Combat:** Constrictors of all sizes hide in the branches of trees, waiting patiently until they can slowly lower themselves or suddenly drop onto their unsuspecting victims. Once they strike, the victim is constricted automatically, suffering damage every round. Constricted humanoid creatures can escape the coils of normal constrictors with a successful open doors roll (at a -1 penalty). Anyone who attempts to free a captive by hacking at the constrictor has a 20% chance of striking the victim instead (roll normal damage\nand apply it to the victim). Area spells like fireball will likewise affect both combatants, but target-specific spells like charm monster and magic missile are more precise.}}'},
+ {name:'Copper-Dragon',type:'DragonRace',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}Specs=[Copper-Dragon,DragonRace,2H,Red-Dragon]{{}}RaceData=[w:Copper Dragon, cattr:int=13:14|mov=9|fly=30C|Jump=3|ac=3-??1|hd=(13+??2)d8r1|mr=(v(^((??1-4);0);1)*(??1-3)*5)|cl=mu:copper-dragon/pr:copper-dragon|lv=6+??1/6+??1|thac0=9-??2|dmg=??1|size=G|attk1=1d6:Claw x 2 or Claw+Kick:0:S|attk2=5d4:Bite:0:P|attk3=2d6:Tail Swipe:0:B|attkmsg=Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$\\lbrak;Show the radius\\rbrak;\\lpar;!rounds ~~aoe `{selected¦token_id}¦arc180¦feet¦0¦\\lbrak;\\lbrak;`{selected¦age¦max}*10\\rbrak;\\rbrak;¦\\lbrak;\\lbrak;`{selected¦age¦max}*20\\rbrak;\\rbrak;¦black\\rpar; then up to \\lbrak;\\lbrak;`{selected¦age¦max}\\rbrak;\\rbrak; opponents in the area take damage and Save vs. Petrification with the penalty shown below or be \\lbrak;Stunned\\rbrak;\\lpar;!rounds ~~target area¦`{selected¦token_id}¦\\amp#64;{target¦Select the stunned creature¦token_id}¦Stunned¦\\lbrak;\\amp#91;1+1d4\\amp#93;\\rbrak;¦-1¦Stunned by a dragon tail slap¦back-pain\\rpar; for 1d4+1 rounds., spattk:*Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*, spdef:Magic resistance @{selected|monstermagicresist}% and immune to acid from birth, ns:=11],[cl:PW,w:Copper-Dragon-Breath,pd:-1,sp:1],[cl:PW,age:1,w:MU-Spider-Climb,pd:-1,sp:1],[cl:PW,age:3,w:PR-Neutralize-Poison,pd:3,sp:1],[cl:PW,w:MU-Stone-Shape,age:4,pd:2,sp:1],[cl:PW,w:MU-Forget,age:6,pd:1,sp:1],[cl:PW,w:MU-Transmute-Rock-to-Mud,age:7,pd:1,sp:1],[cl:PW,w:MU-Move-Earth,age:8,pd:1,sp:1],[cl:PW,w:MU-Wall-of-Stone,age:12,pd:1,sp:1],[cl:PR,lv:1,w:],[cl:PR,lv:2,w:]{{}}%{Race-DB-Creatures|Red-Dragon}{{title=Copper}}{{Intelligence=Highly intelligent (13-14)}}{{AC=Varies with age, adult copper dragon is AC -3}}{{Move=9, FL 30(C), Jump 3}}{{Hit Dice=Varies with age, adult copper dragon is 15 HD}}{{THAC0=Varies with age, adult copper dragon is 7}}{{Section1=**Attacks:** Damage bonus varies with age, adult copper dragon is +6. 2 x Claws for 1d6 HP each, possibly with 1 or 2 kicks for 1d6 each, bite for 5d4, and tail slap for 2d6 and possible *stun* within an area varying with age. Several other attacks possible - see *Powers*}}{{Languages=*Copper Dragon* and *Good Dragon Common*, and can *speak with animals* freely from birth. 14% of hatchlings (+5% per age level) can perform universal communication with any intelligent creature}}{{Breath Weapon=A copper dragon\'s breath is either a cloud of *slow* gas 30\' long, 20\' wide, and 20\' high or a spurt of *acid* 70\' long and 5\' wide. Creatures caught in the gas must save vs. breath weapon or be *slowed* for three minutes per age level of the dragon. Creatures caught in the *acid* take damage, save vs. breath weapon for half. Damage from the acid breath weapon varies by age from 2d6+1 to 24d6+12. }}{{Spell Casting=Knows a number of random wizard and priest spells cast at a level from 10 to 18 varying with age. All spells are cast at a speed of 1 segment regardless of the spell}}{{Spell-like Powers=All copper dragons can use *spider climb* on stone surfaces only. *Young* dragons can *neutralize poison* x 3 per day, *Juveniles* can do *Stone Shape* x2 per day, *Adult* dragons gain *Forget* x1 a day, *Mature Adults* can *Transmute Rock to Mud* x1 per day, *Old* dragons can *Move Earth* x 1 per day, and *Great Wyrms* can cast *Wall of Stone* once per day}}{{desc8=**Copper Dragons:** Incorrigible pranksters, joke tellers, and riddlers. They are prideful and are not good losers, although they are reasonable good winner. They are particularly selfish, and greedy for their alignment, and have an almost neutral outlook where wealth is concerned.\nAt birth, a copper dragon\'s scales have a ruddy brown color with a copper tint. As the dragon gets older, the scales become finer and more coppery, assuming a soft, warm gloss by the time the dragon becomes a young adult. Beginning at the venerable stage, the dragons\' scales pick up a green tint.\nCopper dragons like dry, rocky uplands and mountains. They lair in narrow caves and often conceal the entrances using move earth and stone shape. Within the lair, they construct twisting mazes with open tops. These allow the dragon to fly or jump over intruders struggling through the maze.\nCopper dragons appreciate wit, and will usually leave good or neutral creatures alone if they can relate a joke, humorous story, or riddle the dragon has not heard before. They quickly get annoyed with creatures who don\'t laugh at their joked or do not accept the dragon\'s tricks and antics with good humor.\nBecause they often inhabit hills in sight of red dragons\' lairs conflicts between the two subspecies often occur. Copper dragons usually run for cover until they can equal the odds.}}{{desc9=**Combat:** Copper dragons like to taunt and annoy their opponents, hoping they will give up or become angry and act foolishly. Early in an encounter, a copper dragon will jump from one side of an opponent to another, landing on inaccessible or vertical stone surfaces. If there are no such places around a dragon\'s lair, the dragon will create them ahead of time using *stone shape, move earth,* and *wall of stone.*\nAn angry copper dragon will mire its opponents using *rock to mud,* and will force victims who escape the mud into it with kicks. Once opponents are trapped in the mud, the dragon will crush them with a *wall of stone* or snatch them and carry them aloft. When fighting airborne opponents, a dragon will draw its enemies into narrow, stony gorges where it can use its *spider climb* ability in an attempt to maneuver the enemy into colliding with the walls.}}'},
{name:'Death-Dog',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Death Dog}}{{subtitle=Creature}}Specs=[Death Dog,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Semi-(2 to 4)}}{{AC=7}}{{Alignment=Neutral Evil}}{{Move=12}}{{Hit Dice=2+1}}{{THAC0=19}}{{Attack=2 x Bite 1d10 (one per independent head)}}{{Languages=None}}{{Size=M, 6ft long}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Rot=Save vs. poison if bitten or contract a rotting disease which will kill them in 4-24 (4d6) days. Only a cure disease spell can save them.}}{{Knock Prone=On a critical hit (set to \\gt=19) knock opponent prone}}{{Section6=**Special Disadvantages**}}{{Section7=None}}RaceData=[w:Death Dog, align:NE, cattr:int=2:4|mov=12|ac=7|size=M|hd=2+1r4|thac0=19|ch:19|attk1=1d10:Bite:0:P|attk2=1d10:Bite:0:P|dmgmsg=Save vs. Poison or contract \\lbrak;rotting disease\\rbrak;\\lpar;!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who becomes diseased?¦token_id}¦Death Dog rot_You dont feel well..._\\vbar99¦0¦You really don\'t feel well...¦skull\\rpar; which kills in 4d6 days. Knock opponent prone if critical hit,spattk:Rotting disease inflicted by bite. Knock opponent prone on critical hit]{{Section9=**Description**}}{{desc=Death dogs are large two-headed hounds which are distinguished by their penetrating double bark. Death dogs hunt in large packs.\nEach head is independent, and a bite does 1-10 points of damage. Victims must save vs. poison or contract a rotting disease which will kill them in 4-24 (4d6) days. Only a *cure disease* spell can save them. A natural roll of 19 or 20 on their attack die means that a man-sized opponent is knocked prone and attacks at a -4 until able to rise to its feet again. There is an 85% chance that death dogs will attack humans on sight.}}'},
{name:'Djinni',type:'CreatureRace',ct:'100',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Djinni}}RaceData=[w:Djinni, align:CG, weaps:any, ac:none, cattr:int=8:14|mov=9|fly=24A|ac=4|hd=7+3r4|thac0=13|size=L|attk1=2d8:Punch:1:SPB,spdef:Airbourne creatures or attacks receive -1 penalty to attack and damage. Djinn get +4 bonus to saves vs gas attack and air-based spells,ns:10],[cl:PW,w:Djinni-Whirlwind,sp:100,pd:1],[cl:PW,w:Djinni-Create-Nutritious-Food,sp:10,pd:1],[cl:PW,w:Djinni-Create-Wine-or-Water,sp:10,pd:1],[cl:PW,w:Djinni-Create-Soft-Goods,sp:10,pd:1],[cl:PW,w:Djinni-Create-Wooden-Items,sp:10,pd:1],[cl:PW,w:Djinni-Create-Metal,sp:10,pd:1],[cl:PW,w:Djinni-Create-Illusion,sp:2,pd:1],[cl:PW,w:MU-Invisibility,sp:2,pd:1],[cl:PW,w:Gaseous-Form,sp:1,pd:1],[cl:PW,w:PR-Wind-Walk,sp:10,pd:1]{{subtitle=Genie}}Specs=[Djinni,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Average to Highly (8-14))}}{{AC=4}}{{Alignment=Chaotic Good}}{{Move=9 FL 24(A)}}{{Hit Dice=7+3 HD}}{{THAC0=13}}{{Attacks=1 x Punch for 2d8}}{{Size=L, 10.5ft tall}}{{Section2=**Powers**}}{{Whirlwind=Once per day, the genie can create a whirlwind, which the it can ride or even direct at will from a distance. A cone-shaped spiral, measuring up to 10 feet across at its base, 40 feet across at the top, and up to 70 feet in height (the djinni chooses the dimensions). Its maximum speed is 18, with maneuverability class A. It\'s base must touch water or a solid surface, or it will dissolve. It takes a full turn for it to form or dissolve. During that time, it has no effect. It lasts as long as the djinni concentrates on it.\nIf it strikes a non-aerial creature with fewer than 2 HD, save vs. breath weapon for each round of contact or be swept off its feet and killed. Hardier beings, as well as aerial or airborne creatures, take 2d6 points of damage per round of contact.\nA djinni can ride its whirlwind and even take along passengers, who (like the djinni) suffer no damage from the buffeting winds. The whirlwind can carry the genie and up to six man-sized or three genie-sized companions.}}{{Once per day=*create nutritious food* and *create wine or water* for 2d6 persons, *create soft goods* (up to 16cu.ft.), *create wooden items* (up to 9cu.ft.), *create metal* (up to 100lbs), *create illusion* as a 20th level wizard without concentarion, use *invisibility, gaseaous form* or *wind walk*}}{{Section4=**Special Advantages**}}{{Resistance=Airbourne creatures or attacks suffer a -1 penalty to attack \\amp damage rolls}}{{Saves=Djinn get a +4 bonus to saving throws vs. gas attacks and air-based spells}}{{Strong=Djinn are able to carry up to 600 pounds, on foot or flying, without tiring. They can carry double that for a short time: three turns if on foot, or one turn if flying. For each 100 pounds below the maximum, add one turn to the time a djinni may walk or fly before tiring. A fatigued djinni must rest for an hour before performing any additional strenuous activity.}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=The djinn (singular: djinni) are genies from the elemental plane of Air. Djinn are nearly impossible to capture by physical means; a djinni who is overmatched in combat usually takes to flight and uses its whirlwind to buffet those who follow. Genies are openly contemptuous of those life forms that need wings or artificial means to fly and use illusion and invisibility against such enemies. Thus, the capture and enslavement of djinn is better resolved by the DM on a case-by-case basis. It is worth noting, however, that a good master will typically encourage a djinni to additional effort and higher performance, while a demanding and cruel master encourages the opposite.}}'},
{name:'Dog-Blink',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Blink-Dog}{{}}RaceData=[w:Blink Dog]{{}}Specs=[Blink Dog,CreatureRace,0H,Blink Dog]{{}}'},
@@ -953,6 +985,16 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Dog-Wild',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Wild-Dog}{{}}RaceData=[w:Wild-Dog]{{}}Specs=[Wild Dog,CreatureRace,0H,Wild Dog]{{}}'},
{name:'Dracolisk',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Dracolisk}}{{subtitle=Creature}}Specs=[Dracolisk,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Low to Average (5 to 10)}}{{AC=3}}{{Alignment=Chaotic Evil}}{{Move=9, Fl 15(E)}}{{Hit Dice=7+3}}{{THAC0=13}}{{Attack=2 x Claw 1d6, 1 x Bite 3d4}}{{Languages=None known}}{{Size=H, 15-20ft long}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=**Gaze:** Its gaze turns those who meet eyes to stone. Attacking or surprised opponents automatically meet its gaze and must save vs. petrification each round they attack, unless from the rear. Can look "in general direction" to hit at -2 \\amp get 20% chance of meeting gaze. Or avert \\amp attack blindfolded for -4 to-hit}}{{Section 4=**Acid Breath Weapon:** Can spit a stream of acid 5 feet wide and up to 30 feet away. The acid causes 4d6 points of damage, half-damage if a successful saving throw vs. breath weapon is rolled. The dracolisk can spit up to three times per day.}}{{Section6=**Special Advantages**}}{{Section7=None}}{{Section8=**Special Disadvantages}}{{Reflections=If lit, and can see its own reflection, can petrify itself}}RaceData=[w:Dracolisk, align:N, cattr:int=1|mov=6|ac=4|size=M|hd=6+1r3|thac0=15|attk1=1d6:Claw:0:S|attk2=1d6:Claw:0:S|attk3=3d4:Bite:1:P|attkmsg=Gaze \\lbrak;Petrifies\\rbrak;\\lpar;!rounds ~~aoe `{selected¦token_id}¦cone¦feet¦0¦20¦20¦green¦true ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who is the unfortunate soul?¦token_id}¦Petrified¦99¦0¦Petrified by a Gaze Attack¦padlock\\rpar;. Those attacking without counter-measures must save every round. \\lbrak;Acid breath\\rbrak;\\lpar;!magic ~~cast-spell power¦`{selected¦token_id}\\rpar; 30ft range for 4d6HP damage 3/day,spattk:Petrification gaze attack \\amp acid breath weapon,ns:2],[cl:PW,w:Petrification-Gaze-Attack,sp:0,pd:-1],[cl:PW,w:Dracolisk-Breath,sp:0,pd:3]{{Section9=**Description**}}{{desc=The sages say that the dracolisk is the offspring of a rogue black dragon and a basilisk of the largest size. The result is a deep brown, dragon-like monster that moves with relative quickness on six legs. It can fly, but only for short periods - a turn or two at most.}}{{desc1=**Combat:** This horror can attack with its taloned forelegs and deliver vicious bites. In addition, it can spit a stream of acid 5 feet wide and up to 30 feet away. The acid causes 4d6 points of damage, half-damage if a successful saving throw vs. breath weapon is rolled. The dracolisk can spit up to three times per day.\nThe eyes of a dracolisk can petrify any opponent within 20 feet if the monster\'s gaze is met. Because its hooded eyes have nictating membranes, the monster is only 10% likely to be affected by its own gaze. Opponents in melee with a dracolisk and seeking to avoid its gaze fight with a -4 penalty to their to attack rolls.}}'},
{name:'Draft-Horse',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Draft Horse, cattr:mov=12|attk1=1d3:Bite:0:P]{{}}Specs=[Draft Horse,CreatureRace,0H,Horse]{{}}%{Race-DB-Creatures|Horse}{{name=(Draft)}}{{Move=12}}{{Attacks=Bite for 1d3}}{{desc8=**Draft Horse:** Draft horses are large animals bred to haul very heavy loads, and are usually trained to be part of a dray team. Muscular but slow, these ponderous animals haul freight over long distances without complaint, and are frequently used by traders.}}{{desc9=**Combat:** Draft horses fight only if cornered. They can only bite once per round. Unless specially trained, horses can be panicked by loud noises, strange smells, fire, or sudden movements 90% of the time. Horses trained and accustomed to such things (usually warhorses) panic only 10% of the time.}}'},
+ {name:'Dragon-Black',type:'DragonRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Black-Dragon}{{}}Specs=[Black-Dragon,DragonRace,2H,Black-Dragon]{{}}RaceData=[w:Black Dragon]{{}}'},
+ {name:'Dragon-Blue',type:'DragonRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Blue-Dragon}{{}}Specs=[Blue-Dragon,DragonRace,2H,Blue-Dragon]{{}}RaceData=[w:Blue Dragon]{{}}'},
+ {name:'Dragon-Brass',type:'DragonRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Brass-Dragon}{{}}Specs=[Brass-Dragon,DragonRace,2H,Brass-Dragon]{{}}RaceData=[w:Brass Dragon]{{}}'},
+ {name:'Dragon-Bronze',type:'DragonRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Bronze-Dragon}{{}}Specs=[Bronze-Dragon,DragonRace,2H,Bronze-Dragon]{{}}RaceData=[w:Bronze Dragon]{{}}'},
+ {name:'Dragon-Copper',type:'DragonRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Copper-Dragon}{{}}Specs=[Copper-Dragon,DragonRace,2H,Copper-Dragon]{{}}RaceData=[w:Copper Dragon]{{}}'},
+ {name:'Dragon-Gold',type:'DragonRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Gold-Dragon}{{}}Specs=[Gold-Dragon,DragonRace,2H,Gold-Dragon]{{}}RaceData=[w:Gold Dragon]{{}}'},
+ {name:'Dragon-Green',type:'DragonRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Green-Dragon}{{}}Specs=[Green-Dragon,DragonRace,2H,Green-Dragon]{{}}RaceData=[w:Green Dragon]{{}}'},
+ {name:'Dragon-Red',type:'DragonRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Red-Dragon}{{}}Specs=[Red-Dragon,DragonRace,2H,Red-Dragon]{{}}RaceData=[w:Red Dragon]{{}}'},
+ {name:'Dragon-Silver',type:'DragonRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Silver-Dragon}{{}}Specs=[Silver-Dragon,DragonRace,2H,Silver-Dragon]{{}}RaceData=[w:Silver Dragon]{{}}'},
+ {name:'Dragon-White',type:'DragonRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|White-Dragon}{{}}Specs=[White-Dragon,DragonRace,2H,White-Dragon]{{}}RaceData=[w:White Dragon]{{}}'},
{name:'Dryad',type:'CreatureRace',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Dryad}}RaceData=[w:Dryad, align:N, cattr:int=13:14|mov=12|ac=9|size=M|hd=2r3|thac0=19|attk1=1d4:Dagger vs SM:2:P|attk2=1d3:Dagger vs. L:2:P|attkmsg=Remember *Charm Person, Dimension Door* and *Speak with Plants* powers,spattk:*Charm Person* power,spdef:*Dimension Door* back to home oak tree,ns:3],[cl:PW,w:Dryad-Charm-Person,sp:1,pd:3],[cl:PW,w:Dimension-Door,sp:1,pd:-1],[cl:PW,w:Speak-with-Plants,sp:0,pd:-1]{{subtitle=Creature}}{{Section=**Attributes**}}{{Intelligence=High (13 to 14)}}{{AC=9}}{{Alignment=Neutral}}{{Move=12}}{{Hit Dice=2}}{{THAC0=19}}{{Attack=Generally does not engage in melee, but has a dagger as a tool}}{{Languages=*Dryad, elvish, pixie,* and *sprite*. Dryads can also speak with plants.}}{{Size=M, 5ft tall}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=*Charm Person* 3 times per day, *Dimension Door* at will (to home oak only), and *Speak with Plants,* at will.}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages**}}{{Section7=**Attached to home oak:**Dryads are attached to a single, very large oak tree in their lifetimes and cannot, for any reason, go more than 360 yards from that tree. If a dryad does wander farther away, she becomes weak and dies within 6d6 hours unless returned to her home. The oak trees of dryads do not radiate magic, but someone finding a dryad\'s home has great power over her. A dryad suffers damage for any damage inflicted upon her home tree. Any attack on a dryad\'s tree will, of course, bring on a frenzied defense by the dryad.}}Specs=[Dryad,CreatureRace,0H,Creature]{{Section9=**Description**}}{{desc8=Dryads are beautiful, intelligent tree sprites. They are as elusive as they are alluring, however, and dryads are rarely seen unless taken by surprise - or they wish to be spotted.\nThe dryad\'s exquisite features, delicate and finely chiseled, are much like an elf maiden\'s. Dryads have high cheek bones and amber, violet, or dark green eyes. A dryad\'s complexion and hair color changes with the seasons, presenting the sprite with natural camouflage. During the fall, a dryad\'s hair turns golden or red, and her skin subtly darkens from its usual light tan to more closely match her hair color.\nThis enables her to blend with the falling leaves of autumn. In winter, both the dryad\'s hair and skin are white, like the snows that cover the oak groves. When encountered in a forest during fall or winter, a dryad is often mistaken for an attractive maid, probably of elvish descent. No one would mistake a dryad for an elf maid during the spring and summer, however. At these times of year, a dryad\'s skin is lightly tanned and her hair is green like the oak leaves around her.\nDryads often appear clothed in a loose, simple garment. The clothing they wear is the color of the oak grove in the season they appear.}}{{desc9=**Combat:** Dryads are shy, nonviolent creatures. They rarely carry weapons, but they sometimes carry knives as tools. Though a dryad can use this as a weapon in a fight, she will not resort to using a knife unless seriously threatened.\nDryads have the ability to throw a powerful charm person spell three times a day (but only once per round). This spell is so powerful that targets of the spell suffer a -3 penalty to their saving throws. A Dryad always uses this spell if seriously threatened, attempting to gain control of the attacker who could help her most against his comrades. Dryads will only attempt to charm elves as a last resort because of their natural resistance to this type of spell.\nThe dryad\'s use of her ability to charm is not limited to combat situations, however. Whenever a dryad encounters a male with a Charisma of 16 or more, she usually tries to charm him. Charismatic victims of a dryad\'s attentions are taken to the tree sprite\'s home, where the men serve as amorous slaves to their beautiful captors. There is a 50% chance that a person charmed and taken away by a dryad will never\nreturn. If he does escape from the dryad\'s charms, it will be after 1d4 years of captivity.\nThis tree sprite also has two other powers that are very useful in defense. Unless surprised, a dryad has the ability to literally step through a tree and then dimension door to the oak tree she is part of. She can also speak with plants (as the 4th-level priest spell). This enables the dryad to gather information about parties traveling near her tree, and even to use vegetation to hinder potential attackers.}}'},
{name:'Eagle-Wild',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Wild-Eagle}{{}}RaceData=[w:Wild-Eagle]{{}}Specs=[Wild Eagle,CreatureRace,0H,Wild Eagle]{{}}'},
{name:'Earth-Elemental',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Earth Elemental}}{{subtitle=Creature}}Specs=[Elemental,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Low (5-7)}}{{AC=2}}{{Alignment=Neutral}}{{Move=6 (not through water}}{{Hit Dice=8, 12, or 16}}{{THAC0=13, 9, or 5}}{{Attack=1 x 4d8}}{{Languages=They rarely speak, but their voices can be heard in the silence of deep tunnels, the rumblings of earthquakes, and the grinding of stone on stone}}{{Size=L to H, [7+1d8](!\\amp#13;\\amp#47;r 7+1d8 feet height)feet,}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Special Defense=Only hit by +2 or better weapons}}RaceData=[w:Earth Elemental, cattr:int=5:7|ac=2|mov=6|size=L|hd=8|thac0=13|attk1=4d8:Earth Ram:0:B|attk2=\\lbrak;\\lbrak;{1d8-2\\amp#44;1d8-2\\amp#44;1d8-2\\amp#44;1d8-2\\amp#44;{1}\\amp#44;{1}\\amp#44;{1}\\amp#44;{1}\\rbrc;kh4\\rbrak;\\rbrak;:vs. Air \\amp Water borne:0:B,spdef:+2 weapon or better to hit]{{Section9=**Description**}}{{desc=Earth elementals can be conjured in any area of earth or stone. This type of common elemental appears on the Prime Material plane as a very large humanoid made of whatever types of dirt, stones, precious metals, and gems it was conjured from. It has a cold, expressionless face, and its two eyes sparkle like brilliant, multifaceted gems.\nThough earth elementals travel very slowly, they are relentless in the fulfillment of their appointed tasks. An earth elemental can travel through solid ground or stone with no penalty to movement or dexterity. However, these elementals cannot travel through water: they must either go around the body of water in their path or go under it, traveling in the ground. Earth elementals prefer the latter as it keeps them moving, more or less, in a straight line toward their goal.}}{{desc1=Earth elementals will always try to fight on the ground and will only rarely be tricked into giving up that advantage. Because of their close alliance to the rock and earth, these elementals do 4-32 points of damage (4d8) whenever they strike a creature that rests on the ground.\nAgainst constructions with foundations in earth or stone, earth elementals do great damage, making them extremely useful for armies sieging a fortification. For example, a reinforced door, which might require a few rounds to shatter using conventional methods, can be smashed with ease by an earth elemental. They can even level a small cottage in a few rounds.\nAn earth elemental\'s effectiveness against creatures in the air or water is limited; the damage done by the elemental\'s fists on airborne or waterborne targets is lessened by 2 points per die (to a minimum of 1 point of damage per die).}}'},
@@ -964,7 +1006,17 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Elemental-Water',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Water-Elemental}{{}}Specs=[Water Elemental,CreatureRace,0H,Water-Elemental]{{}}RaceData=[w:Water Elemental]{{}}'},
{name:'Elephant',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Elephant}}{{subtitle=Creature}}Specs=[Elephant,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Semi-(2-4)}}{{AC=6}}{{Alignment=Neutral}}{{Move=15}}{{Hit Dice=11}}{{THAC0=9}}{{Attack=2 x Tusks (2d8 each), Trunk constriction (2d6), 2 x Trample (2d6 each), up to 6 opponents, max 2 attacks per opponent}}{{Languages=Elephant}}{{Size=L, 11ft tall}}{{Life Expectancy=Long}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages**}}{{Large Creatures=(larger than Ogre-sized) are not subject to trunk attacks}}{{Preserves Trunk=An elephant will never attempt to grasp anything that might harm its trunk}}{{Fire=Elephants greatly fear fire}}RaceData=[w:Elephant, align:N, cattr:int=2:4|mov=15|ac=6|size=L|hd=11r2|thac0=9|attk1=2d8:Tusks x 2:0:P|attk2=2d6:Trunk:0:B|attk3=2d6:Trample x 2:0:B]{{Section9=**Description**}}{{desc=Elephants have thick, baggy hides, covered with sparse and very coarse tufts of gray hair. The elephant\'s most renowned feature is its trunk, which it uses as a grasping limb.}}{{desc1=**Combat:** An elephant can make up to five attacks at one time in a battle. It can do stabbing damage of 2-16 points (2d8) with each of its two tusks; constricting damage of 2-12 points with its trunk; and 2-12 points of trampling damage with each of its front feet. No single opponent can be subject to more than two of these attacks at any one time. However, the elephant can battle up to six man-sized opponents at one time.\nCreatures larger than ogre-sized are not subject to the elephant\'s trunk attack. Also, an elephant will never attempt to grasp anything that might harm its trunk -- like an object covered with sharp spikes. Elephants greatly fear fire.}}'},
{name:'Elephant-African',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Elephant}{{}}RaceData=[w:African Elephant]{{}}Specs=[African Elephant,CreatureRace,0H,Elephant]{{}}'},
+ {name:'Empyrean-Priest',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:RPGMdeault}{{}}Specs=[Empyrean,CreatureRace,2H,Titan-Priest]{{}}RaceData=[w:Empyrean Priest]{{}}%{Race-DB-Creatures|Titan-Priest}{{Title=Empyrean}}{{name=Priest}}'},
+ {name:'Empyrean-Wizard',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:RPGMdeault}{{}}Specs=[Empyrean,CreatureRace,2H,Titan-Wizard]{{}}RaceData=[w:Empyrean Wizard]{{}}%{Race-DB-Creatures|Titan-Wizard}{{Title=Empyrean}}{{name=Wizard}}'},
+ {name:'Ettin',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Ettin}}RaceData=[w:Ettin, align:CE, ac:none, cattr:int=5:7|mov=12|ac=3|hd=10r2|thac0=11|size=H|attk1=1d10:Left Fist:0:B|attk2=2d6:Right Fist:0:B, spattk:Infravision to 90ft, spdef:Only surprised on a 1 on d10, ns:1],[cl:WP,prime:Ettin-Club-Right,offhand:Ettin-Club-Left]{{subtitle=Creature}}Specs=[Ettin,CreatureRace,2H,Creature]{{Section=**Attributes**}}{{Intelligence=Low (5-7)}}{{AC=3 is natural AC. Do not wear armour or magical devices}}{{Alignment=Chaotic Evil}}{{Move=12}}{{Hit Dice=10HD}}{{THAC0=11}}{{Section1=**Attacks:** In combat, an ettin has two attacks. Because each of its two heads controls an arm, an ettin does not suffer an attack roll penalty for attacking with both arms. An ettin always attacks with two large clubs, often covered with spikes. Using these weapons, the ettin causes 2d8 points of damage with its left arm, and 3d6 points of damage with its right. If the ettin is disarmed or unable to use a weapon, it attacks empty-handed, inflicting 1d10 points of damage with its left fist and 2d6 points with its right.}}{{Languages=Ettins do not have a true language of their own. Instead, they speak a mish-mash of *orc, goblin, giant dialects*, and the alignment tongue of chaotic evil creatures. Any adventurer who speaks *orcish* can understand 50% of what an ettin says.}}{{Size=H, 24ft tall}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Surprise=Having two heads is definitely an advantage for the ettins, as one is always alert, watching for danger and potential food. This means that an ettin is surprised only on the roll of a 1 on 1d10.}}{{Infravision=Up to 90 feet, which enables it to hunt and fight effectively in the dark}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=Ettins, or two-headed giants, as they are often called, are vicious and unpredictable hunters that stalk by night and eat any meat they can catch.\nAn ettin at first appears to be a stone or hill giant with two heads. On closer inspection, however, the creature\'s vast differences from the relatively civilized giant races become readily apparent. An ettin has pink to brownish skin, though it appears to be covered in a dark brown hide. This is because an ettin never bathes if it can help it, and is therefore usually encrusted with a thick layer of dirt and grime. Its skin is thick, giving the ettin its low Armor Class. An ettin\'s hair is long, stringy, and unkempt; its teeth are large, yellowing, and often rotten. The ettin\'s facial features strongly resemble those of an orc -- large watery eyes, turned-up piggish snout, and large mouth.\nAn ettin\'s right head is always the dominant one, and the right arm and leg will likely appear slightly more muscular and well-developed than the left. An ettin wears only rough, untreated skins, which are dirty and unwashed. Obviously, ettins smell very bad, due to their complete lack of grooming habits -- good or bad.\n**Habitat:** Ettins like to establish their lairs in remote, rocky areas. They dwell in dark, underground caves that stink of decaying food and offal. Ettins are generally solitary, and mated pairs only stay together for a few months after a young ettin is born to them. Young ettins mature very quickly, and within eight to ten months after they are born, they are self-sufficient enough to go off on their own.\nOn rare occasions, however, a particularly strong ettin may gather a small group of 1d4 ettins together. This small band of ettins stays together only as long as the leader remains alive and undefeated in battle. Any major defeat shatters the leader\'s hold over the band, and they each go their separate ways. \nEttins collect treasure only because it can buy them the services of goblins or orcs. These creatures sometimes serve ettins by building traps around their lairs, or helping to fight off a powerful opponent. Ettins have also been known to occasionally keep 1-2 cave bears in the area of their lairs.\nThe sloppy caves of ettins are a haven for parasites and vermin, and it isn\'t unusual for the ettins themselves to be infected with various parasitic diseases. Adventurers rummaging through ettin lairs for valuables will find the task disgusting, if not dangerous.}}{{desc9=**Combat:** Though ettins have a low intelligence, they are cunning fighters. They prefer to ambush their victims rather than charge into a straight fight, but once the battle has started, ettins usually fight furiously until all enemies are dead, or the battle turns against them. Ettins do not retreat easily, only doing so if victory is impossible.}}'},
{name:'Fire-Elemental',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Fire Elemental}}{{subtitle=Creature}}Specs=[Elemental,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Low (5-7)}}{{AC=2}}{{Alignment=Neutral}}{{Move=12}}{{Hit Dice=8, 12, or 16}}{{THAC0=13, 9, or 5}}{{Attack=1 x 3d8 (touched objects save vs. magic fire at -2 penalty. Fire using creatures take 1 less damage per dice)}}{{Languages=They rarely speak, but their voices can be heard in the crackle and hiss of a large fire}}{{Size=L to H, [7+1d8](!\\amp#13;\\amp#47;r 7+1d8 feet height)feet,}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Special Defense=Only hit by +2 or better weapons}}RaceData=[w:Fire Elemental, cattr:int=5:7|ac=2|mov=12|size=L|hd=8|thac0=13|attk1=3d8:Flame Lash:0:B|attk2=\\lbrak;\\lbrak;{1d8-1\\amp#44;1d8-1\\amp#44;1d8-1\\amp#44;{1}\\amp#44;{1}\\amp#44;{1}\\rbrc;kh3\\rbrak;\\rbrak;:vs. Fire-using:0:B,spdef:+2 weapon or better to hit]{{Section9=**Description**}}{{desc=Fire elementals can be conjured in any area containing a large open flame. To provide a fire elemental with an adequate shell of Prime Material flame, a fire built to house an elemental should have a diameter of at least six feet and reach a minimum of four feet into the air. On the Prime Material Plane, a fire elemental appears as a tall sheet of flame.\nThe fire elemental will always appear to have two armlike appendages, one on each side of its body. These arms seem to flicker back into the creature\'s flaming body, only to spring out from its sides seconds later. The only facial features of a fire elemental are two large glowing patches of brilliant blue fire, which seem to function as eyes for the elemental}}{{desc1=Because they resent being conjured to this plane, fire elementals are fierce opponents who will attack their enemies directly and savagely, taking what joy they can in burning the weak creatures and objects of the Prime Material to ashes. In combat, a fire elemental lashes out with one of its ever-moving limbs, doing 3-24 points of damage. Any flammable object struck by the fire elemental must save versus magical fire at a -2 or immediately begin to burn.\nFire elementals do have some limitations on their actions in the Prime Material plane. They are unable to cross water or non-flammable liquids. Often, a quick dive into a nearby lake or stream is the only thing that can save a powerful party from certain death from a fire elemental. Also, because their natural abilities give them some built-in resistance to flame-based attacks, creatures with innate fire-using abilities, like red dragons, take less damage from a fire elemental\'s attack. The elemental subtracts 1 point from each die of damage it does to these creature (to a minimum of 1 point of damage per die)}}'},
+ {name:'Fire-Giant-AC-1',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=Fire }}{{title=Giant}}{{name= AC-1}}RaceData=[w:Fire Giant AC-1, align:LE, ac:none, cattr:int=5:10|mov=12|ac=-1|hd=15+1d4+1r1|thac0=5|tohit=+4|dmg=+10|size=H|attk1=1d8:Fist:0:B|attkmsg=Remember immune to non-magical fire \\amp red dragon breath. Resistant to magical fire which does -1HP per die damage, spdef:Immune to non-magical fire and red dragon breath. Resistant to magical fire which does -1HP per die damage. Can catch rocks hurled at them 50% of the time, ns:1],[cl:WP,both:Fire-Giant-Sword,items:FG-Rock:1d4+1]{{subtitle=Creature}}Specs=[Fire-Giant-AC-1,CreatureRace,2H,Creature]{{Section=**Attributes**}}{{Intelligence=Low to Average (5-10)}}{{AC=-1 from banded mail and round metal helmets. Natural AC is 5}}{{Alignment=Lawful Evil, often living in well organised military groups}}{{Move=12}}{{Hit Dice=15HD +1d4+1}}{{THAC0=5}}{{Section1=**Attacks:** +4 on ToHit rolls from strength. 1 x Fist for 1d8 HP damage, or using a Fire Giant Two-Handed Sword for 2d10 plus strength bonus of +10. Throw rocks 3 to 200 yards doing 2d10 damage}}{{Languages=*Fire Giant* and *Giant Common*}}{{Size=H, 18ft tall, but stocky like a huge dwarf}}{{Life Expectancy=About 350 years}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Fire Immunity=Immune to nonmagical fire and heat, as well as red dragon breath}}{{Magical Fire Resistance=Resistant to all types of magical fire; such attacks inflict -1 hit point per die of damage}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc7=**Fire giants:** are brutal, ruthless, and militaristic.\nThey are tall, but squat, resembling huge dwarves. An adult male is 18 feet tall, has a 12 foot chest, and weighs about 7,500 pounds. Fire giants have coal black skin, flaming red or bright orange hair, and prognathous jaws that reveal dirty ivory or yellow teeth.\nThey carry their belongings in huge sacks. A typical fire giant\'s sack contains 2-5 (1d4+1) throwing rocks, the giant\'s wealth, a tinderbox, and 3-12 (3d4) common items. Everything they own is battered, filthy, and smelly, making it difficult to identify valuable items.}}{{desc8=A fire giant\'s natural Armor Class is 5. Warriors usually wear banded mail and round metal helmets (AC -1).}}{{desc9=**Combat:** They usually fight in disciplined groups, throwing rocks until they run out of ammunition or the opponent closes. Fire giants often wait in ambush at lava pools or hot springs, hurling heated rocks at victims for an extra 1-6 points of damage.\nWarriors favor huge two-handed swords. A fire giant\'s oversized weapons do double normal (man-sized) damage to all opponents, plus the giant\'s strength bonus. Thus, a fire giant two-handed sword does 2-20 (2d10) +10 points of damage.\nAdult fire giants can hurl rocks for 2-20 (2d10) points of damage. Their minimum range is 3 yards while their maximum is 200 yards. They can catch similar large missiles 50% of the time.}}'},
+ {name:'Fire-Giant-AC5',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Fire Giant AC5,cattr:ac=5|mov=15]{{}}Specs=[Fire-Giant-AC5,CreatureRace,2H,Fire-Giant-AC-1]{{}}%{Race-DB-Creatures|Fire-Giant-AC-1}{{name= AC5}}{{AC=Not wearing any armour, so natural AC of 5}}{{desc8=Fire giants\' natural Armor Class is 5, when not wearing any armour. This is rare, as most wear banded mail and round metal helmets (AC -1)}}'},
+ {name:'Fire-Giant-Juvenile-1',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Fire Giant Juvenile 1,cattr:ac=5|hd:14+1d4+1|tohit=+3|dmg=+9,ns:=1],[cl:WP,both:Fire-Giant-Sword]{{}}Specs=[Fire-Giant-Juvenile-1,CreatureRace,2H,Fire-Giant-AC-1]{{}}%{Race-DB-Creatures|Fire-Giant-AC-1}{{name= Juvenile-1}}{{AC=Not wearing any armour, so natural AC of 5}}{{desc8=Fire giants\' natural Armor Class is 5, when not wearing any armour. As a juvenile, they are still growing so can\'t have armour fitted.)}}'},
+ {name:'Fire-Giant-Juvenile-2',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Fire Giant Juvenile 2,cattr:hd:13+1d4+1|tohit=+2|dmg=+8]{{}}Specs=[Fire-Giant-Juvenile-2,CreatureRace,2H,Fire-Giant-Juvenile-1]{{}}%{Race-DB-Creatures|Fire-Giant-Juvenile-1}{{name= Juvenile-2}}'},
+ {name:'Fire-Giant-Juvenile-3',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Fire Giant Juvenile 3,cattr:hd:12+1d4+1|tohit=+1|dmg=+7]{{}}Specs=[Fire-Giant-Juvenile-3,CreatureRace,2H,Fire-Giant-Juvenile-1]{{}}%{Race-DB-Creatures|Fire-Giant-Juvenile-1}{{name= Juvenile-3}}'},
+ {name:'Fire-Giant-Shaman-L7',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Fire Giant Shaman L7,cattr:cl=pr:fire-giant-shaman|lv=7]{{}}Specs=[Fire-Giant-Shaman-L7,CreatureRace,2H,Fire-Giant-AC-1]{{}}%{Race-DB-Creatures|Fire-Giant-AC-1}{{name= Shaman}}{{Section3=**Shaman:** This Fire Giant is a Shaman that can cast spells of a number of priest spheres of magic: *Elemental, Healing, Charm, Protection, Divination,* or *Combat*}}{{desc6=**Fire Giant Shaman:** There is a 20% chance that any band of fire giants will have a shaman (80%). If the group is lead by a king, there is an 80% chance of a spell caster. Fire giant shamans are priests of up to 7th level. A shaman can cast normal or reversed spells from the Elemental, Healing, Charm, Protection, Divination, or Combat spheres.}}'},
+ {name:'Fire-Giant-Witch-Doctor',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Fire Giant Witch Doctor,sps:any,cattr:cl=pr:fire-giant-shaman/mu:fire-giant-witch-doctor|lv=7/3,ns:1],[cl:MU,lv:1,w:random|random|random|Alarm|Charm-Person|Dancing-Lights|Grease|Hold-Portal|Magic Missile|Phantasmal-Force|Sleep|Spook],[cl:MU,lv:2,w:random|random|random|Flaming-Sphere|Glitterdust|Invisibility|Melfs-Acid-Arrow|Mirror-Image|Misdirection|Pyrotechnics|Ray-of-Enfeablement|Stinking-Cloud|Web]{{}}Specs=[Fire-Giant-Witch-Doctor,CreatureRace,2H,Fire-Giant-AC-1]{{}}%{Race-DB-Creatures|Fire-Giant-AC-1}{{name= Witch Doctor}}{{Section3=**Witch Doctor:** This Fire Giant is a Witch Doctor that can cast spells of a number of wizard spells, and priest spheres of magic: *Elemental, Healing, Charm, Protection, Divination,* or *Combat*}}{{desc6=**Fire Giant Witch Doctor:** There is a 20% chance that any band of fire giants will have a shaman (80%) or witch doctor (20%). If the group is lead by a king, there is an 80% chance of a spell caster. Fire giant witch doctors are priest/wizards of up to 7th/3rd level; they prefer spells that can detect or thwart intruders.}}'},
{name:'Fire-Mephit',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Imp - Fire Mephit}}{{subtitle=Creature}}RaceData=[w:Fire Mephit, align:LE|NE|CE, ac:none, weaps:none, cattr:int=8:10|mov=12|fly=24(B)|ac=5|size=M|hd=3+1|thac0=17|attk1=1d3:Claw1:0:S|attk2=1d3:Claw2:0:S|dmgmsg=A successful claw hit also does an additional \\lbrak;\\lbrak;1\\rbrak;\\rbrak;HP of heat damage, spattk:Claws do additional 1HP heat damage. 2 breath weapons: Flame Jet \\amp Flame Fan. Can cast as Power *Heat Metal* and *Magic Missile x 2* once a day, spdef:*Gate* in as Power another mephit 1/hour,ns:4],[cl:PW,w:Fire Mephit Flame Breath,sp:0,pd:3],[cl:PW,w:heat-metal,sp:5,pd:1],[cl:PW,w:magic-missile,sp:1,pd:1],[cl:PW,w:gate-mephit,sp:0,pd:24]{{Section=**Attributes**}}{{Intelligence=Average (8:10)}}{{AC=5}}{{Alignment=Any Evil}}{{Move=12, FL24(B)}}{{Hit Dice=3+2}}{{THAC0=17}}{{Attacks=2 x Claw for 1d3 and 1HP additional heat damage}}{{Languages=*Mephit*}}{{Size=M, 5ft tall}}{{Life Expectancy=Short!}}{{Section1=**Powers**}}{{Section2=Breath weapons: *Flame Jet* \\amp *Fan of Flame*. Spells as Powers: *Heat Metal*, *Magic Missile x 2* each 1/day. *Gate Mephit* 1/hour}}{{Section3=**Special Advantages**}}{{Section4=**Touching Skin:** Touching a Fire Mephit causes 1HP heat damage (no save)}}{{Section7=**Special Disadvantages**}}{{Section8=None}}Specs=[Imp-Fire-Mephit,CreatureRace,0H,Creature]{{Section9=**Description**}}{{desc=**Fire Mephit:** The most mischievous of all mephits, these fiends play terrible pranks on other mephits (such as pushing lava mephits into water and watching them harden) and on their victims.\nFire Mephit breath weapons have two forms. The first is a flame jet 15 feet long and 1-foot wide. This jet automatically hits one target, of the mephit\'s choosing, for ld8+1 points of damage (half if saving throw is successful). The second form is a fan of flame covering a 120 arc directly in front of the mephit to a distance of 5 feet. Any creature in the arc suffers 4 points of damage, no saving throw allowed.}}{{desc8=Mephits are nasty little messengers created by powerful lower planes creatures. They are evil and malicious by nature and appear on the Prime Material Plane only to perform evil deeds. Six types of mephits are known: fire, ice, lava, mist, smoke, and steam. Each is created from the substance for which it is named.\nMephits appear as thin, 5-foot humanoids with wings. Their faces have exaggerated features, including hooked noses, pointed ears, wide eyes, and protruding chins. Their skin continually oozes the stuff from which they were made. Mephits speak a common mephit tongue.}}{{desc9=**Combat:** In battle, mephits attack with either clawed hands or breath weapons. Damage is variable depending on the type of mephit encountered. All mephits have the ability to gate in other mephits; the type gated in and percentage chance for success varies with the mephit initiating the gating.}}'},
{name:'Flind',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Flind}}RaceData=[w:Flind, align:LE, weaps:club|flindbar, ac:leather|padded|studded|ring-mail|brigandine|scale-mail|hide|chain-mail, cattr:int=8:10|mov=12|ac=10|size=M|hd=2+3r3|thac0=17|tohit=+1|attk1=1d6:Club:4:B, spattk:Favour the *Flindbar*: equip this as a weapon from the weapons database. A Flindbar can disarm an opponent if they fail a *save vs. wand*],[cl:WP,prime:Flindbar,offhand:Dagger]{{subtitle=Creature}}{{Section=**Attributes**}}{{Intelligence=Average (8 to 10)}}{{AC=10, up to AC5 with armour}}{{Alignment=Lawful Evil}}{{Move=12}}{{Hit Dice=2+3}}{{THAC0=17}}{{Attack=Club for 1d6 (75%), or *Flindbar* for 2 attacks/round for 1d4 (25%) - both can be equipped from the weapons database}}{{Languages=*Flind, Gnoll,* and many also speak *flind, troll, orc,* or *hobgoblin*}}{{Size=M, 6-7ft tall}}{{Life Expectancy=On average 35 years}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Strength=Due to their great strength, Flinds gain +1 on their attack rolls}}{{Section6=**Special Disadvantages**}}{{Section7=None}}Specs=[Flind,CreatureRace,0H,Creature]{{Section9=**Description**}}{{desc8=The flind is similar to a gnoll in body style, though it is a little shorter, and broader. They are more muscular than their cousins. Short, dirty, brown and red fur covers their body. Their foreheads do not slope back as far, and their ears are rounded, but still animal like. }}{{desc9=**Combat:** Flinds use clubs (75%) which inflict 1-6 points of damage and flindbars (25%) which do 1-4 points of damage. A flindbar is a pair of chain-linked iron bars which are spun at great speed. A flind with a flindbar can strike twice per round. Each successful hit requires the victim to save vs. wands or have his weapon entangled in the chain and torn from his grasp by the flindbar. Due to their great strength, flinds get a +1 on their attack rolls.\nFlinds are regarded with reverence and awe by gnolls. Flind leaders are 3+3 Hit Dice, at least 13 intelligence and 18 charisma to gnolls (15 to flinds), and always use flindbars.}}'},
{name:'Flind-Leader',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Flind}}RaceData=[w:Flind Leader, cattr:int=13:14|ac=5|hd=3+3r3|thac0=17|attk1=1d4:Flindbar:3:B]{{subtitle=Creature}}%{Race-DB-Creatures|Flind}{{Intelligence=High (at least 13)}}{{AC=5 (preset - can be improved with magical armour if equipped)}}{{Hit Dice=3+3}}{{THAC0=17}}{{Attack=Always use *Flindbar* for 2 attacks/round for 1d4 - equip from the weapons database}}Specs=[Flind Leader,CreatureRace,0H,Flind]{{desc=**Flind Leaders:** Flind leaders are 3+3 Hit Dice, at least 13 intelligence and 18 charisma to gnolls (15 to flinds), and always use flindbars.}}'},
@@ -972,6 +1024,16 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Fremlin',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{subtitle=Creature}}RaceData=[w:Fremlin, align:CN, cattr:int=8:10|fly=12 (B)|ac=6|size=T|hd=3+6r3|mr=0|mw=+1|attkmsg=Only hit by magical weapons. No magic resistance, spdef:Only hit by magical weapons. No magic resistance]{{}}%{Race-DB-Creatures|Gremlin}{{title=Fremlin}}{{Intelligence=Average (8 to 10)}}{{AC=6}}{{Alignment=Chaotic Neutral}}{{Move=6, Fl 12(B)}}{{Size=T, 1ft tall}}{{Hit Dice=3+6}}{{Magic Resistance=No magic resistance}}Specs=[Fremlin,CreatureRace,0H,Gremlin]{{desc8=Often mistaken for imps, fremlins are a type of gremlin, small winged goblinoids. There are many varieties of gremlins, and most are chaotic and mischievous. These friendly gremlins are quite harmless. They tend to be plump, whiny, and lazy, but otherwise look like small, slate colored gremlins. Their ears are very large and pointed, giving them a 65% chance to hear noise. A pair of bat-like wings enables them to fly or glide. Fremlins never wear clothing or ornamentation.}}{{desc9=**Combat:** Occasionally, fremlins become tolerable companions, if they take a liking to someone and are well fed and entertained. Even in this case, they never assist in combat and may in fact hinder it by giving away the location of hiding characters or making other such blunders.}}'},
{name:'Freshwater-Troll',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Freshwater Troll (Scrag)}}{{subtitle=Creature}}Specs=[Freshwater Troll,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Low (5-7)}}{{AC=3}}{{Alignment=Chaotic Evil}}{{Move=3, Sw12}}{{Hit Dice=5+5}}{{THAC0=15}}{{Attacks=2 x Claw 1d4+1, 1 x Bite 3d4}}{{Languages=Trolls have no language of their own, using "trollspeak", a guttural mishmash of common, giant, goblin, orc, and hobgoblin. Trollspeak is highly transient and trolls from one area are only 25% likely to be able to communicate with trolls from another.}}{{Size=L 8ft tall}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Regeneration=Only in fresh water, 3 rounds after 1st blood, regenerates at 3HP per round}}{{Section4=**Special Advantages**}}{{Infravision=90 foot}}{{Priest Spells=}}RaceData=[w:Freshwater Troll, align:CE, cattr:int=5:7|ac=3|mov=3|swim=12|hd=5+5r3|regen=3|thac0=15|size=L|dmg=+8|attk1=1+1d4:Claw:0:S|attk2=1+1d4:Claw:0:S|attk3=3d4:Bite:1:P|attkmsg=Remember to start \\lbrak;Regenerating\\rbrak;\\lpar;!rounds ~~target caster¦`{selected¦token_id}¦regeneration¦99¦0¦Regenerating at `{selected¦conregen} per round¦strong\\rpar; 3 rounds after take damage ***and*** in fresh water, spdef:Regenerate at 3HP per round *if* in fresh water,ns:1],[cl:PW,w:regenerate,sp:0,pd:-1]{{Section9=**Description**}}{{desc8=These gilled trolls, also called scrags or river trolls, are the most loathsome of all the trolls. River trolls, as their name implies, travel the waterways in search of victims. Their arms are thin and frail but their mouths are wide and lined with dozens of needle-sharp fangs. Their color ranges from blue-green to olive. Scrags have all of the abilities of normal trolls, but they only regenerate when immersed in fresh water. Scrags can survive out of water for one hour and often come ashore in search of prey. River trolls devour anything they catch, but prefer humanoids and have a fondness for dwarves.\nScrags are devious hunters and often carry a few baubles with them. They lay gems near the water\'s edge and wait for someone to spot them and reach down. Other traps include burying themselves in the sand, in shallow water, and waiting to be stepped on or tangling the rudders of small boats. River trolls occasionally nest beneath bridges or near ferry boats, demanding a toll in exchange for passage. The toll varies, but averages the equivalent of one cow per week, per troll. Livestock and children frequently disappear when river trolls are near.}}'},
{name:'Freshwater-Troll-Shaman',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{subtitle=Creature}}RaceData=[w:Freshwater Troll Shaman, cattr:int=7|cl=pr:scrag-shaman|lv=7]{{Intelligence=Low (7)}}%{Race-DB-Creatures|Freshwater-Troll}{{AC=3}}Specs=[Freshwater-Troll Shaman,CreatureRace,0H,Freshwater-Troll]{{name=Scrag Shaman Chieftain}}{{Priest Spells=Cast at 7th level: Charm, Divination, Elemental (Water), Sun (Darkness only), and Weather.}}{{desc=Trolls live in small packs of 3 to 12 trolls led by a dominant female who acts as shaman/chieftain. She casts priest spells at 7th level; spheres typically include Charm, Divination, Sun (Darkness only), and Weather, and Scrag Shamen also get Elemental (water) spells. Leadership is only retained by combat, so fights for pack control are frequent. Often trolls rend each other limb from limb, but these battles are never fatal. Still, it is the custom of trolls to toss the loser\'s head a great distance from the fight scene, and frequently losers must sit and stew for a week until their new head grows in.\nThe pack chieftain\'s duties are few. She leads the trolls on nightly forages, loping along, sniffing the air for prey. If a scent is found, the trolls charge, racing to get there first, and letting out a great cry once prey is spotted. In return for being the hunt leader, the shaman gets her choice of mates in the pack. Females give birth to a single troll about once every five years.}}'},
+ {name:'Frost-Giant-AC0',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=Frost }}{{title=Giant}}{{name= AC0}}RaceData=[w:Frost Giant AC0, align:CE, ac:none, cattr:int=5:10|mov=12|ac=0|hd=14+1d4r1|thac0=5|tohit=+4|dmg=+9|size=H|attk1=1d8:Fist:0:B|attkmsg=Remember immune to Cold, spdef:Immune to cold. Can catch rocks hurled at them 40% of the time, ns:1],[cl:WP,prime:Frost-Giant-Battle-Axe,items:FG-Rock:1d4+1]{{subtitle=Creature}}Specs=[Frost-Giant-AC0,CreatureRace,2H,Creature]{{Section=**Attributes**}}{{Intelligence=Low to Average (5-10)}}{{AC=0 - Warriors usually wear chain mail and metal helmets decorated with horns or feathers. Natural AC is 5}}{{Alignment=Chaotic Evil, often living in small groups}}{{Move=12 (15 without armour)}}{{Hit Dice=14HD +1d4}}{{THAC0=5}}{{Section1=**Attacks:** +4 on ToHit rolls from strength. 1 x Fist for 1d8 HP damage, or using a Frost Giant Battle Axe for 2d8 plus strength bonus of +9. Throw rocks 3 to 200 yards doing 2d10 damage}}{{Languages=*Frost Giant* and *Giant Common*}}{{Size=H, 21ft tall}}{{Life Expectancy=About 250 years}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Cold Immunity=Immune to all forms of cold}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc7=**Frost giants:** have a reputation for crudeness and stupidity. This reputation is deserved, but frost giants are crafty fighters.\nFrost giants have muscular, roughly human builds. The typical adult male is 21\' tall and weighs about 8,000 pounds. Females are slightly shorter and lighter, but otherwise identical to males. Frost giants have snow-white or ivory skin. Their hair is light blue or dirty yellow, with matching eyes.\nFrost giants carry their belongings in huge sacks. A typical frost giant\'s sack contains 2-5 (1d4+1) throwing rocks, the giant\'s wealth, and 3-12 (3d4) mundane items. Everything in a giant\'s bag is old, worn, dirty, and smelly, making the identification of any valuable items difficult.}}{{desc8=A frost giant\'s natural Armor Class is 5. Warriors usually wear chain mail and metal helmets decorated with horns or feathers (AC 0). They also wear skins and pelts, along with any jewelry they own.}}{{desc9=**Combat:** Frost giants will start combat at a distance, throwing rocks until they run out of ammunition, or the opponent closes. One of their favorite strategies is to ambush victims by hiding buried in the snow at the top of an icy or snowy slope where opponents will have difficulty reaching them.\nWarriors favor huge battle axes. A frost giant\'s oversized weapons do double normal (man-sized) damage to all opponents, plus the giant\'s strength bonus. Thus, a frost giant battle axe does 2-16 (2d8) +9 points of damage.\nAdult frost giants can hurl rocks for 2-20 (2d10) points of damage. Their minimum range is 3 yards while their maximum is 200 yards. They can catch similar large missiles 40% of the time.}}'},
+ {name:'Frost-Giant-AC5',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Frost Giant AC5,cattr:ac=5|mov=15]{{}}Specs=[Frost-Giant-AC5,CreatureRace,2H,Frost-Giant-AC0]{{}}%{Race-DB-Creatures|Frost-Giant-AC0}{{name= AC5}}{{AC=Not wearing any armour, so natural AC of 5}}{{desc8=Frost giants\' natural Armor Class is 5, when not wearing any armour. This is rare, as most wear chain mail and metal helmets decorated with horns or feathers (AC 0).}}'},
+ {name:'Frost-Giant-Jarl',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Frost Giant Jarl,cattr:ac=-2|hd=14+1d4r5, ns:=1],[cl:WP,prime:Frost-Giant-Battle-Axe+2,items:FG-Rock:1d4+1]{{}}Specs=[Frost-Giant-Jarl,CreatureRace,2H,Frost-Giant-AC0]{{}}%{Race-DB-Creatures|Frost-Giant-AC0}{{name= Jarl}}{{desc6=**Frost Giant Jarl:** A chieftain who commands 20 or more giants is called a jarl. Jarls always will have better than normal armor and a weapon of +1 to +3 enchantment.}}'},
+ {name:'Frost-Giant-Juvenile-1',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Frost Giant Juvenile 1,cattr:ac=5|hd:13+1d4|thac0=7|tohit=+3|dmg=+8,ns:=1],[cl:WP,both:Frost-Giant-Battle-Axe]{{}}Specs=[Frost-Giant-Juvenile-1,CreatureRace,2H,Frost-Giant-AC0]{{}}%{Race-DB-Creatures|Frost-Giant-AC0}{{name= Juvenile-1}}{{AC=Not wearing any armour, so natural AC of 5}}{{desc8=Frost giants\' natural Armor Class is 5, when not wearing any armour. This is rare, as most wear chain mail and metal helmets decorated with horns or feathers (AC 0).}}'},
+ {name:'Frost-Giant-Juvenile-2',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Frost Giant Juvenile 2,cattr:hd:12+1d4|tohit=+3|dmg=+7]{{}}Specs=[Frost-Giant-Juvenile-2,CreatureRace,2H,Frost-Giant-Juvenile-1]{{}}%{Race-DB-Creatures|Frost-Giant-Juvenile-1}{{name= Juvenile-2}}'},
+ {name:'Frost-Giant-Juvenile-3',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Frost Giant Juvenile 3,cattr:hd:11+1d4|thac0=9|tohit=+3|dmg=+6]{{}}Specs=[Frost-Giant-Juvenile-3,CreatureRace,2H,Frost-Giant-Juvenile-1]{{}}%{Race-DB-Creatures|Frost-Giant-Juvenile-1}{{name= Juvenile-3}}'},
+ {name:'Frost-Giant-Shaman-L3',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Frost Giant Shaman L3,cattr:cl=pr:frost-giant-shaman|lv=3]{{}}Specs=[Fire-Giant-Shaman-L3,CreatureRace,2H,Frost-Giant-AC0]{{}}%{Race-DB-Creatures|Frost-Giant-Shaman-L7}'},
+ {name:'Frost-Giant-Shaman-L5',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Frost Giant Shaman L5,cattr:cl=pr:frost-giant-shaman|lv=5]{{}}Specs=[Fire-Giant-Shaman-L5,CreatureRace,2H,Frost-Giant-AC0]{{}}%{Race-DB-Creatures|Frost-Giant-Shaman-L7}'},
+ {name:'Frost-Giant-Shaman-L7',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Frost Giant Shaman L7,cattr:cl=pr:frost-giant-shaman|lv=7]{{}}Specs=[Fire-Giant-Shaman-L7,CreatureRace,2H,Frost-Giant-AC0]{{}}%{Race-DB-Creatures|Frost-Giant-AC0}{{name= Shaman}}{{Section3=**Shaman:** This Frost Giant is a Shaman that can cast spells of a number of priest spheres of magic: *healing, charm, protection, divination*, or *weather*}}{{desc6=**Frost Giant Shaman:** There is a 20% chance that any band of frost giants will have a shaman (80%) or witch doctor (20%). If the group is led by a jarl, there is an 80% chance for a spell caster. Frost giant shamans are priests of up to 7th level. A shaman can cast normal or reversed spells from the *healing, charm, protection, divination*, or *weather* spheres. Frost giant witch doctors are priest/wizards of up to 7th/3rd level; they prefer spells that can bewilder and confound other giants. Favorite spells include: *unseen servant, shocking grasp, detect magic, ventriloquism, deeppockets, ESP, mirror image,* and *invisibility*.}}'},
+ {name:'Frost-Giant-Witch-Doctor-L3-7',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Frost Giant Witch Doctor,sps:any,cattr:cl=pr:frost-giant-shaman/mu:frost-giant-witch-doctor|lv=7/3,ns:1],[cl:MU,lv:1,w:random|random|random|Detect-Magic],[cl:MU,lv:2,w:random|ESP|Mirror-Image|random|random]{{}}Specs=[Frost-Giant-Witch-Doctor,CreatureRace,2H,Frost-Giant-AC0]{{}}%{Race-DB-Creatures|Frost-Giant-AC0}{{name= Witch Doctor}}{{Section3=**Witch Doctor:** This Frost Giant is a Witch Doctor that can cast spells of a number of wizard spells, and priest spheres of magic:*healing, charm, protection, divination*, or *weather*}}{{desc6=**Frost Giant Witch Doctor:** There is a 20% chance that any band of frost giants will have a shaman (80%) or witch doctor (20%). If the group is led by a jarl, there is an 80% chance for a spell caster. Frost giant shamans are priests of up to 7th level. A shaman can cast normal or reversed spells from the *healing, charm, protection, divination*, or *weather* spheres. Frost giant witch doctors are priest/wizards of up to 7th/3rd level; they prefer spells that can bewilder and confound other giants. Favorite spells include: *unseen servant, shocking grasp, detect magic, ventriloquism, deeppockets, ESP, mirror image,* and *invisibility*.}}'},
{name:'Galtrit',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{subtitle=Creature}}RaceData=[w:Galtrit, cattr:int=8:10|ac=2|size=T|hd=1-6|hp=2|thac0=20|mr=0|mw=0|dmgmsg=Anesthetic in saliva prevents victims feeling the bite. Automatically sucks \\lbrak;1HP of blood/round\\rbrak;\\lpar;!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who is the victim?¦token_id}¦Galtrit blood drain_Feeling drained¦100¦-10¦Seem to be getting weaker... not sure why...¦arrowed\\rpar; for a full turn, if undisturbed. For each 4HP blood loss victim loses 1 Constitution. 3 Con lost victim faints. See Specials. Hit by any weapon. No magic resistance, spattk:Only detected on 1 in 8 (Elves 1 in 6). If not detected gain +3 on To Hit. Once locked on galltrits suck 1HP of blood per round for a full turn if undisturbed. If challenged in any way the galltrits flee. This loss of blood reduces the victim\'s Constitution by 1 point for every 4 hit points of blood lost. If the victim loses 3 or more points of Constitution usually due to multiple galltrits they faint from the sudden blood loss. It takes two full turns to awaken and two weeks to regain the lost Constitution points, spdef:Nil]{{}}%{Race-DB-Creatures|Gremlin}{{title=Galtrit}}{{Intelligence=Average (8 to 10)}}{{AC=2}}{{Size=T, 6ins tall}}{{Alignment=Chaotic Evil}}{{Hit Dice=1-6 (2HP)}}{{Magic Resistance=No magic resistance}}{{Surprise=Detected only on 1 in 8 roll (Elves 1 in 6). If win surprise, gain +3 on attack roll}}Specs=[Galtrit,CreatureRace,0H,Gremlin]{{desc8=**Galtrit:** These nasty little stone-gray creatures live in areas of dung, carrion, or offal. Because of their small size and coloration, they are detected only on a 1 in 8 chance (1 in 6 for elves).}}{{desc9=**Combat:** They attack anything that disturbs them. Galltrit attempt to gain surprise and bite (with a +3 bonus to the attack roll if they have surprise) somewhere unobtrusive. An anesthetic in their saliva prevents their victims from feeling the bite, rather like a vampire bat.\nOnce locked on, galltrits suck 1 hit point of blood per round for a full turn, if undisturbed. If challenged in any way, the galltrits flee. This loss of blood reduces the victim\'s Constitution by 1 point for every 4 hit points of blood lost. If the victim loses 3 or more points of Constitution, usually due to multiple galltrits, he faints from the sudden blood loss. It takes two full turns to awaken and two weeks to regain the lost Constitution points.}}'},
{name:'Genie-Djinni',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Djinni}{{}}Specs=[Djinni,CreatureRace,0H,Djinni]{{}}RaceData=[w:Djinni]{{}}'},
{name:'Genie-Efreeti',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Efreeti}{{}}Specs=[Efreeti,CreatureRace,0H,Efreeti]{{}}RaceData=[w:Efreeti]{{}}'},
@@ -979,8 +1041,36 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Ghost-ethereal-plane',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Ghost}}{{name on Etherial Plane}}{{subtitle=Creature}}Specs=[Ghost,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=High (13-14)}}{{AC=8}}{{Alignment=Lawful Evil}}{{Move=9}}{{Hit Dice=10}}{{THAC0=11}}{{Attack=Touch ages a character by 1d4 x 10 years}}{{Languages=Those known at death, and can communicate with both the dead and living}}{{Size=M, 5 to 6ft tall}}{{Life Expectancy=Already dead!}}{{Section2=**Powers**}}{{Section3=**Dreadful Appearance:** The mere sight of a Ghost causes any humanoid being to age 10 years and flee in panic for 2-12 (2d6) turns unless a saving throw versus spell is made. Priests above 6th level are immune to this effect, and all other humanoids above 8th level may add +2 to their saving throws.}}{{Section4=**Magic Jar:** Any creatures within 60 yards of a ghost is subject to attack by magic jar. If the ghost fails to magic jar its chosen victim, it will then semi-materialize in order to attack by touch (in which case use a *Ghost-Material-Plane*).}}{{Section6=**Special Advantages**}}{{Aging attack=A successful touch from a Ghost ages the victim by 1d4 x 10 years}}{{Attack Immunity=Only hit by silver weapons (half-damage) and magically enchanted weapons of +1 or better (full-damage)}}{{Spell Immunity=Immune to *all spells* cast on the Material Plane. Only affected by spells cast on the Etherial plane}}{{Other Immunities=Immune to paralysation and poison}}{{Infravision=No need for light (dead eyes) so can "sense" normally in absolute darkness}}RaceData=[w:Ghost Ethereal Plane, align:LE, cattr:int=13:14|mov=9|ac=8|size=M|hd=10r2|thac0=11|attk1=0:Touch:0:B|dmgmsg=On successful hit opponents \\lbrak;age by 1d4 x 10 years\\rbrak;\\lpar;!modattr ~~charid \\amp#64;{target¦Who\'s the Victim?¦character_id} ~~age\\vbar\\amp#91;\\lbrak;10\\amp#42;1d4\\rbrak;\\amp#93; ~~fb-header Ghost Aging Attack ~~fb-content _CHARNAME_ has aged by _TCUR0_ and is now _CUR0_ years old\\rpar;. Remember immune to Sleep Charm Hold \\amp Cold. Silver \\lpar;half-damage\\rpar; or +1 or better weapons to hit and those in 60yds suffer the *Ghost Fear* power, spattk:Drain 10 x 1d4 years of age if hit, spdef:Silver \\lpar;half-damage\\rpar; or +1 or better weapons to hit. Immune to spells cast on the material plane. Ghost Fear power ages and scares those within 60yds seeing Ghost, ns:2],[cl:PW,w:Ghost Fear,sp:0,pd:-1],[cl:PW,w:Magic Jar,sp:10,-1]{{Section9=**Description**}}{{desc=Ghosts are the spirits of humans who were either so greatly evil in life or whose deaths were so unusually emotional they have been cursed with the gift of undead status. Thus, they roam about at night or in places of darkness. These spirits hate goodness and life, hungering to draw the living essences from the living.}}{{desc1=**Combat:** As ghosts are non-corporeal (ethereal), they are usually encountered only by creatures in a like state, although they can be seen by non-ethereal creatures. The mere sight of one causes any humanoid being to age 10 years and flee in panic for 2-12 (2d6) turns unless a saving throw versus spell is made. Priests above 6th level are immune to this effect, and all other humanoids above 8th level may add +2 to their saving throws. Any creatures within 60 yards of a ghost is subject to attack by *magic jar*. If the ghost fails to *magic jar* its chosen victim, it will then semi-materialize in order to attack by touch (in which case the ghost is Armor Class 0). Any human or demi-human killed by a ghost is drained of its life essence and is forever dead.\nIf the ghost fails to become semi-material it can only be combatted by another in the Ethereal plane (in which case the ghost has an Armor Class of 8 - use *Ghost-etherial-plane* creature definition).\nGhosts can be turned by clerics after reaching 7th level and can be damaged by holy water while in their semi-material form.}}'},
{name:'Ghost-material-plane',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= on Material Plane}}{{subtitle=Creature}}Specs=[Ghost,CreatureRace,0H,Ghost-ethereal-plane]{{AC=0}}RaceData=[w:Ghost Material Plane, cattr:ac=0]{{desc=}}%{Race-DB-Creatures|Ghost-etherial-plane}'},
{name:'Ghoul',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Ghoul}}{{subtitle=Creature}}Specs=[Ghoul,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Low (5-7)}}{{AC=6}}{{Alignment=Chaotic Evil}}{{Move=9}}{{Hit Dice=2}}{{THAC0=19}}{{Attack=2 x Claw 1d3, 1 x Bite 1d6}}{{Languages=Ghouls cannot talk, being mindless, but have been known to utter a low moan when unable to complete an assigned task}}{{Size=M 5-6ft tall}}{{Life Expectancy=Already dead!}}{{Section2=**Powers**}}{{Paralysis=Their touch causes humans (including dwarves, gnomes, half-elves, and halflings, **but excluding elves**) to become rigid unless a saving throw versus paralyzation is successful. This paralysis lasts for 3-8 (2+1d6) rounds or until negated by a priest.}}{{Section4=**Special Advantages**}}{{Spell Immunity=Subject to all attack forms except *sleep* and *charm* spells}}{{Infravision=No need for light (dead eyes) so can see normally in absolute darkness}}RaceData=[w:Ghoul, align:N, cattr:int=5:7|mov=9|ac=6|size=M|hd=2r4|thac0=19|attk1=1d3:Claw 1:0:S|attk2=1d3:Claw 2:0:S|attk3=1d6:Bite:1:P|dmgmsg=On successful hit humans (including dwarves; gnomes; half-elves; and halflings **but excluding elves**) save vs. Paralysis or \\lbrak;Paralysed\\rbrak;(!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Select Target¦token_id}¦Paralysis¦\\amp#91;\\lbrak;20+\\lpar;10\\amp#42;1d6\\amp#41;\\rbrak;\\amp#93;¦-10¦Paralysed by a Ghoul attack¦back-pain). Remember immune to Sleep \\amp Charm]{{Section9=**Description**}}{{desc=Ghouls are undead creatures, once human, who now feed on the flesh of corpses. Although the change from human to ghoul has deranged and destroyed their minds, ghouls have a terrible cunning which enables them to hunt their prey most effectively.\nGhouls are vaguely recognizable as once having been human, but have become horribly disfigured by their change to ghouls. The tongue becomes long and tough for licking marrow from cracked bones, the teeth become sharp and elongated, and the nails grow strong and sharp like claws.}}{{desc1=**Combat:** Ghouls attack by clawing with their filthy nails and biting with their fangs. Any human or demi-human (except elves) killed by a ghoulish attack will become a ghoul unless blessed (or blessed and then resurrected). Obviously, this is also avoided if the victim is devoured by the ghouls. Ghoul packs always attack without fear. These creatures are subject to all attack forms except sleep and charm spells. They can be turned by priests of any level. The magic circle of protection from evil actually keeps ghouls completely at bay.}}'},
+ {name:'Giant-Cloud',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Cloud-Giant}{{}}Specs=[Giant-Cloud,CreatureRace,2H,Cloud-Giant]{{}}RaceData=[w:Cloud Giant]{{}}'},
+ {name:'Giant-Cloud-Castle',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Cloud-Castle-Giant}{{}}Specs=[Giant-Cloud-Castle,CreatureRace,2H,Cloud-Castle-Giant]{{}}RaceData=[w:Cloud Castle Giant]{{}}'},
+ {name:'Giant-Cloud-Juvenile-1',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Cloud-Giant-Juvenile-1}{{}}Specs=[Giant-Cloud,CreatureRace,2H,Cloud-Giant-Juvenile-1]{{}}RaceData=[w:Cloud Giant Juvenile-1]{{}}'},
+ {name:'Giant-Cloud-Juvenile-2',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Cloud-Giant-Juvenile-2}{{}}Specs=[Giant-Cloud,CreatureRace,2H,Cloud-Giant-Juvenile-2]{{}}RaceData=[w:Cloud Giant Juvenile-2]{{}}'},
+ {name:'Giant-Cloud-Juvenile-3',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Cloud-Giant-Juvenile-3}{{}}Specs=[Giant-Cloud,CreatureRace,2H,Cloud-Giant-Juvenile-3]{{}}RaceData=[w:Cloud Giant Juvenile-3]{{}}'},
+ {name:'Giant-Cloud-Priest',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Cloud-Giant-Priest}{{}}Specs=[Giant-Cloud,CreatureRace,2H,Cloud-Giant-Priest]{{}}RaceData=[w:Cloud Giant Priest]{{}}'},
+ {name:'Giant-Cloud-Wizard',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Cloud-Giant-Wizard}{{}}Specs=[Giant-Cloud,CreatureRace,2H,Cloud-Giant-Wizard]{{}}RaceData=[w:Cloud Giant Wizard]{{}}'},
{name:'Giant-Cobra',type:'CreatureRace',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Giant Cobra, cattr: attk1=1d3:Bite:0:P|dmgmsg=If successfully hit as well as damage \\lbrak;inject poison\\rbrak;\\lpar;!rounds --target single¦`{selected¦token_id}¦\\amp#64;{target¦Who is the Unfortunate Victim?¦token_id}¦Cobra Venom_Not quite right¦\\amp#91;\\lbrak;2d4\\rbrak;\\amp#93;¦-1¦That bite was quite painful. Should I see a Cleric?¦stopwatch\\rpar;. **Don\'t save now!** Save when the effect message pops up in a few rounds - that way the surprise is maintained! This poison **kills the victim** in 2 to 8 rounds. Save at -2 penalty when asked to do so to only take 10HP, spattk:Cobra venom **kills the victim** in 2d4 rounds. Save at -2 penalty to only take 10HP, ns:1],[cl:PW,w:Birdcharmer Charm,sp:10,pd:-1]{{}}Specs=[Giant Cobra,CreatureRace,0H,Giant Poisonous Snake]{{}}%{Race-DB-Creatures|Giant Poisonous Snake}{{title=Giant Cobra}}{{Section3=**Mesmerize:** Cobras can mesmerize their prey by swaying slowly and steadily while staring down their victims. Creatures of animal intelligence or less must make a saving throw against paralyzation or be effectively paralyzed for as long as the snake continues to sway, and for 2d6 rounds thereafter.}}{{Section5=**Poison:** Giant Cobra venom gets a -2 penalty to saving throws to only take 10HP plus bite damage, or **kills the victim** in 2 to 8 rounds if don\'t save}}{{desc=**Giant Cobra:** The giant cobra is an example of a variant, giant poisonous snake. Its venom results in death 2-8 rounds after a successful strike; if the victim makes a saving throw at -2 he suffers only 10 points of damage.\nGiant cobras mesmerize prey as birdcharmer snakes do. They can kill and eat an entire goat or a demihuman up to halfling or gnome size. Some varieties of giant weasel can hunt them successfully, and jungle giants consider giant cobras a delicacy, as do some elven tribesmen.}}'},
{name:'Giant-Constrictor-Snake',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Giant Constrictor Snake, cattr:ac=5|hd=6+1r2|thac0=15|size=L| attk1=1d4:Bite:0:P|attk2=2d8:Constrict:0:B|dmgmsg=$$If successfully hit as well as damage this round \\lbrak;all future rounds\\rbrak;\\lpar;!rounds --target single¦`{selected¦token_id}¦\\amp#64;{target¦Who is the Unfortunate Victim?¦token_id}¦Giant Constrict¦\\amp#91;\\lbrak;99\\rbrak;\\amp#93;¦0¦Argh... The squeeze is on...¦back-pain\\rpar; automatically hit and do crushing damage, spattk:Once coiled victim takes crushing damage each round]{{}}Specs=[Constrictor Snake,CreatureRace,0H,Poison Snake 1-4]{{}}%{Race-DB-Creatures|Poison-Snake-1-4}{{title=Giant Constrictor Snake}}{{AC=5}}{{Hit Dice=6+1}}{{THAC0=15}}{{Size=L, 30+ft long}}{{Section5=**Constriction:** Suffering damage every round. It requires the combined efforts of 60 total points of Strength (the coiled victim plus outside help) to extricate someone from a giant constrictor\'s steel grasp}}{{desc=**Giant Constrictor:** Giant constrictor snakes are larger and much stronger than their smaller cousins. It requires the combined efforts of 60 total points of Strength (the coiled victim plus outside help) to extricate someone from a giant constrictor\'s steel grasp.\nThe skin of a giant constrictor snake is too thick and stiff to be workable, and is valuable only as armor, not for decoration. An uncured hide can fetch 20 gp}}'},
+ {name:'Giant-Fire-AC-1',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Fire-Giant-AC-1}{{}}Specs=[Fire-Giant-AC-1,CreatureRace,2H,Fire-Giant-AC-1]{{}}RaceData=[w:Fire Giant AC-1]{{}}'},
+ {name:'Giant-Fire-AC5',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Fire-Giant-AC5}{{}}Specs=[Fire-Giant-AC5,CreatureRace,2H,Fire-Giant-AC5]{{}}RaceData=[w:Fire Giant AC5]{{}}'},
+ {name:'Giant-Fire-Juvenile-1',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Fire-Giant-Juvenile-1}{{}}Specs=[Fire-Giant-Juvenile-1,CreatureRace,2H,Fire-Giant-Juvenile-1]{{}}RaceData=[w:Fire Giant Juvenile-1]{{}}'},
+ {name:'Giant-Fire-Juvenile-2',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Fire-Giant-Juvenile-2}{{}}Specs=[Fire-Giant-Juvenile-2,CreatureRace,2H,Fire-Giant-Juvenile-2]{{}}RaceData=[w:Fire Giant Juvenile-2]{{}}'},
+ {name:'Giant-Fire-Juvenile-3',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Fire-Giant-Juvenile-3}{{}}Specs=[Fire-Giant-Juvenile-3,CreatureRace,2H,Fire-Giant-Juvenile-3]{{}}RaceData=[w:Fire Giant Juvenile-3]{{}}'},
+ {name:'Giant-Fire-Shaman-L7',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Fire-Giant-Shaman-L7}{{}}Specs=[Fire-Giant-Shaman-L7,CreatureRace,2H,Fire-Giant-Shaman-L7]{{}}RaceData=[w:Fire Giant Shaman-L7]{{}}'},
+ {name:'Giant-Fire-Witch-Doctor',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Fire-Giant-Witch-Doctor}{{}}Specs=[Fire-Giant-Witch-Doctor,CreatureRace,2H,Fire-Giant-Witch-Doctor]{{}}RaceData=[w:Fire Giant Witch Doctor]{{}}'},
+ {name:'Giant-Frost-AC0',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Frost-Giant-AC0}{{}}Specs=[Frost-Giant-AC0,CreatureRace,2H,Frost-Giant-AC0]{{}}RaceData=[w:Frost Giant AC0]{{}}'},
+ {name:'Giant-Frost-AC5',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Frost-Giant-AC5}{{}}Specs=[Frost-Giant-AC5,CreatureRace,2H,Frost-Giant-AC5]{{}}RaceData=[w:Frost Giant AC5]{{}}'},
+ {name:'Giant-Frost-Jarl',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Frost-Giant-Jarl}{{}}Specs=[Frost-Giant-Jarl,CreatureRace,2H,Frost-Giant-Jarl]{{}}RaceData=[w:Frost Giant Jarl]{{}}'},
+ {name:'Giant-Frost-Juvenile-1',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Frost-Giant-Juvenile-1}{{}}Specs=[Frost-Giant-Juvenile-1,CreatureRace,2H,Frost-Giant-Juvenile-1]{{}}RaceData=[w:Frost Giant Juvenile-1]{{}}'},
+ {name:'Giant-Frost-Juvenile-2',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Frost-Giant-Juvenile-2}{{}}Specs=[Frost-Giant-Juvenile-2,CreatureRace,2H,Frost-Giant-Juvenile-2]{{}}RaceData=[w:Frost Giant Juvenile-2]{{}}'},
+ {name:'Giant-Frost-Juvenile-3',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Frost-Giant-Juvenile-3}{{}}Specs=[Frost-Giant-Juvenile-3,CreatureRace,2H,Frost-Giant-Juvenile-3]{{}}RaceData=[w:Frost Giant Juvenile-3]{{}}'},
+ {name:'Giant-Frost-Shaman-L3',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Frost Giant Shaman L3,cattr:cl=pr:frost-giant-shaman|lv=3]{{}}Specs=[Fire-Giant-Shaman-L3,CreatureRace,2H,Frost-Giant-AC0]{{}}%{Race-DB-Creatures|Frost-Giant-Shaman-L7}'},
+ {name:'Giant-Frost-Shaman-L5',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Frost Giant Shaman L5,cattr:cl=pr:frost-giant-shaman|lv=5]{{}}Specs=[Fire-Giant-Shaman-L5,CreatureRace,2H,Frost-Giant-AC0]{{}}%{Race-DB-Creatures|Frost-Giant-Shaman-L7}'},
+ {name:'Giant-Frost-Shaman-L7',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Frost-Giant-Shaman-L7}{{}}Specs=[Frost-Giant-Shaman-L7,CreatureRace,2H,Frost-Giant-Shaman-L7]{{}}RaceData=[w:Frost Giant Shaman L7]{{}}'},
+ {name:'Giant-Frost-Witch-Doctor-L3-7',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Frost-Giant-Witch-Doctor-L3-7}{{}}Specs=[Frost-Giant-Witch-Doctor-L3-7,CreatureRace,2H,Frost-Giant-Witch-Doctor-L3-7]{{}}RaceData=[w:Frost Giant Witch Doctor L3-7]{{}}'},
+ {name:'Giant-Hill-AC0',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Hill-Giant-AC0}{{}}Specs=[Hill-Giant-AC0,CreatureRace,2H,Hill-Giant-AC3]{{}}RaceData=[w:Hill Giant AC0]{{}}'},
+ {name:'Giant-Hill-AC3',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Hill-Giant-AC3}{{}}Specs=[Hill-Giant-AC3,CreatureRace,2H,Hill-Giant-AC3]{{}}RaceData=[w:Hill Giant AC3]{{}}'},
+ {name:'Giant-Hill-AC5',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Hill-Giant-AC5}{{}}Specs=[Hill-Giant-AC5,CreatureRace,2H,Hill-Giant-AC3]{{}}RaceData=[w:Hill Giant AC5]{{}}'},
+ {name:'Giant-Hill-Juvenile',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB|Hill-Giant-Juvenile}{{}}Specs=[Hill-Giant-Juvenile,CreatureRace,2H,Hill-Giant-AC3]{{}}RaceData=[w:Hill Giant Juvenile]{{}}'},
{name:'Giant-Leech-1HD',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{subtitle=Creature}}RaceData=[w:Giant Leech 1HD,cattr:hd=1|regen=1]{{}}%{Race-DB-Creatures|Giant-Leech-2HD}{{name= 1HD}}{{Hit Dice=1}}Specs=[Giant Leech,CreatureRace,0H,Giant-Leech-2HD]{{Size=S, 4ft long}}'},
{name:'Giant-Leech-2HD',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Giant Leech}}{{name= 2HD}}{{subtitle=Creature}}RaceData=[w:Giant Leech 2HD, align:N, ac:none, weaps:none, cattr:int=0|mov=3|swim=3|ac=9|size=S|hd=2|regen=2|thac0=19|attk1=1d4:Bite:0:P|dmgmsg=A successful bite injects anesthetizing saliva then \\lbrak;sucks blood\\rbrak;\\lpar;!setattr --silent --charid \\amp#64;{target¦Who\'s the victim?¦character_id} ~~blood-drain¦`{selected¦conregen}\\amp#13;!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who\'s the victim?¦token_id}¦Blood-Drain_Somethings wrong?_`{selected¦token_id}¦99¦0¦Definitely not feeling your best¦broken-heart\\rpar; for `{selected¦conregen}HP per round. Only \\lbrak;1% chance\\rbrak;\\lpar;!\\amp#13;\\amp#47;gr 1d100\\lt1 detect blood drain\\rpar; victim aware of attack if in the water. Not usually felt until weakness \\lpar;the loss of 50% of hit points\\rpar; makes victim aware something is amiss There is a \\lbrak;50% chance\\rbrak;\\lpar;!\\amp#13;\\amp#47;gr 1d100\\lt50 causes disease\\rpar; that the bite of one of these creatures \\lbrak;causes a disease\\rbrak;\\lpar;!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who\'s the victim?¦token_id}¦Leech disease¦99¦0¦Getting weaker and feel could die in \\amp#91;\\lbrak;1d4+1\\rbrak;\\amp#93; weeks...¦radioactive\\rpar; that is fatal in 1d4+1 weeks unless cured, spattk:Bite drains blood for 1HP per HD of leech with 50% chance of causing fatal disease]{{Section=**Attributes**}}{{Intelligence=Non (0)}}{{AC=9}}{{Alignment=Neutral}}{{Move=3, Sw 3}}{{Hit Dice=2}}{{HP=}}{{THAC0=19}}{{Attacks=Bite for 1d4 and automatic blood drain of 1HP per HD of Leech each round thereafter}}{{Languages=None}}{{Size=S, 3ft long}}{{Life Expectancy=Unknown}}{{Section1=**Powers**}}{{Section2=None}}{{Section3=**Special Advantages**}}{{Blood Drain Bite=Anesthetic saliva means victim only has 1% chance per round to notice until feel weak (50% HP drained)}}{{Section7=**Special Disadvantages**}}{{Section8=None}}Specs=[Giant Leech,CreatureRace,0H,Creature]{{Section9=**Description**}}{{desc8=Giant leeches are horrid, slug-like creatures that dwell in wet, slimy areas and suck the blood of warm-blooded creatures. These disgusting parasites range from 2 to 5 feet long. Their slimy skin is mottled brown and tan with an occasional shade of gray. Two antennae protrude from atop the head.}}{{desc9=**Combat:** Leeches wait in the mud and slime for prey. The initial attack attaches the sucker mouth of the giant leech. On the next round, and on each round thereafter, it drains blood for 1 point of damage per Hit Die of the leech. There is only a 1% chance that the victim is aware of the attack if it occurs in the water. The leech has anesthetizing saliva, and its bite and blood drain are not usually felt until weakness (the loss of 50% of hit points) sets in and makes the victim aware that something is amiss.\nThey can be killed by attack or by salt sprinkled on their bodies. There is a 50% chance that the bite of one of these creatures causes a disease that is fatal in 1d4+1 weeks unless cured.}}'},
{name:'Giant-Leech-3HD',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{subtitle=Creature}}RaceData=[w:Giant Leech 3HD,cattr:hd=3|regen=3|thac0=17]{{}}%{Race-DB-Creatures|Giant-Leech-2HD}{{name= 3HD}}{{Hit Dice=3}}{{THAC0=17}}Specs=[Giant Leech,CreatureRace,0H,Giant-Leech-2HD]{{Size=M, 5ft long}}'},
@@ -993,6 +1083,13 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Giant-Sea-Snake',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Giant Sea Snake, cattr:mov=12|swim=12|ac=5|hd=10r2|thac0=11| size=G| attk1=1d6:Bite:0:P|attk2=3d6:Constrict:0:B|dmgmsg=If successfully hit as well as damage \\lbrak;inject poison\\rbrak;\\lpar;!rounds --target single¦`{selected¦token_id}¦\\amp#64;{target¦Who is the Unfortunate Victim?¦token_id}¦Giant Snake Poison_Not quite right¦\\amp#91;\\lbrak;1d4\\rbrak;\\amp#93;¦-1¦That bite was quite painful. Should I see a Cleric?¦stopwatch\\rpar;. **Don\'t save now!** Save when the effect message pops up in a few rounds - that way the surprise is maintained! This poison **kills the victim** in 1d4 rounds. Save to negate when asked to do so$$If successfully hit as well as damage this round \\lbrak;all future rounds\\rbrak;\\lpar;!rounds --target single¦`{selected¦token_id}¦\\amp#64;{target¦Who is the Unfortunate Victim?¦token_id}¦Giant Sea Constrict¦\\amp#91;\\lbrak;99\\rbrak;\\amp#93;¦0¦Argh... The squeeze is on...¦back-pain\\rpar; automatically hit and do crushing damage, spattk:Bite poisons and kills within 1d4 rounds. Constriction does 3d6 damage per round, spdef:-]{{}}Specs=[Giant Sea Snake,CreatureRace,0H,Poison Snake 1-4]{{}}%{Race-DB-Creatures|Poison Snake 1-4}{{title=Giant Sea Snake}}{{Intelligence=Animal (1)}}{{AC=5}}{{Move=12}}{{Hit Dice=10}}{{THAC0=11}}{{Attacks=Bite for 1d6HP damage injecting fatal poison, and/or crush in constriction}}{{Size=G, 50+ft long}}{{Section5=**Poison:** is fatal in 1d4 rounds unless save vs. poison\n**Constrict:** for automatic damage each round}}{{desc9=**Combat:** Found only in tropical waters, the giant sea snake is the only type of snake that is both constricting and poisonous. Its constricting grasp on small ships can crush them in 10 rounds. Sea snakes attack ships only when they are hungry (20% chance). Their poisonous bite is deadly in 1-4 rounds. Sea snakes are fully capable of diving to great depths, and their nostrils (on the top of their snouts) have membranes that automatically seal them underwater.\nFrom time to time giant sea snakes gather in huge floating masses of hundreds or thousands of snakes, often 100 yards wide and 30 miles long. These may be mating rituals or they may be seasonal migrations; the actual reason is unknown.}}'},
{name:'Giant-Skeleton',type:'CreatureRace',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Giant-Skeleton, cattr:ac=4|hd=4+4r3|thac0=15|attk1=1d12:Bone bladed scimitar:5:S|attk2=1d12:Bone bladed spear:6:P|attkmsg=**Remember** *fireball** power one/hour. Immune to *sleep charm hold* and all mind-affecting spells. Immune to fire. Cold does half damage. Lightning full damage. Half damage from edged and piercing weapons. 1HP from all arrows quarrels \\amp missiles. Blunt weapons do full damage. Turned as *mummies*, spattk:fireball from tummy fire 1 per hour, spdef: immune to *sleep charm hold* and other mind-affecting spells. Immune to fire. Cold does half damage. Lightning full damage. Half damage from edged and piercing weapons. 1HP from all arrows quarrels \\amp missiles. Blunt weapons do full damage. Turned as *mummies*,ns:1],[cl:PW,w:Fireball,sp:3,clv:8,pd:24]{{}}Specs=[Giant Skeleton,CreatureRace,0H,Skeleton]{{}}%{Race-DB-Creatures|Skeleton}{{AC=4}}{{Hit Dice=4+4 HD}}{{THAC0=15}}{{Attack=1d12 and by weapon}}{{Size=L, 12ft tall}}{{Section3=**Fireball:** Once per hour (6 turns), a skeleton may reach into its chest and draw forth a sphere of fire from the flames that burn within its rib cage. This flaming sphere can be hurled as if it were a fireball that delivers 8d6 points of damage. Because these creatures are immune to harm from both magical and normal fires, they will freely use this attack in close quarters.}}{{Turning=Turned as *mummies*}}{{Spell Immunity=Immune to all *sleep, charm, hold* and other mind-affecting spells}}{{Other Immunities=Immune to fire. Cold does half damage. Lightning full damage}}{{Damage from S\\ampP=Half damage from edged and piercing weapons. 1HP from all arrows quarrels \\amp missiles. Blunt weapons do normal damage.}}{{Infravision=No need for light (no eyes) so can see normally in absolute darkness}}{{desc8=Giant skeletons are similar to the more common undead skeleton, but they have been created with a combination of spells and are, thus, far more deadly than their lesser counterparts.\nGiant skeletons stand roughly 12 feet tall and look to be made from the bones of giants. In actuality, they are simply human skeletons that have been magically enlarged. A small, magical fire burns in the chest of each giant skeleton, a by-product of the magics that are used to make them. These flames begin just above the pelvis and reach upward to lick at the collar bones. Mysteriously, no burning or scorching occurs where the flames touch the bone.}}{{desc9=**Combat:** They are normally armed with long spears or scythes that end in keen bone blades. Rare individuals will be found carrying shields (and thus have an Armor Class of 3), but these are far from common. Each blow that lands inflicts 1d12 points of damage.}}'},
{name:'Giant-Stag',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Giant Stag}}RaceData=[w:Giant Stag, align:N, weaps:none, ac:none, cattr:int=1|mov=24|ac=7|hd=5r4|thac0=16|size=L|attk1=1d4:2 x Hoof:0:B|attk2=4d4:Gore with Antlers:1:P|attkmsg=Attack either with hoofs or with antlers not both]{{subtitle=Creature}}Specs=[Giant Stag,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Animal (1)}}{{AC=7}}{{Alignment=Neutral}}{{Move=24}}{{Hit Dice=5 HD}}{{THAC0=16}}{{Attacks=Either kick with front hoofs for 2 x 1d4, or charge and gore with antlers for 4d4}}{{Size=L}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=Wild stags are the aggressive males of the deer herds. Normally docile and passive, they defend their herds against all but the most fearsome opponents.}}'},
+ {name:'Giant-Stone',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Stone-Giant}{{}}Specs=[Giant-Stone,CreatureRace,2H,Stone-Giant]{{}}RaceData=[w:Stone Giant]{{}}'},
+ {name:'Giant-Stone-Elder',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Stone-Giant-Elder}{{}}Specs=[Giant-Stone-Elder,CreatureRace,2H,Stone-Giant-Elder]{{}}RaceData=[w:Stone Giant Elder]{{}}'},
+ {name:'Giant-Stone-Juvenile-1',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Stone-Giant-Juvenile-1}{{}}Specs=[Giant-Stone,CreatureRace,2H,Stone-Giant-Juvenile-1]{{}}RaceData=[w:Stone Giant Juvenile-1]{{}}'},
+ {name:'Giant-Stone-Juvenile-2',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Stone-Giant-Juvenile-2}{{}}Specs=[Giant-Stone,CreatureRace,2H,Stone-Giant-Juvenile-2]{{}}RaceData=[w:Stone Giant Juvenile-2]{{}}'},
+ {name:'Giant-Stone-Juvenile-3',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Stone-Giant-Juvenile-3}{{}}Specs=[Giant-Stone,CreatureRace,2H,Stone-Giant-Juvenile-3]{{}}RaceData=[w:Stone Giant Juvenile-3]{{}}'},
+ {name:'Giant-Stone-Mage',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Stone-Giant-Mage}{{}}Specs=[Giant-Stone-Mage,CreatureRace,2H,Stone-Giant-Mage]{{}}RaceData=[w:Stone Giant Mage]{{}}'},
+ {name:'Giant-Two-Headed',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Ettin}{{}}Specs=[Two-Headed-Giant,CreatureRace,2H,Ettin]{{}}RaceData=[w:Two-Headed Giant]{{}}'},
{name:'Giant-Two-Headed-Troll',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Giant Two Headed }}RaceData=[w:Giant Two Headed Troll, cattr:int=8:10|hd=10r2|regen=1|thac0=11|size=L|dmg=+6|attk1=4+1d4:Claw:0:S|attk2=4+1d4:Claw:0:S|attk3=1d12:2 x Bite:1:P, spdef:Regenerate at 1HP per round, ns:5],[cl:WP,%:3,prime:Broadsword],[cl:WP,%:3,prime:Spear],[cl:WP,%:2,both:Two Handed Sword],[cl:WP,%:1,both:Great Axe],[cl:WP,%:91]{{subtitle=Creature}}%{Race-DB-Creatures|Troll}{{Intelligence=Average (8-10)}}{{Hit Dice=10}}Specs=[Giant Two Headed Troll,CreatureRace,0H,Troll]{{THAC0=11}}{{Attacks=2 x Claw 1d4+4, 2 x Bite 1d12}}{{Size=L 10ft tall}}{{Regeneration=3 rounds after 1st blood, regenerates at 1HP per round}}{{desc=These ferocious troll/ettin crossbreeds posses a mottled greenish brown skin tone, and their dress is usually moth-eaten rags or animal skins. Two-headed trolls use trollspeak as their language. Though part ettin, these monsters retain many of the abilities of trolls. They regenerate like trolls, but only 1 hit point a round, and severed limbs cannot reattach (their thicker limbs are not cleaved on a roll of 20). Two-headed trolls attack with two claws and two bites. Both bite attacks are against one opponent, but the claws may be directed against different foes. The troll can, though rarely, wield a weapon with a +6 damage bonus. Like ettins, two-headed trolls are surprised only on a 1. These creatures live in damp, underground caverns and can be found leading groups of their smaller troll cousins.}}{{desc9=}}'},
{name:'Gnoll',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Gnoll}}RaceData=[w:Gnoll, align:CE, weaps:short-blade|long-blade|pole-arm|battle-axe|bow|morningstar, ac:leather|padded|studded|ring-mail|brigandine|scale-mail|hide|chain-mail, cattr:int=5:7|mov=9|ac=10|size=L|hd=2r3|thac0=19|attk1=2d4:Weapon:3:P,ns:5],[cl:WP,%:5,prime:Shortsword],[cl:WP,%:5,prime:Longsword],[cl:WP,%:5,prime:Broadsword],[cl:WP,%:5,both:Awl Pike],[cl:WP,%:5,both:Bec de Corbin],[cl:WP,%5:,both:Fauchard],[cl:WP,%:5,both:Glaive],[cl:WP,%:5,both:Glaive-Guisarme],[cl:WP,%:5,both:Guisarme-Voulge],[cl:WP,%:5,both:Military Fork],[cl:WP,%:20,prime:Battleaxe],[cl:WP,%:5,both:Shortbow,items:Flight Arrows:20],[cl:WP,%:5,both:Longbow,items:Flight Arrows:20],[cl:WP,%:5,both:Longbow,items:Sheaf Arrows:10|Flight Arrows:10],[cl:WP,%:15,prime:Morningstar]{{subtitle=Creature}}{{Section=**Attributes**}}{{Intelligence=Low (5 to 7)}}{{AC=10, up to AC5 with armour}}{{Alignment=Chaotic Evil}}{{Move=9}}{{Hit Dice=2}}{{THAC0=19}}{{Attack=Default weapon for 2d4, or by weapon (equip via menus)}}{{Languages=*Gnoll,* and many also speak *flind, troll, orc,* or *hobgoblin*}}{{Size=L, 7-8ft tall}}{{Life Expectancy=On average 35 years}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Strength=}}{{Section5=**Tactics:** Gnolls seek to overwhelm their opponents by sheer numbers, using horde tactics. When under the direction of flinds or a strong leader, they can be made to hold rank and fight as a unit. While they do not often lay traps, they will ambush or attempt to attack from a flank or rear position.}}{{Section6=**Special Disadvantages**}}{{Section7=None}}Specs=[Gnoll,CreatureRace,0H,Creature]{{Section9=**Description**}}{{desc8=Gnolls are large, evil, hyena-like humanoids that roam about in loosely organized bands. While the body of a gnoll is shaped like that of a large human, the details are those of a hyena. They stand erect on two legs and have hands that can manipulate as well as those of any human. They have greenish gray skin, darker near the muzzle, with a short reddish gray to dull yellow mane.}}{{desc9=**Combat:** Gnolls seek to overwhelm their opponents by sheer numbers, using horde tactics. When under the direction of flinds or a strong leader, they can be made to hold rank and fight as a unit. While they do not often lay traps, they will ambush or attempt to attack from a flank or rear position. Gnolls favor swords (15%), pole arms (35%) and battle axes (20%) in combat, but also use bows (15%), morningstars (15%).}}'},
{name:'Gnoll-Chieftain',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Chieftain}}RaceData=[w:Gnoll Chieftain, ac:splint-mail|banded-mail|bronze-plate-mail|plate-mail, cattr:hd=4r3|ac=3|thac0=17|dmg=+3]{{subtitle=Creature}}%{Race-DB-Creatures|Gnoll}{{Hit Dice=4}}{{THAC0=17}}{{AC=3 (preset - can be improved with magical armour if equipped))}}{{Strength=Due to their great strength, Gnoll Chieftains gain +3 on damage that they do}}Specs=[Gnoll Chieftain,CreatureRace,0H,Gnoll]{{desc=**Gnoll Chieftain:** If 100 or more are encountered there will also be a chieftain who has 4 Hit Dice, an Armor Class of 3, and who receives a +3 on his damage rolls due to his great strength. Further, each chieftain will be protected by 2-12 (2d6) elite warrior guards of 3 Hit Dice (AC 4, +2 damage).}}'},
@@ -1003,7 +1100,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Goat-of-Terror',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Figurine of Wonderous Power\nGoat of Terror}}RaceData=[w:Goat of Terror, align:N, weaps:none, ac:none, cattr:int=0|mov=36|ac=2|hd=6|hp=48|thac0=20|size=M,ns:1],[cl:PW,w:Goat Terror,sp:0,pd:-1]{{subtitle=Figurine}}Specs=[Goat of Terror,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Not (0)}}{{AC=2}}{{Alignment=Neutral}}{{Move=36}}{{Hit Dice=6HD, starts as 48HP}}{{THAC0=N/A - no attacks as a creature}}{{Size=M}}{{Section2=**Powers**}}{{Section3=Radiates *Terror* in a 30ft radius when ridden vs an opponent}}{{Section4=**Special Advantages**}}{{Section5=Rider can employ the goat\'s horns as weapons}}{{Section6=**Special Disadvantages**}}{{Attacks=No attacks}}{{Uses=Can normally only be used 3 times before the figurine loses its power}}{{Section9=**Description**}}{{desc8=When called upon with the proper command word, this statuette becomes a destrier-like mount, movement rate 36, Armor Class 2, 48 hit points, and no attacks. However, its rider can employ the goat\'s horns as weapons (one horn as a spear +3 (lance), the other as a sword +6). When ridden versus an opponent, the goat of terror radiates terror in a 30-foot radius, and any opponent in this radius must roll a successful saving throw vs. spell or lose 50% of strength and suffer at least a -3 penalty to attack rolls, all due to weakness caused by terror. When all opponents are slain, or upon the proper command, the goat returns to its statuette form. It can be used once every two weeks.}}'},
{name:'Goat-of-Travail',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Figurine of Wonderous Power\nGoat of Travail}}RaceData=[w:Goat of Travail, align:N, weaps:none, ac:none, cattr:int=0|mov=24|ac=0|hd=16|hp=96|thac0=5|size=L|attk1=2+2d4:Hooves x 2:0:B|attk2=2d4:Bite:1:P|attk3=2d6:Horns x 2:2:P,attkmsg:Cannot use hooves if charging$$Cannot use bite if charging$$If charging horns do additional damage - see damage message,dmgmsg:Cannot use hooves if charging$$Cannot use bite if charging$$If charging horns do additional +6 hp damage each]{{subtitle=Figurine}}Specs=[Goat of Travail,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Not (0)}}{{AC=0}}{{Alignment=Neutral}}{{Move=24}}{{Hit Dice=16HD, starts as 96HP}}{{THAC0=5}}{{Attacks=2 x Hooves for 2d4+2 Bludgeoning damage each, 1 x Bite for 2d4 Piercing damage, 2 x Horns for 2d6 each of Piercing damage - can *Charge* for +6 extra Horn damage, but can\'t then do Hoof or Bite attack}}{{Size=L larger than a bull!}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages**}}{{Section7=Can normally only be used 3 times before the figurine loses its power}}{{Section9=**Description**}}{{desc8=When commanded, this statuette becomes an enormous creature, larger than a bull, with sharp hooves (2d4+2/2d4+2), a vicious bite (2d4), and a pair of wicked horns of exceptional size (2d6/2d6). If it is charging to attack, it may only use its horns, but +6 damage is added to each hit on that round (i.e., 8-18 hit points per damage per horn). It is Armor Class 0, has 96 hit points, and attacks as a 16 Hit Dice monster. It can be called to life just once per month up to 12 hours at a time. Its movement rate is 24.}}'},
{name:'Goat-of-Travelling',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Figurine of Wonderous Power\nGoat of Travelling}}RaceData=[w:Goat of Travelling, align:N, weaps:none, ac:none, cattr:int=0|mov=48|ac=6|hd=4|hp=24|thac0=17|size=M|attk1=1d8:Horn1:0:PB|attk2=1d8:Horn2:0:PB]{{subtitle=Figurine}}Specs=[Goat of Travelling,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Not (0)}}{{AC=6}}{{Alignment=Neutral}}{{Move=48 bearing 280lbs or less reduced by 1 for every additional 14lbs of weight carried}}{{Hit Dice=4HD, starts as 24HP}}{{THAC0=17}}{{Attacks=2 x Horns for 1d8 each of Piercing or Bludgeoning damage (depending on type of horn)}}{{Size=M}}{{Section2=**Powers**}}{{Section3=Can carry loads and riders of 280lbs or more}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages**}}{{Section7=Can normally only be used 3 times before the figurine loses its power}}{{Section9=**Description**}}{{desc8=This statuette provides a speedy and enduring mount of Armor Class 6, with 24 Hit Points and 2 attacks (horns) for 1d8 each (consider as 4 Hit\nDice monster). Its movement rate is 48 bearing 280 pounds or less. Its movement is reduced by 1 for every additional 14 pounds of weight carried. The goat can travel a maximum of one day each week—continuously or in any combination of periods totalling 24 hours. At this point, or when the command word is uttered, it returns to its small form for not less than one day before it can again be used.}}'},
- {name:'Goblin',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Goblin}}{{subtitle=Creature}}Specs=[Goblin,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Low to Average (5-10)}}{{AC=10 (can wear simple armour up to AC6)}}{{Alignment=Lawful Evil}}{{Move=6}}{{Hit Dice=1-1}}{{THAC0=20}}{{Attack=1d6 and by weapon}}{{Languages=Harsh, and pitched higher than that of humans. In addition to their own language, some goblins can speak in the kobold, orc, and hobgoblin tongues.}}{{Size=S 4ft tall}}{{Life Expectancy=50 years or so}}{{Section2=**Powers**}}{{Section3=None}}{{Priest Spells=}}{{Section4=**Special Advantages**}}{{Infravision=60 foot, but suffer -1 to attacks in bright sunlight}}RaceData=[w:Goblin, align:LE, cattr:int=5:10|mov=6|size=S|hd=1-1r4|thac0=20|attk1=1d6:Simple weapon:3:S|attkmsg=Remember -1 to-hit penalty in \\lbrak;Bright Sunlight\\rbrak;\\lpar;!rounds ~~target caster¦`{selected¦token_id}¦Sunlight 1 tohit penalty¦99¦0¦Suffering -1 to hit due to being in bright sunlight¦bleeding-eye\\rpar; but back to normal in \\lbrak;Shade\\rbrak;\\lpar;!rounds ~~removetargetstatus `{selected\\var;token_id}¦Sunlight 1 tohit penalty\\rpar;]{{Section9=**Description**}}{{desc8=These small, evil humanoids would be merely pests, if not for their great numbers. Goblins have flat faces, broad noses, pointed ears, wide mouths and small, sharp fangs. Their foreheads slope back, and their eyes are usually dull and glazed. They always walk upright, but their arms hang down almost to their knees. Their skin colors range from yellow through any shade of orange to a deep red. Usually a single tribe has members all of about the same color skin. Their eyes vary from bright red to a gleaming lemon yellow. They wear clothing of dark leather, tending toward dull soiled-looking colors.}}{{desc9=**Combat:** Goblins hate bright sunlight, and fight with a -1 on their attack rolls when in it. This unusual sensitivity to light, however, serves the goblins well underground, giving them infravision out to 60 feet. They can use any sort of weapon, preferring those that take little training, like spears and maces. They are known to carry short swords as a second weapon. They are usually armored in leather, although the leaders may have chain or even plate mail.\nGoblin strategies and tactics are simple and crude. They are cowardly and will usually avoid a face-to-face fight. More often than not, they will attempt to arrange an ambush of their foes.}}'},
+ {name:'Goblin',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Goblin}}{{subtitle=Creature}}Specs=[Goblin,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Low to Average (5-10)}}{{AC=10 (can wear simple armour up to AC6)}}{{Alignment=Lawful Evil}}{{Move=6}}{{Hit Dice=1-1}}{{THAC0=20}}{{Attack=1d6 and by weapon}}{{Languages=Harsh, and pitched higher than that of humans. In addition to their own language, some goblins can speak in the kobold, orc, and hobgoblin tongues.}}{{Size=S 4ft tall}}{{Life Expectancy=50 years or so}}{{Section2=**Powers**}}{{Section3=None}}{{Priest Spells=}}{{Section4=**Special Advantages**}}{{Infravision=60 foot, but suffer -1 to attacks in bright sunlight}}RaceData=[w:Goblin, align:LE, cattr:int=5:10|mov=6|size=S|hd=1-1r4|thac0=20|attk1=1d6:Simple weapon:3:S|attkmsg=Remember -1 to-hit penalty in \\lbrak;Bright Sunlight\\rbrak;\\lpar;!rounds ~~target caster¦`{selected¦token_id}¦Sunlight 1 tohit penalty¦99¦0¦Suffering -1 to hit due to being in bright sunlight¦bleeding-eye\\rpar; but back to normal in \\lbrak;Shade\\rbrak;\\lpar;!rounds ~~removetargetstatus `{selected¦token_id}¦Sunlight 1 tohit penalty\\rpar;]{{Section9=**Description**}}{{desc8=These small, evil humanoids would be merely pests, if not for their great numbers. Goblins have flat faces, broad noses, pointed ears, wide mouths and small, sharp fangs. Their foreheads slope back, and their eyes are usually dull and glazed. They always walk upright, but their arms hang down almost to their knees. Their skin colors range from yellow through any shade of orange to a deep red. Usually a single tribe has members all of about the same color skin. Their eyes vary from bright red to a gleaming lemon yellow. They wear clothing of dark leather, tending toward dull soiled-looking colors.}}{{desc9=**Combat:** Goblins hate bright sunlight, and fight with a -1 on their attack rolls when in it. This unusual sensitivity to light, however, serves the goblins well underground, giving them infravision out to 60 feet. They can use any sort of weapon, preferring those that take little training, like spears and maces. They are known to carry short swords as a second weapon. They are usually armored in leather, although the leaders may have chain or even plate mail.\nGoblin strategies and tactics are simple and crude. They are cowardly and will usually avoid a face-to-face fight. More often than not, they will attempt to arrange an ambush of their foes.}}'},
{name:'Goblin-Assistant',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Leader\'s Assistant}}RaceData=[w:Goblin Assistant, cattr:hd=1r4|ac=6]{{subtitle=Creature}}%{Race-DB-Creatures|Goblin}{{AC=6 (preset)}}Specs=[Goblin Assistant,CreatureRace,0H,Goblin]{{Hit Dice=1}}{{desc=**Leader\'s Assistant:** For every 40 goblins there will be a leader and his 4 assistants, each having 1 Hit Die (7 hit points).}}'},
{name:'Goblin-Bodyguard',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Bodyguard}}RaceData=[w:Goblin Bodyguard, cattr:hd=2r4|thac0=19|ac=4|attk1=1d8:Battle Axe:7:S|attk2=1d6:Shortsword:3:S]{{subtitle=Creature}}%{Race-DB-Creatures|Goblin}{{AC=6 (preset)}}Specs=[Goblin Bodyguard,CreatureRace,0H,Goblin]{{Hit Dice=2}}{{THAC0=19}}{{Attack=1d6/1d8 and by weapon}}{{desc=**Chief\'s Bodyguard:** The tribe has a single goblin chief and 2-8 (2d4) bodyguards each of 2 Hit Dice, Armor Class 4, and armed with two weapons.}}'},
{name:'Goblin-Chief',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Chief}}RaceData=[w:Goblin Chief, cattr:hd=2r4|thac0=19|ac=4|attk1=1d8:Battle Axe:7:S|attk2=1d6:Shortsword:3:S]{{subtitle=Creature}}%{Race-DB-Creatures|Goblin}{{AC=6 (preset)}}{{Hit Dice=2}}Specs=[Goblin Chief,CreatureRace,0H,Goblin]{{THAC0=19}}{{Attack=1d6/1d8 and by weapon}}{{desc=**Chief:** The tribe has a single goblin chief and 2-8 (2d4) bodyguards each of 2 Hit Dice, Armor Class 4, and armed with two weapons.}}'},
@@ -1011,8 +1108,10 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Goblin-Shaman-L5',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Shaman}}RaceData=[w:Goblin Shaman L5, cattr:cl=pr:goblin-shaman|lv=5|ac=6]{{subtitle=Creature}}%{Race-DB-Creatures|Goblin}{{AC=6 (preset)}}Specs=[Goblin Shaman,CreatureRace,0H,Goblin]{{Hit Dice=1}}{{Section3=}}{{Priest Spells=Spheres include: Divination, Healing (reversed), Protection, and Sun (reversed).}}{{desc=Goblin shamans are rare, but have been known to reach 7th level. Their spheres include: Divination, Healing (reversed), Protection, and Sun (reversed).}}'},
{name:'Goblin-Sub-Chief',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Sub-Chief}}RaceData=[w:Goblin Sub-Chief, cattr:hd=1+1r4|thac0=19|ac=5|attk1=1d8:Battle Axe:7:S]{{subtitle=Creature}}%{Race-DB-Creatures|Goblin}{{AC=6 (preset)}}Specs=[Goblin Sub-Chief,CreatureRace,0H,Goblin]{{Hit Dice=1+1}}{{THAC0=19}}{{Attack=1d8 and by weapon}}{{desc=**Sub-Chief:** For every 200 goblins there will be a sub-chief and 2-8 (2d4) bodyguards, each of which has 1+1 Hit Dice (8 hit points), is Armor Class 5, and armed with a battle axe.}}'},
{name:'Goblin-ac6',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= AC6}}RaceData=[w:Goblin ac6, cattr:ac=6]{{subtitle=Creature}}%{Race-DB-Creatures|Goblin}{{AC=6 (preset)}}Specs=[Goblin,CreatureRace,0H,Goblin]{{}}'},
+ {name:'Gold-Dragon',type:'DragonRace',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}Specs=[Gold-Dragon,DragonRace,2H,Red-Dragon]{{}}RaceData=[w:Gold Dragon, cattr:int=17:18|mov=12|fly=40C|Jump=3|swim=12|ac=0-??1|hd=(16+??2)d8r1|mr=(v(^((??1-4);0);1)*(??1+2)*5)|cl=mu:gold-dragon/pr:gold-dragon|lv=8+??1/8+??1|thac0=5-??2|dmg=??1|size=G|attk1=1d10:Claw x 2 or Claw+Kick:0:S|attk2=6d6:Bite:0:P|attk3=2d10:Tail Swipe:0:B|attkmsg=Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$\\lbrak;Show the radius\\rbrak;\\lpar;!rounds ~~aoe `{selected¦token_id}¦arc180¦feet¦0¦\\lbrak;\\lbrak;`{selected¦age¦max}*12\\rbrak;\\rbrak;¦\\lbrak;\\lbrak;`{selected¦age¦max}*24\\rbrak;\\rbrak;¦black\\rpar; then up to \\lbrak;\\lbrak;`{selected¦age¦max}\\rbrak;\\rbrak; opponents in the area take damage and Save vs. Petrification with the penalty shown below or be \\lbrak;Stunned\\rbrak;\\lpar;!rounds ~~target area¦`{selected¦token_id}¦\\amp#64;{target¦Select the stunned creature¦token_id}¦Stunned¦\\lbrak;\\amp#91;1+1d4\\amp#93;\\rbrak;¦-1¦Stunned by a dragon tail slap¦back-pain\\rpar; for 1d4+1 rounds., spattk:*Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*, spdef:Magic resistance @{selected|monstermagicresist}% and immune to fire \\amp gas from birth, ns:=11],[cl:PW,w:Gold-Dragon-Breath,pd:-1,sp:1],[cl:PW,age:1,w:MU-Water-Breathing,pd:-1,sp:1],[cl:PW,age:1,w:MU-Polymorph-Self,pd:3,sp:1],[cl:PW,age:3,w:PR-Bless,pd:3,sp:1],[cl:PW,w:PR-Detect-Lie,age:4,pd:3,sp:1],[cl:PW,w:PR-Animal-Summoning-1,age:6,pd:1,sp:1],[cl:PW,w:PR-Animal-Summoning-II,age:7,pd:1,sp:1],[cl:PW,w:PW-Luck-Bonus,age:7,pd:1,sp:1],[cl:PW,w:PR-Quest,age:8,pd:1,sp:1],[cl:PW,w:PW-Detect-Gems-Kind+Number,age:8,pd:3,sp:1],[cl:PR,lv:1,w:],[cl:PR,lv:2,w:],[cl:PR,lv:3,w:],[cl:PR,lv:4,w:]{{}}%{Race-DB-Creatures|Red-Dragon}{{title=Gold}}{{Intelligence=Genius (17-18)}}{{AC=Varies with age, adult gold dragon is AC -6}}{{Move=12, FL 40(C) (winged form) FL 6(E) (wingless form), Swim 12 (winged) 15 (wingless), Jump 3}}{{Hit Dice=Varies with age, adult gold dragon is 18 HD}}{{THAC0=Varies with age, adult gold dragon is 3}}{{Section1=**Attacks:** Damage bonus varies with age, adult gold dragon is +6. 2 x Claws for 1d10 HP each, possibly with 1 or 2 kicks for 1d10 each, bite for 6d6, and tail slap for 2d10 and possible *stun* within an area varying with age. Several other attacks possible - see *Powers*}}{{Languages=*Gold Dragon* and *Good Dragon Common*, and can *speak with animals* freely from birth. 18% of hatchlings (+5% per age level) can perform universal communication with any intelligent creature}}{{Breath Weapon=A gold dragon has two breath weapons: a cone of fire 90\' long, 5\' wide at the dragon\'s mouth, and 30\' wide at the end or a cloud of potent chlorine gas 50\' long, 40\' wide and 30\' high. Creatures caught in either effect are entitled to a save versus breath weapon for half damage. Damage from the acid breath weapon varies by age from 2d12+1 to 24d12+12. }}{{Spell Casting=Knows a number of random wizard and priest spells cast at a level from 12 to 20 varying with age. All spells are cast at a speed of 1 segment regardless of the spell}}{{Spell-like Powers=All gold dragons can use *water breathing* at will, and can *polymorph self* 3 times a day. *Young* dragons can *bless* x 3 per day, *Juveniles* can *detect lie* x3 per day, *Adult* dragons gain *animal summoning I* x1 a day, *Mature Adults* can do *animal summoning II* x1 per day, and *luck bonus* once a day. *Old* dragons can cast *quest* x 1 per day, and *detect gems* once per day within 30ft radius.\nThe *luck bonus* power is used to aid *good* adventurers: see the description of the power by *viewing* it}}{{desc8=**Gold Dragons:** Gold dragons are wise, judicious, and benevolent. They often embark on self-appointed quests to promote goodness, and are not easily distracted from them. They hate injustice and foul play. A gold dragon frequently assumes human or animal guise and usually will be encountered disguised.\nAt birth, a gold dragon\'s scales are dark yellow with golden metallic flecks. The flecks get larger as the dragon matures until, at the adult stage, the scales grow completely golden.\nGold dragons can live anywhere. Their lairs are secluded and always made of solid stone, either caves or castles. These usually have loyal guards: either animals appropriate to the terrain, or storm or good cloud giants. The giants usually serve as guards through a mutual defensive agreement.}}{{desc9=**Combat:** Gold dragons usually parley before combat. When conversing with intelligent creatures they use *detect lie* and *detect gems* spells to gain the upper hand. In combat, they quickly use *bless* and *luck bonus*. Older dragons use *luck bonus* at the start of each day if the duration is a day or more. They make heavy use of spells in combat.}}'},
{name:'Gorgon',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Gorgon}}{{subtitle=Creature}}Specs=[Gorgon,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Animal (1)}}{{AC=2}}{{Alignment=Neutral}}{{Move=12}}{{Hit Dice=8}}{{THAC0=13}}{{Attack=2d6 gore with horns, and breath weapon}}{{Languages=None}}{{Size=L, 8ft tall}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Breath Weapon=4 times per day, cone 20ft at end, up to 60ft long, save vs. petrification}}{{Section4=**Special Advantages**}}{{Keen senses=Sense of smell is acute and are 75% likely to track their victim successfully.}}RaceData=[w:Gorgon, align:N, cattr:int=1|mov=12|size=L|hd=8|thac0=13|attk1=2d6:Gore with horns:0:P, ns:1],[cl:PW,w:Gorgon Breath,sp:0,pd:4]{{Section9=**Description**}}{{desc=Gorgons are fierce, bull-like beasts who make their lairs in dreary caverns or the fastness of a wilderness. They are aggressive by nature and usually attack any creature or person they encounter.\nMonstrous black bulls, gorgons have hides of thick metal scales. Their breath is a noxious vapor that billows forth in great puffs from their wide, bull nostrils. Gorgons walk on two hooves, when necessary, but usually assume a four-hoofed stance. Despite their great size, they can move through even heavy forests with incredible speed, for they simply trample bushes and splinter smaller trees. Gorgons speak no languages but let out a roar of anger whenever they encounter other beings.}}{{desc1=**Combat:** Four times per day gorgons can make a breath weapon attack (their preferred means of attack). Their breath shoots forth in a truncated cone, five feet wide at the base and 20 feet wide at its end, with a maximum range of 60 feet. Any creature caught in this cone must roll a saving throw vs. petrification. Those who fail are turned to stone immediately! The awareness of gorgons extends into the Astral and Ethereal planes, as do the effects of their breath weapon.\nIf necessary (i.e., their breath weapon fails) gorgons will engage in melee, charging forward to deliver a vicious head butt or horn gore. Gorgons fight with unrestricted ferocity, slashing and trampling all who challenge them until they themselves are slain.\nTheir sense of smell is acute and once they get on the trail gorgons are 75% likely to track their victim successfully. Once their victim is in sight, gorgons let out a scream of rage and then charge. Unless somehow evaded, a gorgon will pursue tirelessly, for days if necessary, until the prey either drops from exhaustion or is caught in the gorgon\'s deadly breath.}}'},
{name:'Greater-Basilisk',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Basilisk}}{{subtitle=Creature}}Specs=[Basilisk-Greater,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Low (5:7)}}{{AC=2}}{{Alignment=Neutral}}{{Move=6}}{{Hit Dice=10}}{{THAC0=11}}{{Attack=2 x Claw 1d6, 1 x Bite 2d8}}{{Languages=None known}}{{Size=L, 12ft long}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=**Gaze:** Its gaze turns those who meet eyes to stone. Attacking or surprised opponents automatically meet its gaze and must save vs. petrification each round they attack, unless from the rear. Can look "in general direction" to hit at -2 \\amp get 20% chance of meeting gaze. Or avert \\amp attack blindfolded for -4 to-hit}}{{Section4=**Special Advantages**}}{{Poison Claws=Claws have poison tyle K with save at +4 or take 5HP damage in 2d4 rounds}}{{Poison Breath=If within 5ft of mouth, save vs. poison at +2 or die}}{{Surprise=Only surprised on a 1}}{{Section6=**Special Disadvantages**}}{{Reflections=If lit, and can see its own reflection, can petrify itself}}RaceData=[w:Greater Basilisk, align:N, cattr:int=5:7|mov=6|ac=2|size=L|hd=10r2|thac0=11|attk1=1d6:Claw:0:S|attk2=1d6:Claw:0:S|attk3=2d8:Bite:1:P|dmgmsg=Claws have Type K poison - **save at +4 bonus** or \\lbrak;take 5HP in 2d4 rounds\\rbrak;\\lpar;!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who has been struck?¦token_id}¦Poison K_Feeling Wrong_¦\\amp#91;\\lbrak;2d4\\rbrak;\\amp#93;¦-1¦Somethings wrong... not quite sure what...¦skull\\rpar;. If within 5ft of mouth **save vs. Poison at +2 or die from breath**. Gaze \\lbrak;Petrifies\\rbrak;\\lpar;!rounds ~~aoe `{selected¦token_id}¦cone¦feet¦0¦50¦50¦green¦true ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who is the unfortunate soul?¦token_id}¦Petrified¦99¦0¦Petrified by a Gaze Attack¦padlock\\rpar;. Those attacking without counter-measures must save every round,spattk:Petrification gaze attack,ns:1],[cl:PW,w:Petrification-Gaze-Attack,sp:0,pd:-1]{{Section9=**Description**}}{{desc=These reptilian monsters all posses a gaze that enables them to turn any fleshy creature to stone; their gaze extends into the Astral and Ethereal planes.\nThe greater basilisk is a larger cousin of the more common reptilian horror, the ordinary basilisk. These monsters are typically used to guard treasure.}}{{desc1=**Combat:** The monster attacks by raising its upper body, striking with sharp claws, and biting with its toothy maw. The claws carry Type K poison (saving throws vs. poison are made with a+4 bonus). Its foul breath is also poisonous, and all creatures, coming within 5 feet of its mouth, even if just for a moment, must roll successful saving throws vs. poison (with a+2 bonus) or die (check each round of exposure).\nEven if a polished reflector is used under good lighting conditions, the chance for a greater basilisk to see its own gaze and become petrified is only 10%, unless the reflector is within 10 feet of the creature. (While its gaze weapon is effective to 50 feet, the creature\'s oddly-shaped eyes are nearsighted and it cannot see its own gaze unless it is within 10 feet.)}}'},
+ {name:'Green-Dragon',type:'DragonRace',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}Specs=[Green-Dragon,DragonRace,2H,Red-Dragon]{{}}RaceData=[w:Green Dragon, cattr:int=11:12|mov=9|fly=30C|swim=9|ac=4-??1|hd=(13+??2)d8r1|mr=(v(^((??1-4);0);1)*(??1-2)*5)|cl=mu:green-dragon|lv=5+??1|thac0=7-??2|dmg=??1|size=G|attk1=1d8:Claw x 2 or Claw+Kick:0:S|attk2=2d10:Bite:0:P|attk3=2d8:Tail Swipe:0:B|attkmsg=Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$\\lbrak;Show the radius\\rbrak;\\lpar;!rounds ~~aoe `{selected¦token_id}¦arc180¦feet¦0¦\\lbrak;\\lbrak;`{selected¦age¦max}*8\\rbrak;\\rbrak;¦\\lbrak;\\lbrak;`{selected¦age¦max}*16\\rbrak;\\rbrak;¦black\\rpar; then up to \\lbrak;\\lbrak;`{selected¦age¦max}\\rbrak;\\rbrak; opponents in the area take damage and Save vs. Petrification with the penalty shown below or be \\lbrak;Stunned\\rbrak;\\lpar;!rounds ~~target area¦`{selected¦token_id}¦\\amp#64;{target¦Select the stunned creature¦token_id}¦Stunned¦\\lbrak;\\amp#91;1+1d4\\amp#93;\\rbrak;¦-1¦Stunned by a dragon tail slap¦back-pain\\rpar; for 1d4+1 rounds., spattk:*Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*, spdef:Magic resistance @{selected|monstermagicresist}% and immune to gasses from birth, ns:=11],[cl:PW,w:Green-Dragon-Breath,pd:-1,sp:1],[cl:PW,age:4,w:MU-Water-Breathing,pd:-1,sp:1],[cl:PW,age:6,w:MU-Suggestion,pd:1,sp:1],[cl:PW,w:PR-Warp-Wood,age:7,pd:3,sp:1],[cl:PW,w:MU-Plant-Growth,age:8,pd:1,sp:1],[cl:PW,w:PR-Entangle,age:9,pd:1,sp:1],[cl:PW,w:PR-Pass-Without-Trace,age:11,pd:3,sp:1]{{}}%{Race-DB-Creatures|Red-Dragon}{{title=Green}}{{Intelligence=Very intelligent (11-12)}}{{AC=Varies with age, adult green dragon is AC -2}}{{Move=9, FL 30(C), Sw 9}}{{Hit Dice=Varies with age, adult green dragon is 15 HD}}{{THAC0=Varies with age, adult green dragon is 5}}{{Section1=**Attacks:** Damage bonus varies with age, adult green dragon is +6. 2 x Claws for 1d8 HP each, possibly with 1 or 2 kicks for 1d8 each, bite for 2d10, and tail slap for 2d8 and possible *stun* within an area varying with age. Several other attacks possible - see *Powers*}}{{Languages=*Green Dragon* and *Evil Dragon Common*, and 12% of hatchlings (+5% per age level) can perform universal communication with any intelligent creature}}{{Breath Weapon=A cloud of poisonous chlorine gas, extending 50ft from the dragon, 40ft wide and 30ft high. Damage varies by age from 2d6+1 to 24d6+12. Save vs. Breath Weapon to take half damage}}{{Spell Casting=Knows a number of random wizard spells cast at a level from 9 to 17 varying with age. All spells are cast at a speed of 1 segment regardless of the spell}}{{Spell-like Powers=*Juvenile* dragons learn *water breathing* at will, *Adults* can do *Suggestion* once a day, a *Mature Adult* dragon gains *Warp Wood* 3 x a day, *Old* dragons gain *Plant Growth* x 1 per day, and *Wyrms* gain *Pass without Trace* x 3 per day}}{{desc8=**Green Dragons:** Green dragons are bad tempered, mean, cruel, and rude. They hate goodness and good-aligned creatures. They love intrigue and seek to enslave other woodland creatures, killing those who cannot be controlled or intimidated.\nA hatchling green dragon\'s scales are thin, very small, and a deep shade of green that appears nearly black. As the dragon ages, the scales grow larger and become lighter, turning shades of forest, emerald, and olive green, which helps it blend in with its wooded surroundings. A green dragon\'s scales never become as thick as other dragons\', remaining smooth and flexible.\nGreen dragons are found in sub-tropical and temperate forests, the older the forest and bigger the trees, the better. The sights and smells of the woods are pleasing to the dragon, and it considers the entire forest or woods its territory. Sometimes the dragon will enter into a relationship with other evil forest-dwelling creatures, which keep the dragon informed about what is going on in the forest and surrounding area in exchange for their lives. If a green dragon lives in a forest on a hillside, it will seek to enslave hill giants, which the dragon considers its greatest enemy. A green dragon makes its lair in underground chambers far beneath its forest.\nThe majority of green dragons encountered will be alone. However, when a mated pair of dragons and their young are encountered, the female will leap to the attack. The male will take the young to a place of safety before joining the fight. The parents are extremely protective of their young, despite their evil nature, and will sacrifice their own lives to save their offspring.}}{{desc9=**Combat:** Green dragons initiate fights with little or no provocation, picking on creatures of any size. If the target creature intrigues the dragon or appears to be difficult to deal with, the dragon will stalk the creature, using its environment for cover, until it determines the best time to strike and the most appropriate tactics to use. If the target appears formidable, the dragon will first attack with its breath weapon, magical abilities, and spells. However, if the target appears weak, the dragon will make its presence known quickly for it enjoys evoking terror in its targets. When the dragon has tired of this game, it will bring down the creature using its physical attacks so the fight lasts longer and the creature\'s agony is prolonged.\nSometimes, the dragon elects to control a creature, such as a human or demi-human, through intimidation and suggestion. Green dragons like to question men, especially adventurers, to learn more about their society, abilities, what is going on in the countryside, and if there is treasure nearby.}}'},
{name:'Gremlin',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Gremlin}}RaceData=[w:Gremlin, align:CE, cattr:int=11:12|mov=6|fly=18 (B)|ac=4|size=T|hd=4r3|thac0=17|attk1=1d4:Bite:0:P|mr=25|mw=+1|attkmsg=Only hit by magical weapons. 25% magic resistance, spdef:Only hit by magical weapons. 25% magic resistance]{{subtitle=Creature}}{{Section=**Attributes**}}{{Intelligence=Very (11 or 12)}}{{AC=4}}{{Alignment=Chaotic Evil}}{{Move=6, Fl 18(B)}}{{Hit Dice=4}}{{THAC0=17}}{{Attack=Bite for 1d4}}{{Languages=*Gremlin*. May also understand other languages, but never known to speak them}}{{Size=T, 18ins tall}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Surprise=}}{{Magic Resistance=25% magic resistance}}{{Magical Weapons To Hit=Magically enchanted weapons are required to hit Gremlins}}{{Section6=**Special Disadvantages**}}{{Section7=**Avoid Melee:** Gremlins are worthless in real combat; at every opportunity they flee rather than fight face-to-face. In melee, gremlins have only their weak bite for attacks (1d4 points of damage). They can fly quite well (MC B), but they usually stay close to the ground or well over their opponents\' heads, where they are difficult to reach.}}Specs=[Gremlin,CreatureRace,0H,Creature]{{Section8=**Description**}}{{desc8=Often mistaken for imps, gremlins are small, winged goblinoids. There are many varieties of gremlins, and most are chaotic and mischievous. Their skin color ranges from brown to black to gray, frequently in a mottled blend. Their ears are very large and pointed, giving them a 65% chance to hear noise. A pair of bat-like wings enables them to fly or glide. Gremlins never wear clothing or ornamentation.}}{{desc9=**Combat:** What gremlins like to do best is cause trouble. The angrier their victims are, the happier the gremlins. Their favorite tactic is to set up a trap to humiliate opponents and maybe even cause them to damage a valued possession or hurt a loved one. If the opponent gets hurt as well, that\'s just fine. For example, the gremlin may set a trip wire across a doorway that pulls down a fragile vase onto the victim\'s head. A building infested by a gremlin pack can be reduced to shambles in a single night.}}'},
{name:'Gremlin-Fremlin',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Fremlin}{{subtitle=Creature}}RaceData=[w:Fremlin]{{}}Specs=[Fremlin,CreatureRace,0H,Fremlin]{{}}'},
{name:'Gremlin-Galtrit',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Galtrit}{{}}RaceData=[w:Galtrit]{{}}Specs=[Galtrit,CreatureRace,0H,Galtrit]{{}}'},
@@ -1026,7 +1125,15 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Half-Ogre-Veteran',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Veteran}}RaceData=[w:Half-Ogre Veteran, cattr:hd=5+3r2|thac0=15]{{}}%{Race-DB-Creatures|Half-Ogre}{{}}Specs=[Half-Ogre Veteran,CreatureRace,0H,Half-Ogre]{{Hit Dice=5+3}}{{THAC0=15}}{{desc=**Half-Ogre Veteran:** For every five half-ogres in an encounter, there is an additional veteran with 5+3 Hit Dice.}}'},
{name:'Half-Ogre-no-armour',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Half-Ogre no armour, cattr:ac=9]{{}}%{Race-DB-Creatures|Half-Ogre}{{}}Specs=[Half-Ogre no armour,CreatureRace,0H,Half-Ogre]{{AC=9, can equip with armour to improve AC}}'},
{name:'Heavy-War-Horse',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Heavy War Horse, cattr:mov=15|hd=3+3r5|attk1=1d3:Bite:0:P|attk2=1d8:Left Hoof:0:B|attk3=1d8:Right Hoof:0:B]{{}}Specs=[Heavy War Horse,CreatureRace,0H,Horse]{{}}%{Race-DB-Creatures|Horse}{{name=(Heavy War)}}{{Move=15}}{{Attacks=Bite for 1d3, 2 x Hooves for 1d8 each}}{{desc8=**Heavy War Horse:** Warhorses are bred and trained to the lance, the spear, and the sword. They have higher morale than other horses, and are not as skittish about sudden movements and loud noises. The choice of knights and cavalry, these are the pinnacle of military horses. There are three varieties; heavy, medium and light.\n*Heavy war horses* are similar to draft animals. Large and muscular, they are relatively slow. Their size and powerful legs allow them to be armored in plate, and to carry a warrior in plate, as easily as a pony carries saddle bags. A good heavy war horse, fully trained, costs 400 or more gold pieces.}}{{desc9=**Combat:** War horses will fight independently of the rider on the second and succeeding rounds of a melee. They attack three-times per round by kicking with their front hooves and biting.\n*War Horses* are specially trained, and are accustomed to loud noises, strange smells, fire, or sudden movements, panicing only 10% of the time.}}'},
+ {name:'Hell-Hound-4HD',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Hell Hound}}{{name=4HD}}RaceData=[w:Hell Hound 4HD, align:LE, ac:none, weaps:none, cattr:int=5:7|mov=12|ac=4|hd=4r3|thac0=17|size=M|attk1=1d10:Bite:0:B|attkmsg=Remember immune to fire; keen hearing so only surprised on 1 or 2; can see hidden or invisible creatures 50% of the time|dmgmsg=If rolled a natural 20 then do Fire Breath damage of \\lbrak;\\lbrak;@{selected¦hitdice}\\rbrak;\\rbrak; HP as well \\lpar;save vs. breath to halve\\rpar;, spattk:Fire Breath as power. Stealth means opponents get -5 penalty on surprise, spdef:Immune to fire. Only surprised on 1 or 2. See invisible or hidden creatures 50% of the time, ns:1],[cl:PW,w:Hell-Hound-Breath,pd:-1,sp:0]{{subtitle=Creature}}Specs=[Hell-Hound,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Low (5-7)}}{{AC=4 is natural AC. Do not wear armour}}{{Alignment=Lawful Evil}}{{Move=12}}{{Hit Dice=4HD}}{{THAC0=17}}{{Section1=**Attacks:**}}{{Bite=for 1d10 HP damage}}{{Fire Breath=Fiery breath out to 10yds for damage equal to number of Hit Dice. On a natural 20, does both bite \\amp breath damage}}{{Languages=The baying sounds it makes have an eerie, hollow tone that send a shiver through any who hear them. While normally stealthy, when pursuing fleeing prey the hounds might bay}}{{Size=M}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Fire Breath=A 10 yard long bolt of fire which does damage equal to the number of Hit Dice of the Hell Hound}}{{Section4=**Special Advantages**}}{{Immunity=Immunity to fire of all types}}{{Stealthy=Opponents get -5 penalty on surprise when hell hounds stalk them.}}{{Exceptional Hearing=Hell hounds are only surprised on a 1 or 2 on a d10}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=Hell hounds are fire-breathing canines from another plane of existence brought here in the service of evil beings.\nA hell hound resembles a large hound with rust-red or red-brown fur and red, glowing eyes. The markings, teeth, and tongue are soot black. It stands two to three feet high at the shoulder, and has a distinct odor of smoke and sulfur.\nHell hounds are native to those extradimensional planes notable for their hot, fiery landscapes. There they roam in packs of 2d20 beasts. The hell hounds on the Prime Material plane are summoned there to serve the needs of evil creatures. Most of them later escape to the wild.\nHell hounds cause more forest fires than any other creature except for humanoids. Hell hounds have their uses, though. Because of their ability to easily detect hidden or invisible creatures, hell hounds make excellent watch dogs, especially for intelligent monsters such as fire giants.}}{{desc9=**Combat:** Hell hounds are clever hunters that operate in packs of 2d20 beasts. Each pack is led by a 7-Hit Die hell hound. The leader drives off other 7 HD rivals, who form their own packs. They move with great stealth, imposing a -5 penalty to opponents\' surprise rolls. One or two of the pack sneak up on a quarry while the others form a ring around it. The first hell hound then springs from ambush, attacks the nearest victim, and attempts to drive the others toward the rest of the pack. If the prey does not run away, the rest of the pack closes in within 1d4+2 rounds. \nHell hounds attack first by breathing fire at an opponent up to 10 yards away. The hell hound then attacks with its teeth. If the hell hound rolls a natural 20 on its attack roll, it grabs a victim in its jaws and breathes fire on the victim.}}'},
+ {name:'Hell-Hound-5HD',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Hell Hound 5HD, cattr:hd=5r3|thac0=15]{{}}Specs=[Hell-Hound-5HD,CreatureRace,0H,Hell-Hound-4HD]%{Race-DB-Creatures|Hell-Hound-4HD}{{}}{{name=5HD}}{{Hit Dice=5HD}}{{THAC0=15}}'},
+ {name:'Hell-Hound-6HD',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Hell Hound 6HD, cattr:hd=6r3|thac0=15]{{}}Specs=[Hell-Hound-6HD,CreatureRace,0H,Hell-Hound-4HD]%{Race-DB-Creatures|Hell-Hound-4HD}{{}}{{name=6HD}}{{Hit Dice=6HD}}{{THAC0=15}}'},
+ {name:'Hell-Hound-7HD',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Hell Hound 7HD, cattr:hd=7r3|thac0=13]{{}}Specs=[Hell-Hound-7HD,CreatureRace,0H,Hell-Hound-4HD]%{Race-DB-Creatures|Hell-Hound-4HD}{{}}{{name=7HD}}{{Hit Dice=7HD}}{{THAC0=13}}'},
{name:'Heway-Snake',type:'CreatureRace',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Heway Snake, cattr:int=5:7|mov=12|swim=6|ac=7|hd=1+3r4|thac0=19| size=M| attk1=1d3:Bite:0:P|attkmsg=Leave poison in near-by water. Creatures drinking water are \\lbrak;poisoned\\rbrak;\\lpar;!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who is the Unfortunate Victim?¦token_id}¦Heway Poison_Not quite right¦\\amp#91;\\lbrak;3d6\\rbrak;\\amp#93;¦-1¦That bite was quite painful. Should I see a Cleric?¦stopwatch\\rpar;. **Don\'t save now!** Save when the effect message pops up in a few rounds - that way the surprise is maintained! This poison inflicts damage and paralyses in 3d6 minutes. Successful save just does less damage. **Remember** hypnotic stare power., spattk:Heway poisons near-by water which poisons creatures that drink it, spdef:Hypnotic stare power, ns:1],[cl:PW,w:Hypnosis,sp:1,pd:-1]{{}}Specs=[Poison Snake,CreatureRace,0H,Poison Snake 1-4]{{}}%{Race-DB-Creatures|Poison Snake 1-4}{{title=Heway Snake}}{{Intelligence=Low (5-7)}}{{AC=7}}{{Move=12, Sw 6}}{{Hit Dice=1+3}}{{THAC0=19}}{{Attacks=Bite for 1d3HP damage. Poisoned water near-by}}{{Size=M 12ft long}}{{Section5=**Poison:** Heways poison a near-by water source with a poison which does damage and paralyses\n**Hypnosis:** Powerful hypnosis can charm creatures which are then taken back to the Heway\'s lair and are willingly consumed}}{{desc9=**Combat:** These intelligent snakes have slimy, poisonous skins that they use to foul wells and oases. After swimming in a body of water for several hours and releasing its poison, it slinks off to wait for its prey to arrive. A creature drinking water poisoned by a heway must make a successful saving throw vs. poison at +2 or suffer 30 points damage within 3d6 minutes and be paralyzed for 1d6 hours. Creatures that make their saving throws suffer 15 points of damage. Even animals that survive the initial effects are often\ndoomed to die of dehydration.\nMany humans and animals attack heways on sight, but it can defend itself with its hypnotic stare, which has a powerful effect; any creature failing a saving throw vs. paralyzation will follow the heway to its lair and allow itself to be devoured. The heway sometimes uses this stare simply to immobilize a menacing creature. It then leaves the area while the hypnotized creature remains stationary for 1d6 turns.\nHeway are innate cowards and avoid contact with other animals. It is a weak fighter, its bite is not venomous, and its jaws are weak. Its preferred food is small animal carrion. Simply touching heway skin has no effect; the poison must be ingested.}}'},
+ {name:'Hill-Giant-AC0',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Hill Giant AC0,cattr:ac=0]{{}}Specs=[Hill-Giant-AC0,CreatureRace,2H,Hill-Giant-AC3]{{}}%{Race-DB-Creatures|Hill-Giant-AC3}{{name= AC0}}{{AC=Wearing very rare Hill Giant metal armour, so AC0}}{{desc8=Hill giants\' natural Armor Class is 5. Most wear crudely-sewn animal hides, which are the equivalent of leather armor, giving them AC3. Only a few (5%) of the giants fashion metal armor from the armor of men they have defeated. These giants have an Armor Class of 0.}}'},
+ {name:'Hill-Giant-AC3',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=Hill }}{{title=Giant}}RaceData=[w:Hill Giant AC3, align:CE, ac:none, cattr:int=5:7|mov=12|ac=3|hd=12+1d2|thac0=9|tohit=+3|dmg=+7|size=H|attk1=1d6:Fist:0:B, spdef:Can catch rocks hurled at them 30% of the time, ns:1],[cl:WP,prime:Hill-Giant-Club,items:HG-Rock:2d4]{{subtitle=Creature}}Specs=[Hill-Giant-AC3,CreatureRace,2H,Creature]{{Section=**Attributes**}}{{Intelligence=Low (5-7)}}{{AC=3 from crude leather armour. Natural AC is 5}}{{Alignment=Chaotic Evil}}{{Move=12}}{{Hit Dice=12+2 HD}}{{THAC0=9}}{{Section1=**Attacks:** +3 on ToHit rolls from strength. 1 x Fist for 1d6 HP damage, or using a Hill Giant Club for 2d6 plus strength bonus of +7. Throw rocks 3 to 200 yards doing 2d8 damage}}{{Languages=*Hill Giant* and *Giant Common*}}{{Size=H, 16ft tall}}{{Life Expectancy=About 200 years}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc7=**Hill giants:** are selfish, cunning brutes who survive through hunting and by terrorizing and raiding nearby communities. Despite their low intelligence, they are capable fighters. \nHill giants are oddly simian and barbaric in appearance, with overly long arms, stooped shoulders, and low foreheads. Even though they are the smallest of the giants, their limbs are more muscular and massive than those of the other giant races. Females have the same builds as males. Their skin color ranges from a light tan to a deep ruddy brown. Their hair is brown or black, and their eyes are black.\nLike other races of giants, hill giants carry their belongings with them in huge hide sacks. A typical hill giant\'s bag will contain 2-8 (2d4) throwing rocks, the giant\'s wealth, and 1-8 additional common items.}}{{desc8=Hill giants\' Armor Class is 3 when they wear crudely-sewn animal hides, which are the equivalent of leather armor. Nearly all hill giants wear these hides, which are a symbol of esteem in some hill giant communities -- the more hides a giant has, the more large kills to his credit.}}{{desc9=**Combat:** Hill giants prefer to fight their opponents from high rocky outcroppings where they can pelt their targets with rocks and boulders while limiting the risks posed to themselves.\nHill giants\' favorite weapons are oversized clubs which do 2-12 +7 points of damage (double the damage of a man-sized club plus their strength bonus). They hurl rocks for 2-16 (2d8) points of damage. Their targets for such attacks must be between 3 and 200 yards away from the giant. They can catch rocks or other similar missiles 30% of the time.}}'},
+ {name:'Hill-Giant-AC5',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Hill Giant AC5,cattr:ac=5|mov=15]{{}}Specs=[Hill-Giant-AC5,CreatureRace,2H,Hill-Giant-AC3]{{}}%{Race-DB-Creatures|Hill-Giant-AC3}{{name= AC5}}{{AC=Not wearing any armour, so natural AC of 5}}{{desc8=Hill giants\' natural Armor Class is 5, when not wearing any armour. This is rare, as most wear crudely-sewn animal hides, which are the equivalent of leather armor.}}'},
+ {name:'Hill-Giant-Juvenile',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Hill Giant Juvenile,cattr:ac=5|hd=4+1r5|tohit=+2|dmg=+2|attk1=1d10,Fist,0,B,ns:=1],[cl:WP,prime:Ogre-Club+0]{{}}Specs=[Hill-Giant-Juvenile,CreatureRace,2H,Hill-Giant-AC3]{{}}%{Race-DB-Creatures|Hill-Giant-AC3}{{name= Juvenile}}{{AC=Not wearing any armour, so natural AC of 5}}{{desc8=Hill giants\' natural Armor Class is 5, when not wearing any armour. Juveniles have not yet made their kills to source the leather for armour}}{{desc9=**Combat:** Hill giants prefer to fight their opponents from high rocky outcroppings where they can pelt their targets with rocks and boulders while limiting the risks posed to themselves.\nJuvenile hill giants have hit dice, damage, and attack rolls equal to that of an ogre. Their primary weapon is an Ogre Club (doing 2d8+2 damage) and they do not hurl rocks yet.}}'},
{name:'Hippogriff',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Hippogriff}}{{subtitle=Creature}}RaceData=[w:Hippogriff, align:N, cattr:int=2:4|mov=18|fly=36(C/D)|ac=5|size=L|hd=3+3|thac0=17|attk1=1d6:Claw1:0:S|attk2=1d6:Claw2:0:S|attk3=1d10:Beak:1:P]{{Section=**Attributes**}}{{Intelligence=Semi- (2 to 4)}}{{AC=5}}{{Alignment=Neutral}}{{Move=18, FL36 (C,D)}}{{Hit Dice=3+3}}{{THAC0=17}}{{Attacks=2 x Claws for 1d6 each, Beak for 1d10}}{{Languages=None}}{{Size=L, 10ft long}}{{Life Expectancy=Unknown}}{{Section1=**Powers**}}{{Section2=None}}{{Section3=**Special Advantages**}}{{Section4=**Flying Mount:** If a hippogriff is captured while still very young (under four months), it can be domesticated and trained to serve as a steed. It will probably have to be taught to fly.}}{{Section7=**Special Disadvantages**}}{{Section8=None}}Specs=[Hippogriff,CreatureRace,0H,Creature]{{Section9=**Description**}}{{desc8=Hippogriffs are flying monsters that have an equal likelihood to be predator, prey, or steed. The hippogriff is a monstrous hybrid of eagle and equine features. It has the ears, neck, mane, torso, and hind legs of a horse. The wings, forelegs, and face are those of an eagle. It is about the size of a light riding horse. A hippogriff may be colored russet, golden tan, or a variety of browns. The feathers are usually a different shade than the hide. The beak is ivory or golden yellow.}}{{desc9=**Combat:** The hippogriff attacks with its eagle-like claws and beak. Each claw can tear for 1d6 points of damage, while the scissor-like beak inflicts 1d10 points of damage.\nThey feed on whatever is available, whether greenery, fruits, or wildlife. Hippogriffs are able to attack fairly large prey, such as bison, but they do not prey on carnivores. The exception is humanoids. Hippogriffs may, in the absence of other meat, attack small groups of people. Bodies are then carried back to the nest to feed the others; this is where the victim\'s possessions usually spill out. Hippogriffs are clean monsters; they dispose of carcasses and other debris by carrying them downhill. They like clear, sparkly things like glass, crystals, and precious gems. Males may amass a small trove kept covered by brush. As a mating ritual, he arranges these in a display to entice mares.}}'},
{name:'Hippogriff-Baby-Foal',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Baby Foal}}RaceData=[w:Hippogriff Baby Foal, cattr:fly= |tohit=-4]{{subtitle=Creature}}%{Race-DB-Creatures|Hippogriff}{{Move=18}}{{Section8=**Immature Attacking:** Due to inexperience and lack of musculature, foals younger than 6 months old have a -4 penalty on their attack rolls}}Specs=[Hippogriff Baby Foal,CreatureRace,0H,Hippogriff]{{Section9=**Description**}}{{desc=**Baby Foal:** The foal is able to walk upon hatching. Its beak remains soft for the first two weeks; this enables the foal to nurse. Then its beak hardens and the hippogriff switches to regurgitated food from its mother. The colts learn to eat solid meat at four months, although they are clumsy killers (-4 penalty to attack rolls and damage)}}'},
{name:'Hippogriff-Young-Foal',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Baby Foal}}RaceData=[w:Hippogriff Young Foal, cattr:fly=18(D)|tohit=-2]{{subtitle=Creature}}%{Race-DB-Creatures|Hippogriff}{{Move=18, FL18 (D)}}{{Section4=**Flying Mount:** While foals captured early enough and trained can become flying mounts, this foal is already too old}}{{Section8=**Immature Attacking:** Due to inexperience and lack of musculature, young foals have a -2 penalty on their attack rolls}}Specs=[Hippogriff Young Foal,CreatureRace,0H,Hippogriff]{{Section9=**Description**}}{{desc=**Young Foal:** At six months they can fly (18, class D) and fight with a -2 penalty to attack rolls and damage. Yearlings are identical to adults, although they are unable to breed until they are three years old.}}'},
@@ -1078,8 +1185,8 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Leech-Throat',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Throat-Leech}{{}}RaceData=[w:Throat Leech]{{}}Specs=[Throat Leech,CreatureRace,0H,Throat-Leech]{{}}'},
{name:'Leopard',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Leopard}}RaceData=[w:Leopard, align:N, weaps:none, ac:none, spattk:Can leap upards by 20ft and forward by 25ft, spdef:Prey get a penalty of 3 on surprise and Leopard only suprised on a 1, cattr:int=2:4|mov=15|ac=6|hd=3+2r4|thac0=17|size=M|attk1=1d3:2 x Front Claws:0:S|attk2=1d6:Bite:0:P|attk3=1+1d4:2 x Rear Claw Rake:1:S|attkmsg=If both front claws successfully hit then both back claws can do rake attacks$$ $$Only valid if both front claws successfully hit. One attempted rake attack for each rear claw|dmgmsg=$$ $$Only valid if both front claws successfully hit]{{subtitle=Creature}}Specs=[Leopard,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Semi (2 to 4)}}{{AC=6}}{{Alignment=Neutral}}{{Move=15}}{{Hit Dice=3+2 HD}}{{THAC0=17}}{{Attacks=2 x 1d3 front claws, bite for 1d6. If both front claws hit, rake with 2 x rear claws is attempted for 1d4 each}}{{Size=M}}{{Life Expectancy=12 to 15 years in the wild}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Surprise=Only surprised on a 1, prey get a penalty of 3 on surprise rolls}}{{Leap=Can leap upwards 20ft and forward 25ft after a run-up, e.g. when chasing prey}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=The leopard is a graceful cat with a long body and relatively short legs. Its color varies from buff to tawny, and its spots are rosette shaped. Leopards prefer to leap on their prey, imposing a -3 on the surprise rolls of their victims.\nLeopards are solitary, inhabiting warm deserts, forest, plains, and mountains. They swim and climb well, and will often sit in treetops sunning themselves. Leopards will also drag their prey to safety in the treetops to devour in peace. The female bears 1-3 young, and cares for them for up to two years. If found in the lair, there is a 25% chance that there will be cubs there. The young have no effective attack.}}{{desc9=**Combat:** Leopards hunt both day and night preying on animals up to the size of large antelopes. A skilled predator, the leopard is often threatened by human incursions. In areas where it is hunted, it is nocturnal.}}'},
{name:'Leprechaun',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Leprechaun}}{{subtitle=Creature}}RaceData=[w:Leprechaun, align:N, ac:ring|cloak|protection|magicitem|miscellaneous, weaps:rod|ring|magicitem|miscellaneous, cattr:int=15:16|mov=15|ac=8|size=T|hd=1-3r3|hp=2:5|thac0=20|attkmsg=**Remember:** spells as powers *Improved Invisibility; polymorph other* \\lpar;objects only\\rpar;; *spectral force; ventriloquism;* and can grant 3 *wish*es but only in order to regain their treasure. Agreeing to ask for a 4th wish undoes the prior 3 and *teleports without error* the party 2d20 miles away, spattk:None - does not attack, spdef:Spells as powers *Improved Invisibility; polymorph other* \\lpar;objects only\\rpar;; *spectral force; ventriloquism;* and can grant 3 *wish*es but only in order to regain their treasure. Agreeing to ask for a 4th wish undoes the prior 3 and *teleports without error* the party 2d20 miles away. Never surprised, ns:6],[cl:PW,w:Detect New Construction,sp:0,pd:-1],[cl:PW,w:Improved Invisibility,sp:4,pd:-1],[cl:PW,w:Polymorph Other,sp:4,pd:-1],[cl:PW,w:Spectral Force,sp:3,pd:-1],[cl:PW,w:Ventriloquism,sp:1,pd:-1],[cl:PW,w:Wish,sp:10,pd:-1]{{Section=**Attributes**}}{{Intelligence=Exceptional (15 to 16)}}{{AC=8}}{{Alignment=Neutral}}{{Move=15}}{{Hit Dice=1-3}}{{Hit Points=2 to 5}}{{THAC0=20}}{{Attacks=Does not attack - instead turns invisible or runs away}}{{Languages=Many different languages - magical ability?}}{{Size=T, 2ft tall}}{{Life Expectancy=Unknown}}{{Section1=**Powers**}}{{Section2=**Magical Creatures:** spells as powers *Improved Invisibility; polymorph other* \\lpar;objects only\\rpar;; *spectral force; ventriloquism;* and can grant 3 *wish*es but only in order to regain their treasure. Agreeing to ask for a 4th wish undoes the prior 3 and *teleports without error* the party 2d20 miles away}}{{Section3=**Special Advantages**}}{{Surprise=Due to their keen ears, leprechauns are never surprised}}{{Infravision=60 feet, with no disadvantages in light}}{{Section7=**Special Disadvantages**}}{{Section8=None}}Specs=[Leprechaun,CreatureRace,0H,Creature]{{Section9=**Description**}}{{desc8=Leprechauns are diminutive folk who are found in fair, green lands and enjoy frolicking, working magic, and causing harmless mischief.\nRumored to be a cross between a species of halfling and a strong strain of pixie, leprechauns are about 2 feet tall. They have pointed ears, and their noses also come to a tapered point. About 30% of all male leprechauns have beards. Pointed shoes, brown or green breeches, green or gray coats, and either wide-brimmed or stocking caps are the preferred dress of the wee folk. Many leprechauns also enjoy smoking a pipe, usually a long-stemmed one.}}{{desc9=**Combat:** These fun-loving creatures of magical talent are by nature noncombative. They can become invisible at will, polymorph nonliving objects, create illusions (with full audio and olfactory effects), and use ventriloquism spells as often as they like. Their keen ears prevent them from ever being surprised. Being full of mischief, they often (75%) snatch valuable objects from adventurers, turn invisible and dash away. There is a 75% chance that the attempt is successful. If pursued closely, there is a 25% chance per turn of pursuit that the leprechaun drops the stolen goods. The chase never leads to the leprechaun\'s lair.\nIf caught or discovered in its lair (10% chance), the leprechaun attempts to mislead his captor into believing that he is giving over his treasure while he actually is duping the captor. It requires great care to actually obtain the leprechaun\'s treasure.\nIf an intruder secures this treasure, a leprechaun will bargain and beg to get it back. As a last desperate measure, he will grant the intruder three wishes (very limited), but only if the intruder gives over the treasure first. When this is done, the leprechaun will indeed grant the three wishes. After all three wishes, the leprechaun will flatter the intruder and declare that the three wishes were so well-phrased that he will give a fourth wish. If the fourth wish is pronounced, the leprechaun will cackle with glee, the results of all the wishes will be reversed, and the intruder plus his group will be teleported (no saving throw) to a random location 2d20 miles away.}}'},
- {name:'Lesser-Basilisk',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Basilisk}}{{subtitle=Creature}}Specs=[Basilisk,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Animal (1)}}{{AC=4}}{{Alignment=Neutral}}{{Move=6}}{{Hit Dice=6+1}}{{THAC0=15}}{{Attack=1d10 bite}}{{Languages=None known}}{{Size=M, 7ft long}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=**Gaze:** Its gaze turns those who meet eyes to stone. Attacking or surprised opponents automatically meet its gaze and must save vs. petrification each round they attack, unless from the rear. Can look "in general direction" to hit at -2 \\amp get 20% chance of meeting gaze. Or avert \\amp attack blindfolded for -4 to-hit}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages}}{{Reflections=If lit, and can see its own reflection, can petrify itself}}RaceData=[w:Lesser Basilisk, align:N, cattr:int=1|mov=6|ac=4|size=M|hd=6+1r3|thac0=15|attk1=1d10:Bite:0:P|attkmsg=Gaze \\lbrak;Petrifies\\rbrak;\\lpar;!rounds ~~aoe `{selected¦token_id}¦cone¦feet¦0¦50¦50¦green¦true ~~target single\\var;`{selected¦token_id}¦\\amp#64;{target¦Who is the unfortunate soul?¦token_id}¦Petrified¦99¦0¦Petrified by a Gaze Attack¦padlock\\rpar;. Those attacking without counter-measures must save every round,spattk:Petrification gaze attack,ns:1],[cl:PW,w:Petrification-Gaze-Attack,sp:0,pd:-1]{{Section9=**Description**}}{{desc=These reptilian monsters all posses a gaze that enables them to turn any fleshy creature to stone; their gaze extends into the Astral and Ethereal planes.\nAlthough it has eight legs, its sluggish metabolism allows only a slow movement rate. A basilisk is usually dull brown in color, with a yellowish underbelly. Its eyes glow pale green.}}{{desc1=**Combat:** While it has strong, toothy jaws, the basilisk\'s major weapon is its gaze. However, if its gaze is reflected, and it sees its own eyes, it will become petrified itself, but this requires light at least equal to bright torchlight and a good, smooth reflector. In the Astral plane its gaze kills; in the Ethereal plane it turns victims into ethereal stone. These will only be seen by those in the Ethereal plane or who can see ethereal objects.}}'},
- {name:'Lich',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Lich}}{{subtitle=Creature}}Specs=[Lich,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Supra-genius(19-20)}}{{AC=0}}{{Alignment=Any Evil}}{{Move=6}}{{Hit Dice=11+}}{{THAC0=9}}{{Attack=Touch does 1d10 damage and save vs. paralysis or be paralysed until *dispelled*}}{{Size=M, 6ft tall}}{{Life Expectancy=Already dead!}}{{Section2=**Powers**}}{{Section3=**Aura of Power:** The aura of magical power which surrounds a lich is so potent that any creature of fewer than 5 Hit Dice (or 5th level) which sees it must save vs. spell or flee in terror for 5-20 (5d4) rounds (use Power).}}{{Section6=**Special Advantages**}}{{Spell Use=The Lich is a wizard of the same level as it was in life (that is generally L18 or higher), and can use spells in the same way}}{{Attack Immunity=Only hit by magically enchanted weapons of +1 or better (full-damage), spells, or monsters with more than 6HD or magical properties}}{{Spell Immunity=Immune to *charm, sleep, enfeeblement, polymorph, cold, electricity* or *death* spells}}{{Infravision=No need for light (dead eyes) so can "sense" normally in absolute darkness}}RaceData=[w:Lich, align:any, cattr:int=19:20|mov=6|ac=0|size=M|hd=11r3|cl=MU:wizard|lv=18|thac0=9|attk1=1d10:Touch:0:B|dmgmsg=On successful hit opponents save vs. paralysation or are \\lbrak;paralysed until *dispelled*\\rbrak;\\lpar;!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who\'s the Victim?¦token_id}¦Paralysation¦99¦0¦Paralysed by a Lich until dispelled in some way¦padlock\\rpar;. Remember immune to sleep charm enfeeblement polymorph cold electricity insanity and death spells. +1 or better weapons spells or 6HD to hit and those seeing it from any distance suffer the *Lich Fear* power, spattk:Paralysation, spdef:+1 or better weapons; spells; or 6HD to hit. Seeing Lich save vs spell or suffer Lich Fear (power), ns:1],[cl:PW,w:Lich Fear,sp:0,pd:-1]{{Section9=**Description**}}{{desc=The lich is, perhaps, the single most powerful form of undead known to exist. They seek to further their own power at all costs and have little or no interest in the affairs of the living, except where those affairs interfere with their own.\nA lich greatly resembles a wight or mummy, being gaunt and skeletal in form. The creature\'s eye sockets are black and empty save for the fierce pinpoints of light which serve the lich as eyes. The lich can see with normal vision in even the darkest of environments but is unaffected by even the brightest light. An aura of cold and darkness radiates from the lich which makes it an ominous and fearsome sight. They\nwere originally wizards of at least 18th level.\nLiches are often (75%) garbed in the rich clothes of nobility. If not so attired, the lich will be found in the robes of its former profession. In either case, the clothes will be tattered and rotting with a 25% chance of being magical in some way.}}{{desc1=**Combat:** Although a lich will seldom engage in actual melee combat with those it considers enemies, it is more than capable of holding its own when forced into battle.\nThe aura of magical power which surrounds a lich is so potent that any creature of fewer than 5 Hit Dice (or 5th level) which sees it must save vs. spell or flee in terror for 5-20 (5d4) rounds.\nShould the lich elect to touch a living creature, its aura of absolute cold will inflict 1-10 points of damage. Further, the victim must save vs. paralysis or be utterly unable to move. This paralysis lasts until *dispelled* in some manner.\nPriests of at least 8th level can attempt to turn a lich, as can paladins of no less than 10th level. \nA lich is able to employ spells just as it did in life. It still requires the use of its spell books, magical components, and similar objects. It is important to note that most, if not all, liches have had a great deal of time in which to research and create new magical spells and objects.}}'},
+ {name:'Lesser-Basilisk',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Basilisk}}{{subtitle=Creature}}Specs=[Basilisk,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Animal (1)}}{{AC=4}}{{Alignment=Neutral}}{{Move=6}}{{Hit Dice=6+1}}{{THAC0=15}}{{Attack=1d10 bite}}{{Languages=None known}}{{Size=M, 7ft long}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=**Gaze:** Its gaze turns those who meet eyes to stone. Attacking or surprised opponents automatically meet its gaze and must save vs. petrification each round they attack, unless from the rear. Can look "in general direction" to hit at -2 \\amp get 20% chance of meeting gaze. Or avert \\amp attack blindfolded for -4 to-hit}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages}}{{Reflections=If lit, and can see its own reflection, can petrify itself}}RaceData=[w:Lesser Basilisk, align:N, cattr:int=1|mov=6|ac=4|size=M|hd=6+1r3|thac0=15|attk1=1d10:Bite:0:P|attkmsg=Gaze \\lbrak;Petrifies\\rbrak;\\lpar;!rounds ~~aoe `{selected¦token_id}¦cone¦feet¦0¦50¦50¦green¦true ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who is the unfortunate soul?¦token_id}¦Petrified¦99¦0¦Petrified by a Gaze Attack¦padlock\\rpar;. Those attacking without counter-measures must save every round,spattk:Petrification gaze attack,ns:1],[cl:PW,w:Petrification-Gaze-Attack,sp:0,pd:-1]{{Section9=**Description**}}{{desc=These reptilian monsters all posses a gaze that enables them to turn any fleshy creature to stone; their gaze extends into the Astral and Ethereal planes.\nAlthough it has eight legs, its sluggish metabolism allows only a slow movement rate. A basilisk is usually dull brown in color, with a yellowish underbelly. Its eyes glow pale green.}}{{desc1=**Combat:** While it has strong, toothy jaws, the basilisk\'s major weapon is its gaze. However, if its gaze is reflected, and it sees its own eyes, it will become petrified itself, but this requires light at least equal to bright torchlight and a good, smooth reflector. In the Astral plane its gaze kills; in the Ethereal plane it turns victims into ethereal stone. These will only be seen by those in the Ethereal plane or who can see ethereal objects.}}'},
+ {name:'Lich',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Lich}}{{subtitle=Creature}}Specs=[Lich,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Supra-genius(19-20)}}{{AC=0}}{{Alignment=Any Evil}}{{Move=6}}{{Hit Dice=11+}}{{THAC0=9}}{{Attack=Touch does 1d10 damage and save vs. paralysis or be paralysed until *dispelled*}}{{Size=M, 6ft tall}}{{Life Expectancy=Already dead!}}{{Section2=**Powers**}}{{Section3=**Aura of Power:** The aura of magical power which surrounds a lich is so potent that any creature of fewer than 5 Hit Dice (or 5th level) which sees it must save vs. spell or flee in terror for 5-20 (5d4) rounds (use Power).}}{{Section6=**Special Advantages**}}{{Spell Use=The Lich is a wizard of the same level as it was in life (that is generally L18 or higher), and can use spells in the same way}}{{Attack Immunity=Only hit by magically enchanted weapons of +1 or better (full-damage), spells, or monsters with more than 6HD or magical properties}}{{Spell Immunity=Immune to *charm, sleep, enfeeblement, polymorph, cold, electricity* or *death* spells}}{{Infravision=No need for light (dead eyes) so can "sense" normally in absolute darkness}}RaceData=[w:Lich, align:any, cattr:int=19:20|mov=6|ac=0|size=M|hd=11r3|cl=MU:wizard|lv=18|thac0=9|attk1=1d10:Touch:0:B|dmgmsg=On successful hit opponents save vs. paralysation or are \\lbrak;paralysed until *dispelled*\\rbrak;\\lpar;!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who\'s the Victim?¦token_id}¦Paralysation¦99¦0¦Paralysed by a Lich until dispelled in some way¦padlock\\rpar;. Remember immune to sleep charm enfeeblement polymorph cold electricity insanity and death spells. +1 or better weapons spells or 6HD to hit and those seeing it from any distance suffer the *Lich Fear* power, spattk:Paralysation, spdef:+1 or better weapons; spells; or 6HD to hit. Seeing Lich save vs spell or suffer Lich Fear (power), ns:1],[cl:PW,w:Lich Fear,sp:0,pd:-1],[cl:MU,lv:1,w:random|random|random|random|random|random|random|random|random|random],[cl:MU,lv:2,w:random|random|random|random|random|random|random|random|random|random],[cl:MU,lv:3,w:random|random|random|random|random|random|random|random|random|random],[cl:MU,lv:4,w:random|random|random|random|random|random|random|random|random|random],[cl:MU,lv:5,w:random|random|random|random|random|random|random|random|random|random],,[cl:MU,lv:6,w:random|random|random|random|random|random|random|random],[cl:MU,lv:7,w:random|random|random|random|random|random|random],[cl:MU,lv:8,w:random|random|random|random|random|random],[cl:MU,lv:9,w:random|random|random]{{Section9=**Description**}}{{desc=The lich is, perhaps, the single most powerful form of undead known to exist. They seek to further their own power at all costs and have little or no interest in the affairs of the living, except where those affairs interfere with their own.\nA lich greatly resembles a wight or mummy, being gaunt and skeletal in form. The creature\'s eye sockets are black and empty save for the fierce pinpoints of light which serve the lich as eyes. The lich can see with normal vision in even the darkest of environments but is unaffected by even the brightest light. An aura of cold and darkness radiates from the lich which makes it an ominous and fearsome sight. They\nwere originally wizards of at least 18th level.\nLiches are often (75%) garbed in the rich clothes of nobility. If not so attired, the lich will be found in the robes of its former profession. In either case, the clothes will be tattered and rotting with a 25% chance of being magical in some way.}}{{desc1=**Combat:** Although a lich will seldom engage in actual melee combat with those it considers enemies, it is more than capable of holding its own when forced into battle.\nThe aura of magical power which surrounds a lich is so potent that any creature of fewer than 5 Hit Dice (or 5th level) which sees it must save vs. spell or flee in terror for 5-20 (5d4) rounds.\nShould the lich elect to touch a living creature, its aura of absolute cold will inflict 1-10 points of damage. Further, the victim must save vs. paralysis or be utterly unable to move. This paralysis lasts until *dispelled* in some manner.\nPriests of at least 8th level can attempt to turn a lich, as can paladins of no less than 10th level. \nA lich is able to employ spells just as it did in life. It still requires the use of its spell books, magical components, and similar objects. It is important to note that most, if not all, liches have had a great deal of time in which to research and create new magical spells and objects.}}'},
{name:'Light-War-Horse',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Light War Horse, cattr:hd=2r5|attk1=1d4:Left Hoof:0:B|attk2=1d4:Right Hoof:0:B]{{}}Specs=[Light War Horse,CreatureRace,0H,Horse]{{}}%{Race-DB-Creatures|Horse}{{name=(Light War)}}{{Move=24}}{{Attacks=2 x Hooves for 1d4 each}}{{desc8=**Light War Horse:** Warhorses are bred and trained to the lance, the spear, and the sword. They have higher morale than other horses, and are not as skittish about sudden movements and loud noises. The choice of knights and cavalry, these are the pinnacle of military horses. There are three varieties; heavy, medium and light.\n*Light war horses* are the fastest of the breed. They can carry warriors in leather armor, but are rarely armored themselves. They make excellent mounts for raiding parties, light cavalry, and thieves. Light war horses cost 150 gp or more.}}{{desc9=**Combat:** War horses will fight independently of the rider on the second and succeeding rounds of a melee. Light War Horses attack twice per round by kicking with their front hooves.\n*War Horses* are specially trained, and are accustomed to loud noises, strange smells, fire, or sudden movements, panicing only 10% of the time.}}'},
{name:'Lion',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Lion}}RaceData=[w:Lion, align:N, weaps:none, ac:none, spattk:Can leap up to 30ft, spdef:Only surprised on a 1, cattr:int=2:4|mov=12|ac=5|hd=5+2r4|thac0=15|size=M|attk1=1d4:2 x Front Claws:0:S|attk2=1d10:Bite:0:P|attk3=1+1d6:2 x Rear Claw Rake:1:S|attkmsg=If both front claws successfully hit then both back claws can do rake attacks$$ $$Only valid if both front claws successfully hit. One attempted rake attack for each rear claw|dmgmsg=$$ $$Only valid if both front claws successfully hit]{{subtitle=Creature}}Specs=[Lion,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Semi (2 to 4)}}{{AC=Male 5 front, 6 rear, Female 6 all over}}{{Alignment=Neutral}}{{Move=12}}{{Hit Dice=5+2 HD}}{{THAC0=15}}{{Attacks=2 x 1d4 front claws, bite for 1d10. If both front claws hit, rake with 2 x rear claws is attempted}}{{Size=M}}{{Life Expectancy=12 to 16 years in the wild}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Surprise=Only surprised on a 1}}{{Leap=Can leap up to 30ft after a run-up, e.g. when chasing prey}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=Among the largest and most powerful of the great cats, lions have yellow or golden brown fur. The males are distinguished by their flowing manes. Since their senses are so keen, lions can only be surprised on a 1. All lions can leap as far as 30 feet.\nLions prefer warmer climates, thriving in deserts, jungles, grasslands, and swamps. They live and hunt in prides, and are extremely territorial. A pride usually consists of 1-3 males and 1-10 females. A lair will contain from 1-10 cubs which are 30%-60% grown. Cubs are unable to fight. Lions are poor climbers and dislike swimming.\nLions flourish only when the supply of game is adequate. Their size and strength have made them a favorite target of human hunters.}}{{desc9=**Combat:** Both male and female lions are fierce fighters. Lions hunt in prides, with females doing most of the actual hunting. Lions frequently kill animals the size of zebras or giraffes. Lionesses will cooperate when hunting, driving their prey into an ambush. They have been known to attack domestic livestock, but will almost never attack men.}}'},
{name:'Lizardman',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Lizardman}}{{subtitle=Creature}}RaceData=[w:Lizardman, align:N, weaps:any, ac:any, cattr:int=5:7|mov=6|swim=12|ac=5|size=M|hd=2+1r3|thac0=19|attk1=1d2:Claw1:0:S|attk2=1d2:Claw2:0:S|attk3=1d6:Bite:1:P]{{Section=**Attributes**}}{{Intelligence=Low (5 to 7)}}{{AC=5}}{{Alignment=Neutral}}{{Move=6, Sw 12}}{{Hit Dice=2+1}}{{Hit Points=}}{{THAC0=19}}{{Attacks=2 x claw for 1d2 \\amp a bite for 1d6. May use very crude weapons}}{{Languages=*Lizardman*}}{{Size=M, 7ft tall}}{{Life Expectancy=Unknown}}{{Section1=**Powers**}}{{Section2=None}}{{Section3=**Special Advantages**}}{{Section4=None}}{{Section7=**Special Disadvantages**}}{{Section8=None}}Specs=[Lizardman,CreatureRace,0H,Creature]{{Section9=**Description**}}{{desc8=Lizard men are savage, semi-aquatic, reptilian humanoids that live through scavenging, raiding, and, in less hostile areas, by fishing and gathering.\nAdult lizard men stand 6 to 7 feet tall, weighing 200 to 250 pounds. Skin tones range from dark green to gray to brown, and their scales give them a flecked appearance. Their tails average 3 to 4 feet long and are not prehensile. Males are nearly impossible to distinguish from females without close inspection. Lizard man garb is limited to strings of bones and other barbaric ornament.}}{{desc9=**Combat:** In combat, lizard men fight as unorganized individuals. If they have equality or an advantage over their opponents, they tend toward frontal assaults and massed rushes. When outnumbered, overmatched, or on their home ground, however, they become wily and ferocious opponents. Snares, sudden ambushes, and spoiling raids are favored tactics in these situations. While individually savage in melee, lizard men tend to be distracted by food (such as slain opponents) and by simple treasures, which may allow some of their quarry to escape. They occasionally take prisoners as slaves, for food, or to sacrifice in obscure tribal rites..}}'},
@@ -1145,7 +1252,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Orc-Leader',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Leader}}RaceData=[w:Orc Leader, cattr:hp=8|mov=9|ac=6|attk2=1d8:Second weapon:5:B]{{subtitle=Creature}}%{Race-DB-Creatures|Orc}{{AC=6 (preset)}}Specs=[Orc Leader,CreatureRace,0H,Orc]{{Hit Dice=1}}{{Hit Points=8}}{{desc=**Orc Leader:** For every thirty orcs encountered, there will be a leader and three assistants. These orcs will have 8 hit points each, being the meanest and strongest in the group.}}'},
{name:'Orc-Shaman-L5',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Shaman}}RaceData=[w:Orc Shaman L5, cattr:cl=pr:Shaman|lv=5|hd=3|hp=5:24|thac0=18]{{subtitle=Creature}}%{Race-DB-Creatures|Orc}{{AC=10 (can wear simple armour up to AC6 - add via menus)}}Specs=[Orc Shaman,CreatureRace,0H,Orc]{{Hit Dice=1d8+4d4}}{{THAC0=18}}{{Section3=}}{{Priest Spells=Maximum 5th Level Priest equivalent}}{{desc=**Orc Shaman:** For every 100 orcs encountered, there will be either a shaman (maximum 5th level priest) or a witch doctor (maximum 4th-level mage). Shamans and witch doctors gain an extra 1d4 hit points for each level above 1st and fight as a monster of 1 Hit Die for every two levels (round fractions up) of spell-casting ability (e.g., a 5th-level shaman has d8+4d4 hit points and fights as a 3 Hit Dice monster.)}}'},
{name:'Orc-Sub-Chief',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Sub-Chief}}RaceData=[w:Orc Sub-Chief, align:LE, cattr:hd=2|hp=11|mov=9|ac=4|dmg=+1|attk2=1d8:Second weapon:5:B, ns:1],[cl:PW,w:Follow the Standard,sp:0,pd:-1]{{subtitle=Creature}}%{Race-DB-Creatures|Orc}{{AC=4 (preset)}}Specs=[Orc Sub-Chief,CreatureRace,0H,Orc]{{Hit Dice=2}}{{Hit Points=11}}{{THAC0=19}}{{Attack=1d8 and by weapon (see description), +1 for strength}}{{Section3=**Follow the Standard: **If a subchief is present, there is a 40% chance the orcs will be fighting around a standard. The presence of this standard increases attack rolls and morale by +1 for all orcs within 60 yards.}}{{desc=If 150 orcs or more are encountered there will be the following additional figures with the band: a subchief and 3-18 guards, each with Armor Class 4, 11 hit points, and +1 damage due to Strength on all attacks.}}'},
- {name:'Orc-Witch-Doctor-L4',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Witch Doctor}}RaceData=[w:Orc Witch Doctor L4, cattr:int=8:9|cl=mu:wizard|lv=4|hd=2|hp=4:20|thac0=19]{{subtitle=Creature}}%{Race-DB-Creatures|Orc}{{AC=10 (can wear simple armour up to AC6 - add via menus)}Specs=[Orc Witch Doctor,CreatureRace,0H,Orc]{{Hit Dice=1d8+3d4}}{{THAC0=19}}{{Section3=}}{{Wizard Spells=Maximum 4th Level Wizard equivalent}}{{desc=**Orc Witch Doctor:** For every 100 orcs encountered, there will be either a shaman (maximum 5th level priest) or a witch doctor (maximum 4th-level mage). Shamans and witch doctors gain an extra 1d4 hit points for each level above 1st and fight as a monster of 1 Hit Die for every two levels (round fractions up) of spell-casting ability (e.g., a 5th-level shaman has d8+4d4 hit points and fights as a 3 Hit Dice monster.)}}'},
+ {name:'Orc-Witch-Doctor-L4',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Witch Doctor}}RaceData=[w:Orc Witch Doctor L4, cattr:int=8:9|cl=mu:wizard|lv=4|hd=2|hp=4:20|thac0=19,ns:1],[cl:MU,lv:1,w:random|random|random|random|random|random],[cl:MU,lv:2,w:random|random|random|random]{{subtitle=Creature}}%{Race-DB-Creatures|Orc}{{AC=10 (can wear simple armour up to AC6 - add via menus)}Specs=[Orc Witch Doctor,CreatureRace,0H,Orc]{{Hit Dice=1d8+3d4}}{{THAC0=19}}{{Section3=}}{{Wizard Spells=Maximum 4th Level Wizard equivalent}}{{desc=**Orc Witch Doctor:** For every 100 orcs encountered, there will be either a shaman (maximum 5th level priest) or a witch doctor (maximum 4th-level mage). Shamans and witch doctors gain an extra 1d4 hit points for each level above 1st and fight as a monster of 1 Hit Die for every two levels (round fractions up) of spell-casting ability (e.g., a 5th-level shaman has d8+4d4 hit points and fights as a 3 Hit Dice monster.)}}'},
{name:'Orc-ac6',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= AC6}}RaceData=[w:Orc AC6, align:LE, cattr:mov=9|ac=6]{{subtitle=Creature}}%{Race-DB-Creatures|Orc}{{AC=6 (preset)}}Specs=[Orc,CreatureRace,0H,Orc]{{}}'},
{name:'Osquip',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Osquip}}RaceData=[w:Osquip, align:N, weaps:none, ac:none, cattr:int=1|mov=12 Burrow ½|ac=7|hd=3+1|thac0=16|size=S|attk1=2d6:Bite:0:P, spattk:Can emerge quickly from their tunnels so opponents receive a -5 penalty to surprise rolls.]{{subtitle=Creature}}Specs=[Osquip,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Animal (1)}}{{AC=7}}{{Alignment=Neutral}}{{Move=12, Burrow ½}}{{Hit Dice=3+1 HD}}{{THAC0=16}}{{Attacks=Bite for 2d6HP damage}}{{Size=S, 2ft tall}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=**Trainable:** Osquips are difficult to domesticate, but jermlaine and a few wizards have succeeded by giving the creatures gems, for they collect shiny objects.}}{{Surprise=Can emerge quickly from their tunnels, and opponents receive a -5 penalty to surprise rolls.}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=The osquip is a multi-legged rodent the size of a small dog. It is hairless, with a huge head and large teeth. Most have six legs, but some (25%) have eight, and a few (5%) have 10. The creatures\' leathery hides are pale yellow in color.\nOsquips build small, carefully hidden tunnels, and their teeth are sharp enough to dig through stone.Osquip leather is soft and water-resistant, and their teeth can be used in digging magic. Osquips are not afraid of fire, but are poor swimmers (50% drown, 50% paddle with a movement rate of 1).}}{{desc9=**Combat:** If someone enters an area in which there are osquip tunnels, the creatures can emerge quickly, and opponents receive a -5 penalty to surprise rolls. The osquip are territorial and attack fearlessly and ferociously.}}'},
{name:'Ostrich',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Ostrich}}RaceData=[w:Ostrich, align:N, weaps:none, ac:none, cattr:int=1|mov=18|ac=7|hd=3r4|thac0=17|size=L|attk1=2d4:Kick:0:B]{{subtitle=Creature}}Specs=[Ostrich,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Animal (1)}}{{AC=7}}{{Alignment=Neutral}}{{Move=18, and can be up to 40 mph}}{{Hit Dice=3 HD}}{{THAC0=17}}{{Attacks=Kick for 2d4}}{{Size=L}}{{Life Expectancy=30 to 45 years in the wild, exceptionally up to 50}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=The ostrich is the largest and strongest of the flightless birds, standing 8 feet tall and weighing 300 pounds. The animal\'s small head and short, flat beak are perched atop a long, featherless neck. The ostrich is able to run at 40 miles per hour. If forced to fight, an ostrich uses its legs to deliver a kick that inflicts 2d4 points of damage.}}'},
@@ -1176,8 +1283,12 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Rat-Brown',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Brown-Rat}{{}}RaceData=[w:Brown Rat]{{}}Specs=[Brown Rat,CreatureRace,0H,Brown Rat]{{}}'},
{name:'Rat-Giant',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Giant-Rat}{{}}RaceData=[w:Giant Rat]{{}}Specs=[Giant Rat,CreatureRace,0H,Giant Rat]{{}}'},
{name:'Rat-Swarm-of',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Swarm-of-Rats}{{}}RaceData=[w:Swarm of Rats]{{}}Specs=[Swarm of Rats,CreatureRace,0H,Swarm of Rats]{{}}'},
+ {name:'Red-Dragon',type:'DragonRace',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Red}}{{name=Dragon}}Specs=[Red-Dragon,DragonRace,2H,Creature]{{subtitle=Dragon}}RaceData=[w:Red Dragon, query:What Age?|Hatchling%%1%%-6|Very Young%%2%%-4|Young%%3%%-2|Juvenile%%4%%0|Young Adult%%5%%1|Adult%%6%%2|Mature Adult%%7%%3|Old%%8%%4|Very Old%%9%%5|Venerable%%10%%6|Wyrm%%11%%7|Great Wyrm%%12%%8, align:CE, ac:none, cattr:int=15:16|mov=9|fly=30C|jump=3|ac=1-??1|age=??0:??1|hd=(15+??2)d8r1|mr=(v(^((??1-4);0);1)*??1*5)|cl=mu:red-dragon/pr:red-dragon|lv=8+??1/8+??1|spellsp=1|thac0=7-??2|dmg=??1|size=G|attk1=1d10:Claw x 2 or Claw+Kick:0:S|attk2=3d10:Bite:0:P|attk3=2d10:Tail Swipe:0:B|attkmsg=Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$\\lbrak;Show the radius\\rbrak;\\lpar;!rounds ~~aoe `{selected¦token_id}¦arc180¦feet¦0¦\\lbrak;\\lbrak;`{selected¦age¦max}*15\\rbrak;\\rbrak;¦\\lbrak;\\lbrak;`{selected¦age¦max}*30\\rbrak;\\rbrak;¦black\\rpar; then up to \\lbrak;\\lbrak;`{selected¦age¦max}\\rbrak;\\rbrak; opponents in the area take damage and Save vs. Petrification with the penalty shown below or be \\lbrak;Stunned\\rbrak;\\lpar;!rounds ~~target area¦`{selected¦token_id}¦\\amp#64;{target¦Select the stunned creature¦token_id}¦Stunned¦\\lbrak;\\amp#91;1+1d4\\amp#93;\\rbrak;¦-1¦Stunned by a dragon tail slap¦back-pain\\rpar; for 1d4+1 rounds., spattk:*Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*, spdef:Magic resistance @{selected|monstermagicresist}% and immune to fire, ns:11],[cl:PW,w:Red-Dragon-Breath,pd:-1,sp:1],[cl:PW,age:3,w:MU-Affect-Normal-Fires,pd:3,sp:1],[cl:PW,w:MU-Pyrotechnics,age:4,pd:3,sp:1],[cl:PW,w:PR-Heat-Metal,age:6,pd:1,sp:1],[cl:PW,w:MU-Suggestion,age:8,pd:1,sp:1],[cl:PW,w:MU-Hypnotism,age:9,pd:1,sp:1],[cl:PW,w:Detect-Gems-Kind+Number,age:10,pd:3,sp:1],[cl:PR,lv:1,w:],[cl:PR,lv:2,w:]{{Section=**Attributes**}}{{Intelligence=Exceptional (15-16)}}{{AC=Varies with age, adult red dragon is AC -5}}{{Alignment=Chaotic Evil}}{{Move=9, FL 30(C), Jump 3}}{{Hit Dice=Varies with age, adult red dragon is 17 HD}}{{THAC0=Varies with age, adult red dragon is 5}}{{Section1=**Attacks:** Damage bonus varies with age, adult red dragon is +6. 2 x Claws for 1d10 HP each, possibly with 1 or 2 kicks for 1d10 each, bite for 3d10, and tail slap for 2d10 and possible *stun* within an area varying with age. Several other attacks possible - see *Powers*}}{{Languages=*Red Dragon* and *Evil Dragon Common*, and 16% of hatchlings (+5% per age level) can perform universal communication with any intelligent creature}}{{Size=G, varies with age}}{{Life Expectancy=Possibly in excess of 1,000 years. Adult dragons are considered between 100 and 200 years old}}{{Section2=**Powers**}}{{Breath Weapon=A cone of flame, 90ft long, 5ft wide at dragon and spreading to 30ft wide. Damage varies by age from 2d10+1 to 24d10+12. Save vs. Breath Weapon to take half damage}}{{Fear=Can inspire fear in creatures that see the dragon: affect varies with the level / HD of the viewing creature.}}{{Spell Casting=Knows a number of random wizard and priest spells cast at a level from 9 to 20 varying with age. All spells are cast at a speed of 1 segment regardless of the spell}}{{Spell-like Powers=*Young* dragons can *Affect Normal Fires* x 3 per day, *Juveniles* gain *Pyrotechnics* x3 per day, *Adult* gains *Heat Metal* x 1 per day, *Old* gain *Suggestion* x 1 per day, *Very Old* gain *Hypnotism* x 1 per day, and *Venerable* gain *Detect Gems, Kind \\amp Number* x 3 per day}}{{Special Attacks=*Snatch, Plummet, Stall*, and *Wing Buffet*}}{{Section4=**Special Advantages**}}{{Section5=Its a Dragon!}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc7=Dragons are an ancient, winged reptilian race. They are known and feared for their size, physical prowess, and magical abilities. The oldest dragons are among the most powerful creatures in the world. \nMost dragons are identified by the color of their scales. All subspecies of dragons have 12 age categories, and gain more abilities and greater power as they age. Dragons range in size from several feet upon hatching to more than 100 feet, after they have attained the status of great wyrm. The exact size varies according to age and subspecies. A dragon\'s wingspan is about equal to its body length; 15-20% of a dragon\'s body length is neck.\nDragons, especially older ones, are generally solitary due to necessity and preference. They distance themselves from civilization, which they consider to be a petty and foolish mortal invention. Dragons are fearsome predators, but scavenge when necessary and can eat almost anything if they are hungry enough. A dragon\'s metabolism operates like a highly efficient furnace, making use of 95% of all the food the dragon eats. A dragon can also metabolize inorganic material, and some dragons have developed a taste for such fare.\nAlthough dragons\' goals and ideals vary among subspecies, all dragons are covetous. They like to hoard wealth, collecting mounds of coins and gathering as many gems, jewels, and magical items as possible. They find treasure pleasing to look at, and they bask in the radiance of the magical items. For a dragon, there is never enough treasure. Those with large hoards are loath to leave them for long, venturing out of their lairs only to patrol the immediate areas or to get food. Dragons like to make beds of their treasure, shaping nooks and mounds to fit their bodies. By the time they mature to the great wyrm stage, hundreds of gems and coins are imbedded in their hides.}}{{desc8=**Red Dragons:** Red dragons are the most covetous and greedy of all dragons, forever seeking to increase their treasure hoards. They are obsessed with their wealth and memorize an inventory accurate to the last copper. They are exceptionally vain and self confident, considering themselves superior not only to other dragons, but to all other life in general.\nRed dragons can be found on great hills or on soaring mountains. From a high perch they haughtily survey their territory, which they consider to be everything that can be seen from their position. They prefer to lair in large caves that extend deep into the earth.\nA red dragon enjoys its own company, not associating with other creatures, or even other red dragons, unless the dragon\'s aims can be furthered.}}{{desc9=**Combat:** Because red dragons are so confident, they never pause to appraise an adversary. When they notice a target they make a snap decision whether to attack, using one of many "perfect" strategies worked out ahead of time in the solitude of their lairs. If the creature appears small and insignificant, such as an unarmored man, the dragon will land to attack with its claws and bite, not wanting to obliterate the creature with its breath weapon, as any treasure might be consumed by the flames. However, if a red dragon encounters a group of armored men, it will use its breath weapon, special abilities, and spells (if it is old enough to have them) before landing.}}'},
{name:'Rhinoceros',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Rhinoceros}}{{subtitle=Creature}}Specs=[Rhinoceros,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Animal (1)}}{{AC=6}}{{Alignment=Neutral}}{{Move=12}}{{Hit Dice=8}}{{THAC0=13}}{{Attack=1 x Horn (2d4)}}{{Languages=None}}{{Size=L, 12ft long}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Knock Prone=A Critical Hit signifies the Rhino has knocked its opponent prone and it can trample them as a bonus attack}}{{Charge=Does double damage with its horn on a charge}}{{Trample=Can trample a prone opponent for 2 x 2d8}}{{Section6=**Special Disadvantages**}}{{Section7=None}}RaceData=[w:Rhinoceros, align:N, cattr:int=1|mov=12|ac=6|size=L|hd=8r3|thac0=13|ch=19|attk1=2d4:Horn:0:P|attk2=2*2d4:Charge:5:P|attk3=2d4:Trample:0:B|dmgmsg=If get a Critical Hit \\lpar;19 or better natural roll\\rpar; knock opponent prone and also get to Trample x 2 as a bonus attack,spattk:Charge for double horn damage. Trample prone opponents]{{Section9=**Description**}}{{desc=A massive herbivorous mammal that roams the savana. Very agressive to those that get too close and will not hesitate to attack anything it sees as a threat. Keep your distance and they will be fine}}{{desc1=**Combat:** Rhinos will not seek out fights, but if challenged they are deadly. They can trample prone opponents (2-8HP for left and again for right foot, To-Hit roll required for each) , and charge for double damage with their horn. Any natural 19 or 20 on the attack roll will knock an opponent prone and grant a bonus trample attack}}'},
{name:'Riding-Horse',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Riding Horse]{{}}Specs=[Riding Horse,CreatureRace,0H,Horse]{{}}%{Race-DB-Creatures|Horse}{{name=(Riding)}}{{desc8=**Riding Horse:** Riding horses are bred to the saddle. Perhaps the most common of all horses, they are ridden, worked, and raced by humans and demihumans alike. The price of a riding horse will vary, depending on its bloodlines, training, and appearance. Fast and agile, this breed is a good choice for personal transportation and general use.}}{{desc9=**Combat:** Riding horses fight only if cornered. They attack twice per round by kicking with their front hooves. They can be panicked by loud noises, strange smells, fire, or sudden movements 90% of the time.}}'},
+ {name:'Roper-10HD',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Roper}}{{name=10HD}}RaceData=[w:Roper 10HD, align:CE, weaps:roper-strand, ac:none, cattr:int=15:16|mov=3|ac=0|hd=10r2|thac0=11|size=L, spattk:Strength drain. Opponents suffer -2 penalty on surprise, spdef:Unaffected by lightning. Half damage from cold-based attacks. But -4 penalty to saves vs. fire, ns:1],[cl:WP,prime:roper-strand:6]{{subtitle=Creature}}Specs=[Roper 10HD,CreatureRace,2H,Creature]{{Section=**Attributes**}}{{Intelligence=Exceptional (15-16)}}{{AC=0}}{{Alignment=Chaotic Evil}}{{Move=3}}{{Hit Dice=10 HD}}{{THAC0=11}}{{Section1=**Attacks:** 6 tenticles, with 1 attack per round with a range 10 x (1d4+1). Save vs. Poison or lose half strength for 2d4 turns. Reels in at 10ft per round then bites for 5d4 HP}}{{Languages=None known}}{{Size=L, 9ft long}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Immunity=Unaffected by lightning attacks.}}{{Resistance=Only take half damage from cold-based attacks.}}{{Section6=**Special Disadvantages**}}{{Section7=**Fire based attacks:** Saves vs. fire and fire-based attacks are at a penalty of -4}}{{Section9=**Description**}}{{desc8=A roper resembles a rocky outcropping. The creature\'s hide is yellowish gray and rough, and its body very malleable. They are usually pillar-like in shape, 9 feet tall, about 3 feet in diameter at the base, and about 1 foot in diameter at the top. The roper has a single yellow eye, and a maw ringed with sharp teeth.\nHalfway up its body are small bumps which are the sources of the strands it fires at opponents (see below). Ropers have the same body temperature as their surroundings.\nRopers are not social and rarely cooperate with one another, though a group of them may be found in a good hunting spot. A group of ropers has been named a "cluster" by scholars with nothing better to do.\nRopers reproduce asexually by shedding some of their material in the form of a seed. Drawing nutrients from the cavern floor (and perhaps siphoning magical energies from deep within the earth), the infant roper grows to maturity in 2d4 weeks. Until that time has passed, the roper is indistinguishable from a boulder.\nRopers move using large, cilia-like appendages on their undersides, which also allow them to cling to walls and ceilings. They seldom leave the caverns, but may migrate to a new feeding ground when prey population drops too low in its current home. Migration usually occurs through underground tunnels, but when this is not possible, ropers travel late at night, sometimes giving rise to stories of walking stones.}}{{desc9=**Combat:** A roper can stand upright to resemble a stalagmite, lie on the ground to imitate a boulder, or even flatten itself to look like a lump on a cavern floor. They can change color a little, enough to blend into rocky backgrounds. Opponents suffer a -2 penalty to surprise rolls when faced by a roper.\nRopers attack by shooting strong, sticky strands at opponents. They can shoot a total of six strands, one per round, as far as 50 feet; each strand can extend (1d4+1) x 10 feet and pull up to 750 pounds. Each time a strand hits (requiring a normal attack roll), the victim must make a successful saving throw vs. poison or lose half its Strength (round fractions down). Strength loss occurs 1d3 round after a hit, is cumulative for multiple hits, and lasts for 2d4 turns.\nIf a roper\'s prey cannot break free, it is pulled 10 feet closer per round; when it reaches the roper, the creature bites the victim for 5d4 points of damage (automatic hit against a victim held by a strand). A strand can be pulled off or broken by a character who makes a successful open doors roll. A strand can also be cut; it is AC 0, and it must take at least 6 points damage from a single hit of an edged weapon to be severed.}}'},
+ {name:'Roper-11HD',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Roper 11HD, cattr:hd=11r2|thac0=10, ns:1]{{}}Specs=[Roper 11HD,CreatureRace,2H,Roper-10HD]{{}}%{Race-DB-Creatures|Roper-10HD}{{name=11HD}}{{Hit Dice=11 HD}}{{THAC0=10}}'},
+ {name:'Roper-12HD',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Roper 12HD, cattr:hd=12r2|thac0=10, ns:1]{{}}Specs=[Roper 11HD,CreatureRace,2H,Roper-10HD]{{}}%{Race-DB-Creatures|Roper-10HD}{{name=11HD}}{{Hit Dice=11 HD}}{{THAC0=10}}'},
{name:'Sahuagin',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Sahuagin}}RaceData=[w:Sahuagin, align:LE, ac:ring|cloak|protection|magicitem|miscellaneous, cattr:int=13:14|mov=12|swim=24|ac=5|hd=2+2r3|thac0=19|size=M|attk1=1d2:Claws x 2:0:S|attk2=1d4:Bite:0:P|attk3=1d4:Leg Rake x 2:1:S|attkmsg=Need to decide if none one or two leg rakes are possible based on results of other hits and melee situation$$ $$**Note:** Leg rake is not always valid, depending on the results of claw hits and melee situation, spattk:Leg rake x 2 if possible, spdef:Exceptional sight and hearing underwater. Suffer -2 save penalty and 1 extra HP damage/die vs fire spells,ns:3],[cl:WP,%:20,both:Heavy Crossbow,items:Dagger:3|Heavy Quarrel Underwater:20],[cl:WP,%:30,prime:Spear,offhand:Dagger:3],[cl:WP,%:50,prime:Trident,offhand:Net,items:Dagger:3]{{subtitle=Creature}}Specs=[Sahuagin,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=High (13-14)}}{{AC=5 from scales. Do not wear armour}}{{Alignment=Lawful Evil}}{{Move=12, Sw 24}}{{Hit Dice=2+2 HD}}{{THAC0=19}}{{Section1=**Attacks:** 2 x claws for 1d2 each, bite for 1d4 and, if possible, 1 or 2 x leg rake for 1d4 each. Can also use equipped weapons: typically Heavy crossbow \\amp dagger 20%, Spear \\amp dagger 30%,Trident, hooked net \\amp dagger 50%. Use *underwater quarrels* to get correct range}}{{Languages=Sahuagin speak their own tongue}}{{Size=M, 6ft tall}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=**Underwater Sight \\amp Hearing:** The eyes and ears of these monsters are particularly keen. They can see for 300 feet underwater at depths of up to 100 feet. For each 100 feet of greater depth, their vision is reduced by 10 feet. Can hear clinking of metal at one mile, or a boat oar splashing at twice that distance}}{{Section6=**Special Disadvantages**}}{{Section7=**Fire:** saving throws vs. fire-based spells suffer a -2 penalty, and they receive an additional point of damage per die of damage from such attacks.}}{{Section9=**Description**}}{{desc8=Sahuagin are a vicious, predatory race of fish-men that live in warm coastal waters. They are highly organized and greatly enjoy raiding shore communities for food and sport. Typical sahuagins are blackish green on their backs, shading to green on their bellies, with black fins. Their great, staring eyes are deep, shining black. They have scaly skin, with webbed fingers and toes, and their mouths are filled with sharp fangs. About 1 in 216 sahuagin is a mutation with four usable arms. These specimens are usually black shading to gray. Females are indistinguishable from males, except that they are slightly smaller. Hatchlings are a light green color, but they darken and attain full growth approximately one to two months after hatching.}}{{desc9=**Combat:** See attacks above - equip weapons as needed. Spears are used only as thrusting weapons. Nets are set with dozens of hooks that make escape virtually impossible for unarmored victims or creatures not able to grasp and tear with a Strength of 16 or greater. Nets are replaced by three javelins when the band forays onto land. The crossbows fire a maximum of 30 feet underwater and normal ranges on the surface. Tridents have three uses -- to spear small prey, to pin prey trapped in nets, and to hold threatening opponents at bay.\nWhen raiding villages, sahuagin attack en masse, with leaders in the second rank. As long as there is no truly spirited resistance, they continue in their plunder and violence. Underwater, in their natural element, the sahuagin are far more confident. Using the three-dimensional aspect of underwater fighting, they sometimes dive down on a group of underwater explorers, coming in from behind, and swooping down and past them, dropping nets on their intended victims.\nWhen sahuagin attack ships, they swarm up from all sides and try to overwhelm with numbers. They often grab their opponents and hurl them into the sea, where at least a fourth of the raiding party lurks, waiting for such an action or as reinforcements. Some leaders carry a conch shell, which when sounded gives the signal for the group of sahuagin in reserve to enter the fray. \nSahuagin have an almost paralyzing fear of spellcasters. They direct their strongest attacks toward anyone who uses spells or spell-like powers, such as the functions of some magical items.}}'},
{name:'Sahuagin-Baron',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Baron}}RaceData=[w:Sahuagin Baron, cattr:hd=6+6r2|thac0=13]{{}}Specs=[Sahuagin Baron,CreatureRace,0H,Sahuagin]{{}}%{Race-DB-Creatures|Sahuagin}{{Hit Dice=6+6 HD}}{{THAC0=13}}{{desc=**In Lair:** If sahuagin are encountered in their lair, there are the following additional sahuagin:\n1 baron (6+6 Hit Dice)\nNine guards (3+3 Hit Dice)\n3d4 x 10 females (2 Hit Dice)\n1d4 x 10 hatchlings (1 Hit Die)\n2d4 x 10 eggs\nAlso, there is a 10% chance per 10 male sahuagin that there is an evil priestess and 1d4 assistant priestesses, for the religious life of these creatures is dominated by the females. If a priestess is with the group in the lair, it is of 1d4+1 level ability, and the lesser clerics are 3rd or 4th level.}}'},
{name:'Sahuagin-Chieftain',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name= Chieftain}}RaceData=[w:Sahuagin Chieftain, cattr:hd=4+4r3|thac0=15]{{}}Specs=[Sahuagin Chieftain,CreatureRace,0H,Sahuagin]{{}}%{Race-DB-Creatures|sahuagin}{{Hit Dice=4+4 HD}}{{THAC0=15}}{{desc=**Sahagin Chieftain:** A band of sahuagin is always led by a chieftain. He has one lieutenant for every ten members of the group. The chieftain has 4+4 Hit Dice, and his lieutenants have 3+3 Hit Dice. All are in addition to the normal sahuagin in the group.}}'},
@@ -1200,6 +1311,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Scorpion-Giant',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Giant-Scorpion}{{}}RaceData=[w:Giant Scorpion]{{}}Specs=[Giant Scorpion,CreatureRace,0H,Giant Scorpion]{{}}'},
{name:'Scorpion-Huge',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Huge-Scorpion}{{}}RaceData=[w:Huge Scorpion]{{}}Specs=[Huge Scorpion,CreatureRace,0H,Huge Scorpion]{{}}'},
{name:'Scorpion-Large',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Large-Scorpion}{{}}RaceData=[w:Large Scorpion]{{}}Specs=[Large Scorpion,CreatureRace,0H,Large Scorpion]{{}}'},
+ {name:'Silver-Dragon',type:'DragonRace',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}Specs=[Silver-Dragon,DragonRace,2H,Red-Dragon]{{}}RaceData=[w:Silver Dragon, cattr:int=15:16|mov=9|fly=30C|Jump=3|ac=1-??1|hd=(15+??2)d8r1|mr=(v(^((??1-4);0);1)*??1*5)|cl=mu:silver-dragon/pr:silver-dragon|lv=5+??1/5+??1|thac0=5-??2|dmg=??1|size=G|attk1=1d8:Claw x 2 or Claw+Kick:0:S|attk2=5d6:Bite:0:P|attk3=2d8:Tail Swipe:0:B|attkmsg=Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$\\lbrak;Show the radius\\rbrak;\\lpar;!rounds ~~aoe `{selected¦token_id}¦arc180¦feet¦0¦\\lbrak;\\lbrak;`{selected¦age¦max}*11\\rbrak;\\rbrak;¦\\lbrak;\\lbrak;`{selected¦age¦max}*22\\rbrak;\\rbrak;¦black\\rpar; then up to \\lbrak;\\lbrak;`{selected¦age¦max}\\rbrak;\\rbrak; opponents in the area take damage and Save vs. Petrification with the penalty shown below or be \\lbrak;Stunned\\rbrak;\\lpar;!rounds ~~target area¦`{selected¦token_id}¦\\amp#64;{target¦Select the stunned creature¦token_id}¦Stunned¦\\lbrak;\\amp#91;1+1d4\\amp#93;\\rbrak;¦-1¦Stunned by a dragon tail slap¦back-pain\\rpar; for 1d4+1 rounds., spattk:*Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*, spdef:Magic resistance @{selected|monstermagicresist}% and immune to cold from birth, ns:=11],[cl:PW,w:Silver-Dragon-Breath,pd:-1,sp:1],[cl:PW,age:1,w:PW-Cloud-Walk,pd:-1,sp:1],[cl:PW,age:1,w:MU-Polymorph-Self,pd:3,sp:1],[cl:PW,age:3,w:MU-Feather-Fall,pd:2,sp:1],[cl:PW,w:MU-Wall-of-Fog,age:4,pd:1,sp:1],[cl:PW,w:PR-Control-Winds,age:6,pd:3,sp:1],[cl:PW,w:MU-Control-Weather,age:7,pd:1,sp:1],[cl:PW,w:MU-Reverse-Gravity,age:8,pd:1,sp:1],[cl:PR,lv:1,w:],[cl:PR,lv:2,w:],[cl:PR,lv:3,w:],[cl:PR,lv:4,w:]{{}}%{Race-DB-Creatures|Red-Dragon}{{title=Silver}}{{Intelligence=Exceptional (15-16)}}{{AC=Varies with age, adult silver dragon is AC -5}}{{Move=9, FL 30(C), Jump 3}}{{Hit Dice=Varies with age, adult silver dragon is 17 HD}}{{THAC0=Varies with age, adult silver dragon is 3}}{{Section1=**Attacks:** Damage bonus varies with age, adult silver dragon is +6. 2 x Claws for 1d8 HP each, possibly with 1 or 2 kicks for 1d8 each, bite for 5d6, and tail slap for 2d8 and possible *stun* within an area varying with age. Several other attacks possible - see *Powers*}}{{Languages=*Silver Dragon* and *Good Dragon Common*. 16% of hatchlings (+5% per age level) can perform universal communication with any intelligent creature}}{{Breath Weapon=A silver dragon has two breath weapons: a cone of cold 80\' long, 5\' wide at the dragon\'s mouth, and 30\' wide at the end or a cloud of paralyzation gas 50\' long, 40\' wide, and 20\' high. Creatures caught in the cold are allowed a save versus breath weapon for half damage. Damage from the acid breath weapon varies by age from 2d10+1 to 24d10+12. }}{{Spell Casting=Knows a number of random wizard and priest spells cast at a level from 9 to 17 varying with age. All spells are cast at a speed of 1 segment regardless of the spell}}{{Spell-like Powers=All silver dragons can use *cloud walk* at will, and can *polymorph self* 3 times a day. *Young* dragons can cast *feather fall* x 2 per day, *Juveniles* can cast *wall of fog* x1 per day, *Adult* dragons gain *control winds* x3 a day, *Mature Adults* can *control weather* x1 per day. *Old* dragons can cast *reverse gravity* x 1 per day.}}{{desc8=**Silver Dragons:** Silver dragons are kind and helpful. They will cheerfully assist good creatures if their need is genuine. They often take e the forms of kindly old men or fair damsels when associating with people. At birth, a silver dragon\'s scales are blue-gray with silver highlights. As the dragon approaches adulthood, its color slowly lightens to brightly gleaming silver. An adult or older silver dragon has scales so fine that the individual scales are scarcely visible. From a distance, these dragons look as if they have been sculpted from pure metal.\nSilver dragons prefer aerial lairs on secluded mountain peaks, or amid the clouds themselves. When they lair in clouds there always will be an enchanted area with a sold floor for laying eggs and storing treasure.\nSilver dragons seem to prefer human form to their own, and often have mortal companions. Frequently they share deep friendships with mortals. Inevitably, however, the dragon reveals its true form and takes its leave to live a dragon\'s life for a time.}}{{desc9=**Combat:** Silver dragons are not violent and avoid combat except when faced with highly evil or aggressive foes. If necessary, they use feather fall to stop any missiles fired at them. They use wall of fog or control weather to blind or confuse opponents before making melee attacks. If angry, they will use reverse gravity to fling enemies helplessly into the air, where they can be snatched. When faced with flying opponents, a silver dragon will hide in clouds (often creating some with control weather on clear days), remain there using cloud walking, then jump to the attack when they have the advantage.}}'},
{name:'Skeleton',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Skeleton}}RaceData=[w:Skeleton, align:N, cattr:int=0|mov=12|ac=7|hd=1r4|thac0=19|attk1=1d6:Simple weapon:3:S|attkmsg=Remember immune to *Sleep Charm* and *hold* spells and all cold and *fear* attacks,spdef: immune to *Sleep Charm* and *hold* spells and all cold and *fear* attacks]{{}}Specs=[Skeleton,CreatureRace,0H,Creature]{{subtitle=Creature}}{{Section=**Attributes**}}{{Intelligence=Non (0)}}{{AC=7}}{{Alignment=Neutral}}{{Move=12}}{{Hit Dice=1}}{{THAC0=19}}{{Attack=1d6 and by weapon}}{{Languages=None}}{{Size=M 6ft tall}}{{Life Expectancy=Already dead!}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Turning=}}{{Disassembly=}}{{Deafening Clatter=}}{{Spell Immunity=Immune to all *sleep, charm,* and *hold* spells, and all forms of *fear*. Cold-based attacks also do skeletons no harm}}{{Other Immunities=}}{{Damage from S\\ampP=Half damage from edged and piercing weapons. Blunt weapons do normal damage.}}{{Infravision=No need for light (no eyes) so can see normally in absolute darkness}}{{Section6=**Special Disadvantages**}}{{Falling Apart=}}{{Holy Water=Inflicts 2d4 HP damage to a skeleton}}{{Section9=**Description**}}{{desc8=Magically animated undead monsters, created as guardians or warriors by powerful evil wizards and priests.\nSkeletons appear to have no ligaments or musculature which would allow movement. Instead, the bones are magically joined together during the casting of an animate dead spell. Skeletons have no eyes or internal organs.}}{{desc9=**Combat:** Man-sized humanoid skeletons always fight with weapons, usually a rusty sword or spear. Because of their magical nature, they do not fight as well as living beings and inflict only 1-6 points of damage when they hit.\nSkeletons need never check morale, usually being magically commanded to fight to the death. When a skeleton dies, it falls to pieces with loud clunks and rattles.}}'},
{name:'Skeleton-Animal',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Animal-Skeleton}{{}}RaceData=[w:Animal Skeleton]{{}}Specs=[Animal Skeleton,CreatureRace,0H,Animal-Skeleton]{{}}'},
{name:'Skeleton-Giant',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Giant-Skeleton}{{}}Specs=[Giant Skeleton,CreatureRace,0H,Giant Skeleton]{{}}RaceData=[w:Giant Skeleton]{{}}'},
@@ -1229,6 +1341,12 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Stag-Giant',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Giant-Stag}{{}}RaceData=[w:Giant Stag]{{}}Specs=[Giant Stag,CreatureRace,0H,Giant Stag]{{}}'},
{name:'Steam-Mephit',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{subtitle=Creature}}RaceData=[w:Steam Mephit, cattr:hd=3+3|ac=7|attk1=1d4:Claw1:0:S|attk2=1d4:Claw2:0:S|dmgmsg=A successful claw hit also does an additional \\lbrak;\\lbrak;1\\rbrak;\\rbrak;HP of heat damage from boiling water and \\lbrak;50%\\rbrak;\\lpar;!\\amp#13;\\amp#47;gr 1d100\\lt50\\rpar; chance of \\lbrak;stunning\\rbrak;\\lpar;!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who\'s the victim?¦token_id}¦Stunned¦1¦-1¦Stunned \\amp considered prone¦back-pain\\rpar; for 1 round \\lpar;cumulative\\rpar;. Remember water jet breath weapon power; boiling rainstorm power; *contaminate water* and *gate mephit*, spattk:Claws do additional 1HP heat damage and stun 50% of the time. Breath weapon:Boiling water jet \\lpar;Power\\rpar; every 2 rounds. Can *contaminate water*, spdef:*Gate* in \\lpar;Power\\rpar; another two mephits each hour, ns:=4],[cl:PW,w:Steam Mephit Water Jet,sp:0,pd:-1],[cl:PW,w:Steam Mephit Rain,sp:0,pd:-1],[cl:PW,w:Putrify Food and Drink,sp:10,pd:1],[cl:PW,w:Gate Mephit,sp:0,pd:24]{{}}%{Race-DB-Creatures|Fire-Mephit}{{title=Imp - Steam Mephit}}{{Hit Dice=3+3}}{{AC=7}}{{Attacks=2 x Claw for 1d4 HP and 1 HP additional heat damage \\amp 50% chance of stunning for 1 round}}{{Section2=Breath weapon (Power): Boiling *Water Jet* every other round. *Boiling Rain* power 1/day. *Contaminate Water* (use *Putrify Food \\amp Drink*) power 1/day. *Gate Mephit* 1/hour.}}{{Section4=**Stunning Attack:** Any successful attack or water jet breath has 50% chance of stunning victim for 1 round (cumulative)}}Specs=[Mephit,CreatureRace,0H,Fire-Mephit]{{desc=**Steam Mephit:** Steam mephits are the self-appointed overlords of all mephits. They frequently give orders to weaker mephits. In addition to hissing steam escaping from their pores, steam mephits leave a trail of near-boiling water wherever they walk.\nAll stunning effects are cumulative, so a victim raked twice could be stunned for two rounds. A successful attack has 50% chance o stunning for 1 round.\nSteam mephits can breath a scalding jet of water every other round; no limit to the number of times per day this can be used. This jet has a 20-foot range and automatically hits its target. Damage is 1d3 points (no saving throw) with a 50% chance of stunning the victim for one round.\nOnce per day a steam mephit may create a rainstorm of boiling water over a 20-by 20-foot area. This storm inflicts 2d6 points of damage to all victims caught in the area of effect, with no saving throw allowed. Steam mephits may also *contaminate water* once per day (reverse of purify water).\nOnce per hour a steam mephit may attempt to gate in 1-2 other mephits with a 30% chance of success. There is an equal probability that the summoned mephits are either fire, lava, smoke, or steam. If two are summoned: they are of the same type.\nUnlike other mephits, who will delay an attack for as long as possible, steam mephits are ruled by their oversized egos. They will even ambush even large, well-armed parties, striking first with boiling rainstorms, then concentrating their breath weapons on the nearest wizard or priest.}}'},
{name:'Steppe-Pony',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Steppe Pony, cattr:ac=6|hd=2r5|attk1=1d4:Left Hoof:0:B|attk2=1d4:Right Hoof:0:B|attk3=1d3:Bite:0:P]{{}}Specs=[Steppe Pony,CreatureRace,0H,Horse]{{}}%{Race-DB-Creatures|Horse}{{name=(Steppe Pony)}}{{Attacks=2 x Hooves for 1d4 each, and Bite for 1d3}}{{desc8=**Steppe Pony:** A steppe pony is not attractive, graceful, or large, but its homely, ungainly appearance disguises an animal of great endurance, speed, and strength. A steppe pony looks like a cross between a horse and a pony, but is a breed unto itself. They are small, averaging 13 hands (4\'4") at the withers, and they have short necks, large heads, and heavily boned bodies. Their winter coat is shaggy and gives them the appearance of being "half-wild." They are most commonly colored copper or bronze, with a light yellow stripe running down their backs.\nThe steppe pony has remarkable endurance. It can survive by grazing alone and does not require feeding and handling by its rider, so separate supplies of grain are not needed. It can be ridden for long distances without tiring or faltering. A +3 modifier is applied to the pony\'s saving throws for lameness and exhaustion checks when travelling overland.\nIn spite of all its qualities, the steppe pony is not sought after or considered valuable. It is most commonly ridden by nomadic tribes. Outside the steppes, the animal is almost completely unknown and does not command high prices at auction. Only breeders who know the steppe pony\'s qualities, and who seek strength and stamina in their own horses\' bloodlines, are likely to consider the steppe pony as valuable.}}{{desc9=**Combat:** These horses are tough, hard to kill, and aggressive in battle. They have most of the same characteristics\nas a light war horse, with a few exceptions. It attacks three times per round, its third attack being a bite which causes 1-3 points of damage. The steppe pony\'s thick, shaggy coat and tough hide gives it an AC of 6. Its short legs are powerful and can carry horse and rider swiftly, over long distances; its small back is also very strong and it can carry as much as a medium war horse (220/330/440). The steppe pony is even-tempered and steady in battle; its morale is average (8-10), and it panics very rarely (5% chance) due to such things as fire and loud noises.}}'},
+ {name:'Stone-Giant',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=Stone }}{{title=Giant}}RaceData=[w:Stone Giant, align:N|NN, ac:magicitem|ring|cloak, cattr:int=8:10|mov=12|ac=0|hd=14d8+1d3+1r1|thac0=7|tohit=+3|dmg=+8|size=H|attk1=1d8:Fist:0:B, spdef:Able to catch hurled rocks 90% of the time, ns:1],[cl:WP,prime:Giant-Club,items:SG-Rock:2d12]{{subtitle=Creature}}Specs=[Stone-Giant,CreatureRace,2H,Creature]{{Section=**Attributes**}}{{Intelligence=Average (8-10)}}{{AC=0 is natural AC. Do not wear armour, preferring stone coloured garments}}{{Alignment=Neutral}}{{Move=12}}{{Hit Dice=14HD +1d3}}{{THAC0=7}}{{Section1=**Attacks:** +3 on ToHit rolls from strength. 1 x Fist for 1d8 HP damage, or using a Giant Club for 2d6 damage, plus strength bonus of +8. Throw rocks 3 to 300 yards doing 3d10 damage}}{{Languages=*Stone Giant*, as well as *Hill Giant, Cloud Giant* and *Storm Giant*, and *Giant Common*. In addition, 50% of Stone Giants speak *Common*}}{{Size=H, 18ft tall}}{{Life Expectancy=About 800 years}}{{Section2=**Powers**}}{{Section3=None}}{{Stone Giant Elder=}}{{Spell Casting=}}{{Section4=**Special Advantages**}}{{Section5=Able to catch hurled rocks 90% of the time}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc7=**Stone giants:** are lean, but muscular. Their hard, hairless flesh is smooth and gray, making it easy for them to blend in with their mountainous surroundings. Their gaunt facial features and deep, sunken black eyes make them seem perpetually grim.\nThe typical stone giant is 18\' tall and weighs 9,000 pounds because of its dense flesh. Females are a little shorter and lighter.\nStone giants, like several other giant races, carry some of their belongings with them. They leave their more valuable items in their lairs, however. A typical stone giant\'s bag will contain 2-24 (2d12) throwing rocks, a portion of the giant\'s wealth, and 1-8 additional common items.\nStone giants prefer to dwell in deep caves high on rocky, storm-swept mountains. They normally live in the company of their relatives, though such a clans usually include no more than 10 giants. Clans of giants do locate their lairs near each other, however, for a sense of community and protection. A mountain range commonly has 2-8 clans lairing there.\nStone giants are crude artists, painting scenes of their lives on the walls of their lairs and on tanned hide scrolls. Some giants are fond of music and play stone flutes and drums. Others make simple jewelry, fashioning painted stone beads into necklaces.\nIf eight or more giants are encountered in a clan\'s lair, one quarter will be female, one quarter male, and the remainder offspring. To determine a giant\'s maturity, roll 1d4. A roll of 4 indicates an infant with no combat ability and hit points of an ogre; rolls of 1-3 indicate older progeny with hit dice, damage, and attack rolls equal to those of a hill giant.\nStone giants are playful, especially at night. They are fond of rock throwing contests and other games that test their might. Tribes of giants will often gather to toss rocks at each other, the losing side being the giants who are hit more often.}}{{desc9=**Combat:** When possible, stone giants fight from a distance. A favorite tactic of stone giants is to stand nearly motionless against rocks, blending in with the background, then moving forward to throw rocks, surprising their foes. Many giants set up piles of rocks near their lair which can be\ntriggered like an avalanche when intruders get too close. \nWhen stone giants are forced into melee combat, they use large clubs chiseled out of stone}}'},
+ {name:'Stone-Giant-Elder',type:'CreatureRace',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Stone Giant Elder,cattr:hd:14+1d4r2,ns:1],[cl:PW,w:MU-Stone-Shape,sp:10,clv:5,pd:1],[cl:PW,w:PR-Stone-Tell,sp:100, clv:5, pd:1],[cl:PW,w:MU-Transmute-Rock-to-Mud,sp:5,clv:5,pd:1],[cl:PW,w:MU-Transmute-Mud-to-Rock,sp:5,clv:5,pd:1]{{}}Specs=[Stone-Giant-Elder,CreatureRace,2H,Stone-Giant]{{}}%{Race-DB-Creatures|Stone-Giant}{{name=Elder}}{{Stone Giant Elder=One in 20 stone giants develop special abilities related to their environment. These giant elders are able to *stone shape, stone tell,* and *transmute rock to mud* (or *mud to rock*) once per day as if they were 5th level mages.}}'},
+ {name:'Stone-Giant-Juvenile-1',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Stone Giant Juvenile 1,cattr:hd:11+1d2|tohit=+3|dmg=+7,ns:=1],[cl:WP,both:Giant-Club]{{}}Specs=[Stone-Giant-Juvenile-1,CreatureRace,2H,Stone-Giant]{{}}%{Race-DB-Creatures|Stone-Giant}{{name= Juvenile-1}}'},
+ {name:'Stone-Giant-Juvenile-2',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Stone Giant Juvenile 2,cattr:hd:12+1d2|tohit=+3|dmg=+7,ns:=1],[cl:WP,both:Giant-Club]{{}}Specs=[Stone-Giant-Juvenile-2,CreatureRace,2H,Stone-Giant]{{}}%{Race-DB-Creatures|Stone-Giant}{{name= Juvenile-2}}'},
+ {name:'Stone-Giant-Juvenile-3',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Stone Giant Juvenile 3,cattr:hd:13+1d2|tohit=+3|dmg=+7,ns:=1],[cl:WP,both:Giant-Club]{{}}Specs=[Stone-Giant-Juvenile-3,CreatureRace,2H,Stone-Giant]{{}}%{Race-DB-Creatures|Stone-Giant}{{name= Juvenile-3}}'},
+ {name:'Stone-Giant-Mage',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Stone Giant Mage,cattr:cl=mu:wizard|lv=3,ns:1],[cl:MU,lv:1,w:random|random|random|random|random|random|random|random|random|random],[cl:MU,lv:2,w:random|random|random|random|random|random|random|random|random|random]{{}}Specs=[Stone-Giant-Mage,CreatureRace,2H,Stone-Giant-Elder]{{}}%{Race-DB-Creatures|Stone-Giant-Elder}{{name=Mage}}{{Spell Casting=One in 10 of Stone Giant Elders can also cast spells as if he were a 3rd level wizard. Their spells are automatically determined randomly but can be chosen to fit a specific encounter as desired. Frequently these giants are able to rise to positions of power and are considered the leaders of several clans.}}'},
{name:'Swarm-of-Rats',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Swarm of Rats, cattr:hd=4r3|hp=|thac0=17|size=L|attk1=4:Bite:0:P|dmgmsg=Small creatures automatic hit for 4HP. Weapons can\'t do damage - need area effect. If hit \\lbrak;5% chance\\rbrak;\\lpar;!\\amp#13;\\amp#47;gr 1d100\\lt5 if 5 or less rat carries disease\\rpar; of the ratcarrying disease. Save vs. Poison or \\lbrak;catch disease\\rbrak;\\lpar;!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who\'s been bitten?¦token_id}¦Rat Disease¦99¦0¦Caught disease from a rat¦death-zone\\rpar;, spattk:Small creatures automatic hit for 4HP damage. 5% chance of carrying disease. On successful hit target save vs. poison or catch disease, spdef:Little or no effect from weapons. Need area effects to damage]{{}}Specs=[Swarm of Rats,CreatureRace,0H,Black Rat]{{}}%{Race-DB-Creatures|Black-Rat}{{name=Swarm of Rats}}{{Hit Dice=4HD}}{{THAC0=17}}{{Attacks=Bite for 4HP damage \\amp 5% chance of save vs. poison or disease. Automatic hits vs. Small creatures}}{{Size=L, 10ft x 10ft area}}{{Area Effects To Hit=Weapons can\'t successfully hit. Need area effects of spells or the like sof burning oil to do damage}}{{desc=**Swarm of Rats:** A swarm of rats can be treated as a single monster having an assigned number of Hit Dice and automatically causing damage each round to small creatures in the swarm\'s area. A typical pack might cover a 10-x10-foot area, have 4 HD, and inflict 4 points of damage per round. Weapons have little effect on a pack, but area effect spells and some other attacks (such as flaming oil) are effective. When the pack has lost its hit points, it is considered dispersed and unable to inflict mass damage.}}'},
{name:'Symbol-of-Hopelessness',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Symbol of Hopelessness}}RaceData=[w:Symbol of Hopelessness, align:N, weaps:none, ac:none, cattr:int=0|mov=0|ac=10|hd=1|hp=1|thac0=20|size=S,ns:1],[cl:PW,w:Symbol-of-Hopelessness,sp:0,pd:-1]{{subtitle=Spell}}Specs=[Symbol of Hopelessness,CreatureRace,0H,Creature]{{Section2=**Powers**}}{{Hopelessness=Creatures seeing this symbol must turn back in dejection or surrender to capture or attack unless they roll successful saving throws vs. spell. Its effects last for 3d4 turns.}}{{Section9=**Description**}}{{desc8=This token/character sheet combination represents the casting and placement of a *symbol* of hopelessness by a high-level priest. Any creature that views this symbol within it\'s duration will suffer its effects. Achieve this using the power of Hopelessness under the *use power* action button.}}'},
{name:'Symbol-of-Pain',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Symbol of Pain}}RaceData=[w:Symbol of Pain, align:N, weaps:none, ac:none, cattr:int=0|mov=0|ac=10|hd=1|hp=1|thac0=20|size=S,ns:1],[cl:PW,w:Symbol-of-Pain,sp:0,pd:-1]{{subtitle=Spell}}Specs=[Symbol of Pain,CreatureRace,0H,Creature]{{Section2=**Powers**}}{{Pain=Creatures affected suffer -4 penalties to their attack rolls and -2 penalties to their Dexterity ability scores due to wracking pains. The effects last for 2d10 turns.}}{{Section9=**Description**}}{{desc8=This token/character sheet combination represents the casting and placement of a *symbol* of pain by a high-level priest. Any creature that views this symbol within it\'s duration will suffer its effects. Achieve this using the power of Pain under the *use power* action button.}}'},
@@ -1236,6 +1354,8 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Talking-Owl',type:'CreatureRace',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Talking Owl,spdef:Wisdom 21 - Spell immunity to *cause fear / charm person / command / friends / hypnotism / forget / hold person / ray of enfeeblement / scare / fear*, ns:1],[cl:PW,w:PR-Detect-Good,sp:10,pd:-1]{{}}Specs=[Talking Owl,CreatureRace,0H,Owl]{{}}%{Race-DB-Creatures|Owl}{{title=Talking }}{{Intelligence=Average (8 to 10)}}{{Languages=Speak common and six other languages (DM\'s option)}}{{desc8=**Talking Owl:** Talking owls appear as ordinary owls, but speak common and six other languages (DM\'s option). Their role is to serve and advise champions of good causes on dangerous quests, which they do for 1d3 weeks if treated kindly on the first encounter; a talking owl feigns a broken wing to see how a party will react.\nTalking owls can detect good. They have a *wisdom* score of 21, with the appropriate spell immunities.}}'},
{name:'Throat-Leech',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Throat Leech}}{{subtitle=Creature}}RaceData=[w:Throat Leech,cattr:imov=1|swim=1|ac=10|size=T|hd=1-7r7|hp:1|regen=|thac0=20|attk1=1d3:Bite:0:P|attkmsg=10% chance of swallowing if drink water containing leech. If swallowed, a successful bite in the throat injects anesthetizing saliva then sucks blood doing 1d3HP per round for 10 rounds with 50% choke risk each round. 3 rounds choking in a row means death at end of 3rd round. There is a \\lbrak;50% chance\\rbrak;\\lpar;!\\amp#13;\\amp#47;gr 1d100\\lt50 causes disease\\rpar; that the bite of one of these creatures \\lbrak;causes a disease\\rbrak;\\lpar;!rounds ~~target single¦`{selected¦token_id}¦\\amp#64;{target¦Who\'s the victim?¦token_id}¦Leech disease¦99¦0¦Getting weaker and feel could die in \\amp#91;\\lbrak;1d4+1\\rbrak;\\amp#93; weeks...¦radioactive\\rpar; that is fatal in 1d4+1 weeks unless cured, spattk:Bite drains blood in throat with chance of choking to death. 50% chance of causing fatal disease]{{}}%{Race-DB-Creatures|Leech-Giant-2HD}{{AC=10}}{{Move=1, Sw 1}}{{Hit Dice=1-7}}{{HP=1}}{{THAC0=20}}{{Attacks=10% chance of swallowing. If swallowed bite throat for 1d3 and automatic blood drain and risk of choking}}{{Size=T, 1ins long}}{{Blood Drain Bite=In throat if swallowed with 50% risk of choking each round, 3 rounds in a row and die}}Specs=[Throat Leech,CreatureRace,0H,Giant-Leech-2HD]{{desc8=This leech is about one inch long and resembles an inconspicuous twig. It is found in pools, lakes, and streams.}}{{desc9=**Combat:** Anyone drinking water containing a leech has a 10% chance of taking it into his mouth unless the water is carefully filtered (such as through a sheet of gauze) before drinking. The leech sucks blood at the rate of 1-3 points of damage per round, until it becomes completely distended. After ten rounds of sucking, the leech is bloated and will not suck any more blood.\nEach round that the leech is in the victim\'s throat, there is a 50% chance that the victim chokes, causing an additional 1d4 points of damage. A victim who chokes on three successive rounds dies on the third round.\nApart from magical means that may suggest themselves, the only way to kill a throat leech in a victim\'s throat is to place a thin, heated metal object, such as a wire, into the bloated leech; the hot metal causes the leech to burst and no further damage is inflicted on the victim.}}'},
{name:'Tiger',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Tiger}}RaceData=[w:Tiger, align:N, weaps:none, ac:none, spattk:Can leap upward 10ft and forward 30 to 50ft, spdef:Only surprised on a 1, cattr:int=2:4|mov=12|ac=6|hd=5+5r4|thac0=15|size=L|attk1=1+1d4:2 x Front Claws:0:S|attk2=1d10:Bite:0:P|attk3=2d4:2 x Rear Claw Rake:1:S|attkmsg=If both front claws successfully hit then both back claws can do rake attacks$$ $$Only valid if both front claws successfully hit. One attempted rake attack for each rear claw|dmgmsg=$$ $$Only valid if both front claws successfully hit]{{subtitle=Creature}}Specs=[Tiger,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Semi (2 to 4)}}{{AC=6}}{{Alignment=Neutral}}{{Move=12}}{{Hit Dice=5+5 HD}}{{THAC0=15}}{{Attacks=2 x 1+1d4 front claws, bite for 1d10. If both front claws hit, rake with 2 x rear claws is attempted for 2d4 each}}{{Size=L (6ft to 9ft long)}}{{Life Expectancy=10 to 15 years in the wild}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Surprise=Only surprised on a 1}}{{Leap=Can leap upward 10ft and forward 30 to 50ft, e.g. when chasing prey}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=The tiger is the largest and most feared of the great cats. Tigers have reddish-orange fur and dark vertical stripes. This species ranges from the subarctic to the tropics, generally inhabiting wooded or covered terrain. \nA tiger is a redoubtable foe in battle and is surprised only on a 1. Tigers are nocturnal, solitary, graceful climbers and swimmers who are capable of sustained high speed.\nFemales raise their 1-3 cubs alone. The cubs remain with their mother for several years. If encountered in the lair, there is a 25% chance that the cubs will be present.}}{{desc9=**Combat:** They are experts in stalking and often\nhunt in pairs or groups. These animals rarely fight among themselves, but will protect their territories ferociously. They are also the most unpredictable and dangerous of the great cats, not hesitating to attack men. Their favorite prey includes cattle, wild pigs and deer.\nFeared by men, tigers are hunted aggressively, and are threatened by the destruction of forests. In the untamed wilderness, however, the tiger occupies the top predatory niche.}}'},
+ {name:'Titan-Priest',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Titan}}RaceData=[w:Titan Priest, cattr:cl=pr:priest/f:creature|lv=20/0]{{}}Specs=[Titan,CreatureRace,0H,Titan-Wizard]{{}}%{Race-DB-Creatures|Titan-Wizard}{{name=Priest}}'},
+ {name:'Titan-Wizard',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Titan}}{{name=Wizard}}RaceData=[w:Titan Wizard, align:CG, ac:any, weaps:any, npp:0, cattr:int=19:22|mov=36|ac=0|hd=20r3|thac0=5|cl=mu:wizard/f:creature|lv=20/0|size=G|tohit=+7|dmg=+14, spattk:God-like creature able to attack twice per round with *Maul* and also use *special attack* once every other round, ns:1],[cl:WP,prime:Maul-of-the-Titans,offhand:Titan-Special-Attack],[cl:PW,w:Etherial-Travel-Self,sp:0,pd:2,clv:20],[cl:PW,w:MU-Advanced-Illusion,pd:-1,sp:10,clv:20],[cl:PW,w:MU-Alter-Self,pd:-1,sp:2,clv:20],[cl:PW,w:PR-Animal-Summoning-II,pd:-1,sp:8,clv:20],[cl:PW,w:MU-Astral-Spell,pd:-1,sp:9,clv:20],[cl:PW,w:PR-Bless,pd:-1,sp:10,clv:20],[cl:PW,w:PR-Charm-Person-or-Mammal,pd:-1,sp:5,clv:20],[cl:PW,w:PR-Commune-With-Nature,pd:-1,sp:100,clv:20],[cl:PW,w:MU-Astral-Spell,pd:-1,sp:9,clv:20],[cl:PW,w:PR-Cure-Light-Wounds,pd:-1,sp:5,clv:20],[cl:PW,w:MU-Eyebite,pd:-1,sp:6,clv:20],[cl:PW,w:PR-Fire-Storm,pd:-1,sp:10,clv:20],[cl:PW,w:MU-Hold-Person,pd:-1,sp:3,clv:20],[cl:PW,w:MU-Hold-Monster,pd:-1,sp:5,clv:20],[cl:PW,w:MU-Hold-Undead,pd:-1,sp:5,clv:20],[cl:PW,w:MU-Invisibility,pd:-1,sp:2,clv:20],[cl:PW,w:MU-Levitate,pd:-1,sp:2,clv:20],[cl:PW,w:MU-Light,pd:-1,sp:1,clv:20],[cl:PW,w:MU-Mirror-Image,pd:-1,sp:2,clv:20],[cl:PW,w:PR-Pass-Without-Trace,pd:-1,sp:10,clv:20],[cl:PW,w:PR-Produce-Fire,pd:-1,sp:7,clv:20],[cl:PW,w:Protection-From-Evil-10ft,pd:-1,sp:7,clv:20],[cl:PW,w:PR-Remove-Fear,pd:-1,sp:1,clv:20],[cl:PW,w:PR-Remove-Curse,pd:-1,sp:6,clv:20],[cl:PW,w:MU-Shield,pd:-1,sp:1,clv:20],[cl:PW,w:PR-Speak-With-Plants,pd:-1,sp:100,clv:20],[cl:PW,w:PR-Summon-Insects,pd:-1,sp:10,clv:20],[cl:PW,w:MU-Whispering-Wind,pd:-1,sp:1,clv:20]{{subtitle=Creature}}Specs=[Titan,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Supra-Genius to God-like (19 to 21+)}}{{AC=0 is natural AC. Generally only wear robes of the Greek gods, such as togas}}{{Alignment=Chaotic Good}}{{Move=36}}{{Hit Dice=20HD}}{{THAC0=5}}{{Section1=**Attacks:**}}{{Maul of the Titans=Twice per round for 4d10+2 HP damage + an additional 14 HP strength bonus}}{{Special Attack=This form of special attack is so destructive and deadly, that a titan will use it only if there are no other options left open. The form of each titan\'s attack will be different (some kick, some punch, others use a breath attack, lightning, etc.), but the effect is the same for each. The special attack inflicts 10-60 points of damage per hit and can be used every other round. These mighty attacks have been known to destroy buildings and sink ships.}}{{Languages=In addition to speaking their own language, titans are able to speak the six main dialects of giants. All titans are also conversant in the common tongue as well as that commonly spoken by forest creatures, as these giants have close ties with nature.}}{{Size=G, 25ft+ tall}}{{Life Expectancy=Immortal}}{{Section2=**Powers**}}{{Spell-like Powers=All titans have the following spell-like powers, at 20th level of spell use, usable once per round, one at a time, at will: *advanced illusion, alter self, animal summoning II, astral spell, bless, charm person or mammal, commune with nature, cure light wounds, eyebite, fire storm, hold person, hold monster, hold undead, invisibility, levitate, light, mirror image, pass without trace, produce fire, protection from evil, 10\' radius, remove fear, remove curse, shield, speak with plants, summon insects,* and *whispering wind*}}{{Spell Casting=All titans are able to employ both mage or priest spells (dependent on the individual titan -- only one, not both) as a 20th-level spell caster.}}{{Section4=**Special Advantages**}}{{Immunity=Titans are not affected by attacks from nonmagical weapons.}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=Titans are gargantuan, almost godlike men and woman. They, quite simply, look like 25\' tall people of great physical strength and beauty. They are commonly dressed in traditional Greek garb, favoring togas, loincloths, and such. They wear rare and valuable jewelry and in other ways make themselves seem beautiful and overpowering.\nTitans are livers of life, creators of fate. These benevolent giants are closer to the well springs of life than mere mortals and, as such, revel in their gigantic existences. Titans are wild and chaotic. They are prone to more pronounced emotions that humans and can experience godlike fits of rage. They are, however, basically good and benevolent, so they tend not to take life. They are very powerful creatures and will fight with ferocity when necessary.\nTo some, titans seem like gods. With their powers they can cause things to happen that, surely, only a god could. They are fiery and passionate, displaying emotions with greater purity and less reservation than mortal beings. Titans are quick to anger, but quicker still to forgive. In fits of rage they destroy mountains and in moments of passion will create empires. They are in all ways godlike and in all ways larger than life.\nAnd yet is should be noted that titans are not gods. They are beings that make their home in Olympus and walk among the gods. Yet they are not omnipotent, omniscient rulers of the planes. Sometimes their godlike passions and godlike rages make them seem like deities, however, and it is common for whole civilizations to mistake them for deities.\nThere they will dance, sing, study, debate and engage in all other manner of activities with titanic proportion. If a titan finds something that interests him, it would not be unusual for him to study it in great detail for many weeks, only to leave it when his interest has waned. They may also engage in debates or arguments that last literally for weeks at a time. These debates might end in a jovial laughter and good spirits or in thunder and rage. Such are the whims of titans.}}{{desc9=**Combat:** Hell hounds are clever hunters that operate in packs of 2d20 beasts. Each pack is led by a 7-Hit Die hell hound. The leader drives off other 7 HD rivals, who form their own packs. They move with great stealth, imposing a -5 penalty to opponents\' surprise rolls. One or two of the pack sneak up on a quarry while the others form a ring around it. The first hell hound then springs from ambush, attacks the nearest victim, and attempts to drive the others toward the rest of the pack. If the prey does not run away, the rest of the pack closes in within 1d4+2 rounds. \nHell hounds attack first by breathing fire at an opponent up to 10 yards away. The hell hound then attacks with its teeth. If the hell hound rolls a natural 20 on its attack roll, it grabs a victim in its jaws and breathes fire on the victim.}}'},
{name:'Troll',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Troll}}{{subtitle=Creature}}Specs=[Troll,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Low (5-7)}}{{AC=4}}{{Alignment=Chaotic Evil}}{{Move=12}}{{Hit Dice=6d8+6}}{{THAC0=13}}{{Attacks=2 x Claw 1d4+4, 1 x Bite 1d8+4}}{{Languages=Trolls have no language of their own, using "trollspeak", a guttural mishmash of common, giant, goblin, orc, and hobgoblin. Trollspeak is highly transient and trolls from one area are only 25% likely to be able to communicate with trolls from another.}}{{Size=L 9ft tall}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Regeneration=3 rounds after 1st blood, regenerates at 3HP per round}}{{Section4=**Special Advantages**}}{{Infravision=90 foot}}{{Priest Spells=}}RaceData=[w:Troll, align:CE, cattr:int=5:7|mov=12|ac=4|hd=6+6r3|regen=3|thac0=13|size=L|dmg=+8|attk1=4+1d4:Claw1:0:S|attk2=4+1d4:Claw2:0:S|attk3=4+1d8:Bite:1:P|attkmsg=Remember to start \\lbrak;Regenerating\\rbrak;\\lpar;!rounds ~~target caster¦`{selected¦token_id}¦regeneration¦99¦0¦Regenerating at `{selected¦conregen} per round¦strong\\rpar; 3 rounds after take damage, spdef:Regenerate at 3HP per round,ns:2],[cl:PW,w:regenerate,sp:0,pd:-1],[cl:WP,prime:stone:5]{{Section9=**Description**}}{{desc7=Horrid carnivores found in all climes, from arctic wastelands to tropical jungles. Most creatures avoid these beasts, since trolls know no fear and attack unceasingly when hungry. Their frame appears thin and frail, but trolls possess surprising strength. Their arms and legs are long and ungainly. The legs end in great three-toed feet, the arms in wide, powerful hands with sharpened claws. The trolls\' rubbery hide is colored a moss green, mottled green and gray, or putrid gray. A writhing hairlike mass grows out of their skulls and is usually greenish black or iron gray in color. Their dull, sunken black eyes possess 90-foot infravision. Females are easily distinguished from males; they are both larger and more powerful than their male counterparts.\nTrolls walk upright but hunched forward with sagging shoulders. The trolls\' gait is uneven and, when running, the arms dangle free and drag along the ground. For all this seeming awkwardness, trolls are very agile. They are masterful climbers and can scale even sheer cliffs with an 80% chance of success. Trolls have a poor hearing, but their sense of smell is superior.}}{{desc8=**Regeneration:** Trolls reduced to 0 or fewer hit points fall to the ground, incapacitated but not slain. Incapacitated trolls continue to regenerate and stand up to fight as soon as they have a positive number of hit points.\nWhen using an edged weapon, it is possible to sever the thin limbs of a troll (a natural 20 with an edged weapon is needed). Severed limbs continue to fight after separation from the body (hands squeeze, heads bite if stepped on, etc.). Attacks by severed limbs are at normal chances to hit.}}{{desc9=**Combat:** Can attack at multiple opponents with 2 claws \\amp bite. In the rare case that a troll wields a weapon, it attacks with a +8 damage bonus. Trolls regenerate at an amazing rate. Starting three rounds after first blood, the creatures recovers 3 hit points per round until healed.}}'},
{name:'Troll-Freshwater-Scrag',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Freshwater Troll}{{}}Specs=[Freshwater Troll,CreatureRace,0H,Freshwater-Troll]{{}}RaceData=[w:Freshwater Troll]{{}}'},
{name:'Troll-Freshwater-Shaman',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Freshwater-Troll-Shaman}{{}}RaceData=[w:Freshwater Troll Shaman]{{}}Specs=[Freshwater Troll Shaman,CreatureRace,0H,Freshwater-Troll-Shaman]{{}}'},
@@ -1243,15 +1363,18 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Troll-Saltwater-Marine-Scrag',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|SaltwaterTroll}{{}}Specs=[SaltwaterTroll,CreatureRace,0H,Saltwater-Troll]{{}}RaceData=[w:Saltwater Troll]{{}}'},
{name:'Troll-Saltwater-Scrag-Shaman',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Saltwater-Troll-Shaman}{{}}RaceData=[w:Saltwater Troll Shaman]{{}}Specs=[Saltwater Troll Shaman,CreatureRace,0H,Saltwater-Troll-Shaman]{{}}'},
{name:'Troll-Shaman-Chieftain',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{subtitle=Creature}}RaceData=[w:Troll Shaman Chieftain, cattr:int=7|cl=pr:troll-shaman|lv=7]{{Intelligence=Low (7)}}%{Race-DB-Creatures|Troll}{{name=Troll Shaman Chieftain}}Specs=[Troll Shaman,CreatureRace,0H,Troll]{{Priest Spells=Cast at 7th level: Charm, Divination, Sun (Darkness only), and Weather.}}{{desc=**Troll Shaman Chieftain:** Trolls live in small packs of 3 to 12 trolls led by a dominant female who acts as shaman/chieftain. She casts priest spells at 7th level; spheres typically include Charm, Divination, Sun (Darkness only), and Weather. Leadership is only retained by combat, so fights for pack control are frequent. Often trolls rend each other limb from limb, but these battles are never fatal. Still, it is the custom of trolls to toss the loser\'s head a great distance from the fight scene, and frequently losers must sit and stew for a week until their new head grows in.\nThe pack chieftain\'s duties are few. She leads the trolls on nightly forages, loping along, sniffing the air for prey. If a scent is found, the trolls charge, racing to get there first, and letting out a great cry once prey is spotted. In return for being the hunt leader, the shaman gets her choice of mates in the pack. Females give birth to a single troll about once every five years.}}'},
+ {name:'Two-Headed-Giant',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'%{Race-DB-Creatures|Ettin}{{}}Specs=[Two-Headed-Giant,CreatureRace,2H,Ettin]{{}}RaceData=[w:Two-Headed Giant]{{}}'},
{name:'Vampire',type:'HumanoidCreature',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Vampire}}{{subtitle=Creature}}Specs=[Vampire,HumanoidCreature,0H,Creature]{{Alignment=Usually chaotic evil}}{{Languages=Whatever they knew before they were a vampire, or what their vampire parents taught them.}}{{Size=M, As per pre-vampire race (usually [65+2d6](!\\amp#13;\\amp#47;r 65+2d6 ins height)ins,}}{{Weight=Their weight before becoming a vampire or [140+6d10](!\\amp#13;\\amp#47;r 140+6d10 lbs weight)lbs}}{{Life(?) Expectancy=Immortal}}{{Section=**Attributes**}}{{Minimum=Str:18(76), Int:15}}{{Maximum=Int:16}}{{Adjustment=None}}{{Section1=**Powers**}}{{Energy Drain=Drains 2 levels from anyone they successfully touch}}{{Charm=Any person who allows the\nvampire to look into their eyes will be affected as if by a *charm person* spell. Due to the power of this enchantment, a -2 is applied to the victim\'s saving throw vs. spell}}{{Summon Creatures=Can summon swarms of creatures to their aid}}{{Shape Change=Can *Shape Change* into a large bat at will}}{{Spell-like powers=*Gaseous Form* and *Spider Climb* at will}}{{Section2=**Special Advantages**}}{{Infravision=60 feet}}{{Plus Weapons To Hit=Attackers must use weapons of at least +1 to be able to hit a vampire}}{{Immunities=Immune to *Sleep, Charm,* and *Hold* spells, Paralysis and Poison. Spells based on cold or electricity cause only half damage}}{{Section3=**Special Disadvantages**}}{{Repellants=Odor of Strong Garlic; Mirror or Holy Symbol presented with conviction}}{{Holy Water or Symbol=Burns a vampire for 2-7 (1d6+1) damage with a successful hit}}{{Others=See Monsterous Compendium for other disadvantages}}RaceData=[w:Vampire, cattr:int=15:16|ac=1|mov=12|fly=18C|hd=8d8+3|thac0=11|attk1=4+1d6:Hand:0:B|dmgmsg=[Drains 2 levels](!magic ~~level-change \\amp#64;{target¦Who is the Victim?¦token_id}¦-2) on a successful hit with a hand,spattk:Energy drain,spdef:+1 weapon to hit; immune to *sleep, charm \\amp hold*, ns:5],[cl:PW,w:Charm Person,sp:1,lv:0,pd:-1],[cl:PW,w:Summon Swarm,sp:2,lv:0,pd:-1],[cl:PW,w:Gaseous Form,sp:0,lv:0,pd:-1],[cl:PW,w:MU-Shape-Change,sp:9,lv:0,pd:-1],[cl:PW,w:Spider Climb,sp:1,lv:0,pd:-1]{{Section9=**Description**}}{{desc=Of all the chaotic evil undead creatures that stalk the world, none is more dreadful than the vampire. Moving silently through the night, vampires prey upon the living without mercy or compassion. Unless deep underground, they must return to the coffins in which they pass the daylight hours, and even in the former case they must occasionally return to such to rest, for their power is renewed by contact with soil from their graves.\nOne aspect that makes the vampire far more fearful than many of its undead kindred is its appearance. Unlike other undead creatures, the vampire can easily pass among normal men without drawing attention to itself for, although its facial features are sharp and feral, they do not seem inhuman. In many cases, a vampire\'s true nature is revealed only when it attacks. There are ways in which a vampire may be detected by the careful observer, however. Vampires cast no reflection in a glass, cast no shadows, and move in complete silence.}}'},
{name:'War-Dog',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=War Dog}}RaceData=[w:War Dog, cattr:mov=12|ac=6|hd=2+2r5|size=M|attk1=2d4:Bite:0:P]{{subtitle=Creature}}Specs=[War Dog,CreatureRace,0H,Wild Dog]%{Race-DB-Creatures|Wild-Dog}{{AC=6}}{{Move=12}}{{Hit Dice=2+2 HD}}{{Attacks=Bite for 2d4}}{{Size=M}}{{Life Expectancy=5 to 7 years, exceptionally up to 12}}{{Section5=Keen senses of smell \\amp hearing}}{{desc8=Generally large mastiffs or wolfhounds, they have keen senses of smell and hearing, making them adept at detecting intruders. The status of war dogs varies greatly; some are loyal and beloved pets, some are watch dogs, others are hunting dogs, and some are trained for battle.}}{{desc9=**Combat:** Most war dogs are not usually vicious, and will rarely attack without cause.}}'},
{name:'Water-Elemental',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Water Elemental}}{{subtitle=Creature}}Specs=[Elemental,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Low (5-7)}}{{AC=2}}{{Alignment=Neutral}}{{Move=6, SW18 (on dry land never more than 60yds from water conjoured from)}}{{Hit Dice=8, 12, or 16}}{{THAC0=12, 9, or 7}}{{Attack=1 x 5d8 (On dry land, take 1 less damage per die)}}{{Languages=They rarely speak, but their voices can be heard in the crashing of waves on rocky shores and the howl of an ocean gale}}{{Size=L to H, [7+1d8](!\\amp#13;\\amp#47;r 7+1d8 feet height)feet,}}{{Life Expectancy=Unknown}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Special Defense=Only hit by +2 or better weapons}}RaceData=[w:Water Elemental, cattr:int=5:7|ac=2|mov=6|Swim=18|size=L|hd=8|thac0=12|attk1=5d8:Wave crash:0:B|attk2=\\lbrak;\\lbrak;{1d8-1\\amp#44;1d8-1\\amp#44;1d8-1\\amp#44;1d8-1\\amp#44;{1}\\amp#44;{1}\\amp#44;{1}\\amp#44;{1}\\rbrc;kh5\\rbrak;\\rbrak;:On dry land:0:B,spdef:+2 weapon or better to hit]{{Section9=**Description**}}{{desc=Water elementals can be conjured in any area containing a large amount of water or watery liquid. At least one thousand cubic feet of liquid is required to create a shell for the water elemental to inhabit. Usually a large pool serves this purpose, but several large kegs of wine or ale will do just as well.\nThe water elemental appears on the Prime Material Plane as a high-crested wave. The elemental\'s arms appear as smaller waves, one thrust out on each side of its main body. The arms ebb and flow, growing longer or shorter as the elemental moves. Two orbs of deep green peer out of the front of the wave and serve the elemental as eyes}}{{desc1=In combat, the water elemental is a dangerous adversary. It prefers to fight in a large body of water where it can constantly disappear beneath the waves and suddenly swell up behind its opponent.\nWhen the elemental strikes, it lashes out with a huge wave-like arm, doing 5-30 points of damage. Water elementals are also a serious threat to ships that cross their paths. A water elemental can easily overturn small craft (one ton of ship per hit die of the elemental) and stop or slow almost any vessel (one ton of ship per hit point of the elemental). Ships not completely stopped by an elemental will be slowed by a percentage equal to the ratio of ship\'s tons over the hit points of the attacking elemental.\nThough the water elemental is most effective in large areas of open water, it can be called upon to serve in a battle on dry land, close to the body of water from which it arose. However, the movement of the water elemental on land is the most restricted of any elemental type: a water elemental cannot move more than 60 yards away from the water it was conjured from, and 1 point of damage is subtracted from each die of damage they inflict out of the water (to a minimum of 1 point of damage per die)}}'},
{name:'Weasel',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Weasel}}RaceData=[w:Weasel, align:N, weaps:none, ac:none, cattr:int=1|mov=15|ac=6|hd=1-6r6|hp=2|thac0=20|size=S|attk1=1:Bite:0:P]{{subtitle=Creature}}Specs=[Weasel,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Animal (1)}}{{AC=6}}{{Alignment=Neutral}}{{Move=15}}{{Hit Dice=¼ HD}}{{THAC0=20}}{{Attacks=Bite for 1HP damage}}{{Size=S}}{{Life Expectancy=Short}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=Weasels, related to minks and stoats, are common predators, though they are hunted for their pelts, or for pets.}}'},
+ {name:'White-Dragon',type:'DragonRace',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}Specs=[White-Dragon,DragonRace,2H,Red-Dragon]{{}}RaceData=[w:White Dragon, cattr:int=5:7|mov=12|fly=40C|swim=12|ac=2-??1|hd=(11+??2)d8r1|mr=(v(^((??1-4);0);1)*(??1-4)*5)|cl=mu:white-dragon|lv=4+??1|thac0=9-??2|dmg=??1|size=G|attk1=1d6:Claw x 2 or Claw+Kick:0:S|attk2=2d8:Bite:0:P|attk3=2d6:Tail Swipe:0:B|attkmsg=Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$\\lbrak;Show the radius\\rbrak;\\lpar;!rounds ~~aoe `{selected¦token_id}¦arc180¦feet¦0¦\\lbrak;\\lbrak;`{selected¦age¦max}*7\\rbrak;\\rbrak;¦\\lbrak;\\lbrak;`{selected¦age¦max}*14\\rbrak;\\rbrak;¦black\\rpar; then up to \\lbrak;\\lbrak;`{selected¦age¦max}\\rbrak;\\rbrak; opponents in the area take damage and Save vs. Petrification with the penalty shown below or be \\lbrak;Stunned\\rbrak;\\lpar;!rounds ~~target area¦`{selected¦token_id}¦\\amp#64;{target¦Select the stunned creature¦token_id}¦Stunned¦\\lbrak;\\amp#91;1+1d4\\amp#93;\\rbrak;¦-1¦Stunned by a dragon tail slap¦back-pain\\rpar; for 1d4+1 rounds., spattk:*Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*, spdef:Magic resistance @{selected|monstermagicresist}% and immune to cold from birth, ns:=11],[cl:PW,w:White-Dragon-Breath,pd:-1,sp:1],[cl:PW,age:4,w:PW-Ice-Walking,pd:-1,sp:1],[cl:PW,age:7,w:MU-Gust-of-Wind,pd:3,sp:1],[cl:PW,w:MU-Wall-of-Fog,age:9,pd:3,sp:1],[cl:PW,w:PW-Freezing-Fog,age:11,pd:3,sp:1]{{}}%{Race-DB-Creatures|Red-Dragon}{{title=White}}{{Intelligence=Low (5-7)}}{{AC=Varies with age, adult white dragon is AC -1}}{{Move=12, FL 40(C), Sw 12}}{{Hit Dice=Varies with age, adult white dragon is 13 HD}}{{THAC0=Varies with age, adult white dragon is 7}}{{Section1=**Attacks:** Damage bonus varies with age, adult white dragon is +6. 2 x Claws for 1d6 HP each, possibly with 1 or 2 kicks for 1d6 each, bite for 2d8, and tail slap for 2d6 and possible *stun* within an area varying with age. Several other attacks possible - see *Powers*}}{{Languages=*White Dragon* and *Evil Dragon Common*, and 7% of hatchlings (+5% per age level) can perform universal communication with any intelligent creature}}{{Breath Weapon=A white dragon\'s breath weapon is a come of frost 70\' long, 5\' wide at the dragon\'s mouth, and 25\' wide at the base. Damage varies by age from 1d6+1 to 12d6+12. Save vs. Breath Weapon to take half damage}}{{Spell Casting=Knows a number of random wizard spells cast at a level from 10 to 16 varying with age. All spells are cast at a speed of 1 segment regardless of the spell}}{{Spell-like Powers=*Juvenile* dragons can do *ice walking* at will, *Mature Adults* can do *Gust of Wind* x 3 a day, a *Very Old* dragon gains *Wall of Fog* 3 x a day, producing snow or hail instead of rain, and a *Wyrm* dragon gains *Freezing Fog* x 3 per day}}{{desc8=**White Dragons:** White dragons, the smallest and weakest of the evil dragons, are slow witted but efficient hunters. They are impulsive, vicious, and animalistic, tending to consider only the needs and emotions of the moment and having no foresight or regret. Despite their low intelligence, they are as greedy and evil as the other evil dragons.\nThe scales of a hatchling white dragon are a mirror-like glistening ground. As the dragons ages, the sheen disappears, and by the time it reaches the very old stage, scales of pale blue and light gray are mixed in with the white.\nWhite dragons live in chilly or cold regions, preferring lands where the temperature rarely rises above freezing and ice and snow always cover the ground. When temperatures become too warm, the dragons become lethargic. White dragons bask in the frigid winds that whip over the landscape, and they wallow and play in deep snow banks.\nWhite dragons are lackadaisical parents. Although the young remain with the parents from hatchling to juvenile or young adult stage they are not protected. Once a dragon passes from it hatchling stage, it must fend for itself, learning how to hunt and defend itself, learning how to hunt and defend itself by watching the parents.\nWhite dragons\' lairs are usually icy caves and deep subterranean chambers; they select caves that open away from the warming rays of the sun. White dragons store all of their treasure within their lair, and prefer keeping it in caverns coated in ice, which reflect the gems, especially diamonds, because they are pretty to look at.}}{{desc9=**Combat:** Regardless of a target\'s size, a white dragon\'s favorite method of attack is to use its breath weapon and special abilities before closing to melee. This tactic sometimes works to the dragon\'s detriment, as it can exhaust its breath weapon on smaller prey and then be faces with a larger creature it must attack physically. If a white dragon is pursuing creatures in the water, such as polar bears or seal, it will melee them in their element, fighting with its claws and bite.}}'},
{name:'Wight',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Wight}}{{subtitle=Creature}}Specs=[Wight,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Average (8-10)}}{{AC=5}}{{Alignment=Lawful Evil}}{{Move=12}}{{Hit Dice=4+3}}{{THAC0=15}}{{Attack=Touch for 1d4, and drain 1 level}}{{Languages=None known}}{{Size=M 4 to 7ft tall}}{{Life Expectancy=Already dead!}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Level Drain=If successfully touch their victim, as well as damage, drain 1 level of experience permanently}}{{Attack Immunity=Only hit by silver or magically enchanted weapons of +1 or better}}{{Spell Immunity=Subject to all attack forms except *sleep, charm* \\amp *hold* spells, and all cold-based attacks}}{{Other Immunities=Immune to paralysation and poison}}{{Infravision=No need for light (dead eyes) so can "sense" normally in absolute darkness}}{{Section6=**Special Disadvantages**}}{{Avoids Bright Light=Cannot tolerate bright light, including sunlight, and avoid it at all costs, but is not damaged by it}}RaceData=[w:Wight, align:LE, cattr:int=8:10|mov=12|ac=5|size=M|hd=4+3r3|thac0=15|attk1=1d4:Touch:0:S|dmgmsg=On successful hit opponents \\lbrak;lose one level\\rbrak;\\lpar;!magic ~~level-change \\amp#64;{target¦Who\'s the Victim?¦token_id}¦-1\\rpar; of Experience. Remember immune to Sleep Charm Hold \\amp Cold. +1 or better weapons to hit, spattk:Drain 1 level of experience per successful hit, spdef:+1 or better weapons to hit]{{Section9=**Description**}}{{desc=Typically inhabit barrow mounds and catacombs. From a distance, wights can easily be mistaken for any number of humanoid races. Upon closer examination, however, their true nature becomes apparent. As undead creatures, wights are nightmarish reflections of their former selves, with cruel, burning eyes set in mummified flesh over a twisted skeleton with hands that end in sharp claws.}}{{desc1=**Combat:** Wights are fierce and deadly foes in combat. When attacked, they are unharmed by any weapons that are not forged from silver or enchanted in some manner.\nThe wight attacks with its jagged claws and powerful blows, inflicting 1-4 points of damage with each successful strike. In addition to this physical harm, the wight is able to feed on the life essence of its foes. Each blow that the wight lands drains one level from the victim, reducing Hit Dice, class bonuses, spell abilities, and so forth.}}'},
{name:'Wild-Dog',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Wild Dog}}RaceData=[w:Wild Dog, align:N, weaps:none, ac:none, cattr:int=2:4|mov=15|ac=7|hd=1+1r6|thac0=19|size=S|attk1=1d4:Bite:0:P]{{subtitle=Creature}}Specs=[Wild Dog,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Semi (2 to 4)}}{{AC=7}}{{Alignment=Neutral}}{{Move=15}}{{Hit Dice=1+1 HD}}{{THAC0=19}}{{Attacks=Bite for 1d4}}{{Size=S}}{{Languages=}}{{Life Expectancy=5 to 7 years, exceptionally up to 12}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=Smaller than wolves, the appearance of the wild dog varies from place to place. Most appear very wolf-like, while others seem to combine the looks of a wolf and a jackal. Found almost anywhere, they run in packs, and are led by the dominant male. The pack usually hunts a variety of game, even attacking deer or antelope. Pups are born in the spring. Wild dogs can be tamed if separated from their pack.}}{{desc9=**Combat:** Wild dogs fight as an organized pack. They favor small game, and attack men and human habitations only in times of great hunger. Wild dogs are omnivores which usually thrive on a combination of hunting and foraging.}}'},
{name:'Wild-Eagle',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Wild Eagle}}RaceData=[w:Eagle, align:N, weaps:none, ac:none, spattk:Dive attack at +2 to hit and double dmg. Cannot be surprised, cattr:int=1|mov=1|fly=30|ac=6|hd=1+3r6|thac0=19|size=S|attk1=1d2:Talon1:0:S|attk2=1d2:Talon2:0:S|attk3=1:Beak:0:P|attkmsg=If diving from more than 100ft +2 to hit and inflicts double damage with talons but does not get a beak attack|dmgmsg=Double damage if diving from more than 100ft$$Double damage if diving from more than 100ft$$Cannot attack with beak if diving from height]{{subtitle=Creature}}Specs=[Wild Eagle,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Animal (1)}}{{AC=6}}{{Alignment=Neutral}}{{Move=1, FL 30(C)}}{{Hit Dice=1+3 HD}}{{THAC0=19}}{{Attacks=2 x Talons for 1d2 each, Beak for 1HP. Double damage with talons if diving from more than 100ft, but does not get a beak attack}}{{Size=S}}{{Life Expectancy=20 to 30 years in the wild}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Surprise=Due to eyesight, hearing, and other factors, cannot be surprised}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=Owls hunt rodents, small lizards, and insects, attacking humans only when frightened (or magically commanded).\nEagles mate for life and, since they nest in one spot, it is easy to identify places where eagles are normally present. On occasion, in an area of rich feeding, 1d8+4 eagles are encountered instead of the normal individual or pair.}}{{desc9=**Combat:** An eagle typically attacks from great heights, letting gravity hurtle it toward its prey. If an eagle dives more than 100 feet, its diving speed is double its normal flying speed and the eagle is restricted to attacking with its claws. These high-speed attacks gain a +2 attack bonus and double damage.\nEagles generally hunt rodents, fish, and other small animals. Eagles also feed on the carrion of recently killed creatures as well. Eagles never attack humanoids, though small creatures like brownies have to be wary of a hunting eagle.}}'},
{name:'Wild-Horse',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Wild Horse, cattr:hd=2r5|thac0=19|attk1=1d3:Bite:0:P]{{}}Specs=[Wild Horse,CreatureRace,0H,Horse]{{}}%{Race-DB-Creatures|Horse}{{name=(Wild)}}{{Attacks=Bite for 1d3}}{{Hit Dice=2HD}}{{THAC0=19}}{{desc8=**Wild Horse:** Wild horses can be captured and trained to serve as mounts or work ponies. Training usually takes twice as long as training a domestic horse. Wild horses are hardy but jittery, and difficult to catch in the wild. They are sometimes hunted for food by human and demihuman tribes.}}{{desc9=**Combat:** Wild horses fight only if cornered. They can only bite once per round. They can be panicked by loud noises, strange smells, fire, or sudden movements 90% of the time.}}'},
{name:'Wind-Walker',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Wind Walker}}RaceData=[w:Wind Walker, align:N, weaps:none, ac:none, cattr:int=11:12|mov=15|fly=30A|ac=7|hd=6+3r3|thac0=13|size=L|attk1=3d6:Wind Force:0:B|attkmsg=Damage is done to everybody who is successfully hit within 10ft diameter of Wind Walker,spattk:Attacks everybody within 10ft diameter every round,spdef:Can only be hit by +3 weapons or other creatures from the Plane of Air. Only *control weather; slow; haste; ice storm* and similar spells have any effect]{{subtitle=Creature}}Specs=[Wind Walker,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Very (11-12))}}{{AC=7}}{{Alignment=Neutral}}{{Move=15 FL30(A)}}{{Hit Dice=6+3 HD}}{{THAC0=13}}{{Attacks=All within 5ft radius are attacked by Wind Force for 3d6}}{{Size=L}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Immunity=Immune to all spells other than weather based spells such as *control weather* (save vs. magic or wind walker is killed), *ice storm* (drives away for 1-4 melee rounds), and *slow* (does damage like a *fireball*, but *haste* doubles damage done by the wind walker}}{{Resistance=Only hit by +3 or better weapons, or by creatures from the etherial plane of air}}{{Telepathy=Able to communicate telepathically with other wind walkers, and can detect thoughts of others within 10" to 30"}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=Wind walkers are creatures from the elemental plane of air, and on the material plane prefer to live high in mountains or in great caverns very far below the surface. Their approach is detectable at from 10”-30” as a whistling, howling or roaring depending on the number coming. These monsters are telepathic and can detect thoughts within 10”-30” (as they work in series to boost range).\nThey attack by wind force, each wind walker causing 3-18 points of damage per turn to all creatures within 1” of them who are hit. Being ethereal, wind walkers can be fought only by such creatures as djinn, efreet, invisible stalkers, or aerial servants, or affected by spells such as control weather (unless save is made versus magic, the monster dies), slow (affects monster like a fire ball), and ice storm (drives them away for 1-4 melee rounds). Haste does one-half damage to wind walkers, but it also doubles the amount of damage done by the wind walkers. Magical barriers will stop them, but wind walkers will otherwise pursue for 2-5 melee rounds minimum. They are subject to attack by telepathy. Wind walkers are sometimes forced into servitude by storm giants (for obvious reasons).}}'},
+ {name:'Winter-Wolf',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{}}RaceData=[w:Winter Wolf, align:NE, weaps:none, ac:none, cattr:int=8:10|ac=5|hd=6r3|thac0=15|size=L|attk1=2d4:Bite:0:P|attk2=6d4:Breath Weapon:0:SPB|attkmsg=$$The breath weapon automatically hits every creature \\lbrak;within 10ft\\rbrak;\\lpar;!rounds ~~target caster¦`{selected¦token_id}¦Attk2-Interval¦9¦-1¦Waiting to get breath back¦stopwatch ~~aoe `{selected¦token_id}¦arc180¦feet¦0¦10¦20¦cold¦true) doing damage - save vs. breath to halve, spdef:Immune to cold attacks but fire does an extra 1HP per die of damage]{{}}Specs=[Winter Wolf,CreatureRace,0H,Wolf]{{}}%{Race-DB-Creatures|Wolf}{{title=Winter}}{{Intelligence=Average (8 to 10)}}{{AC=5}}{{Alignment=Neutral Evil}}{{Hit Dice=6 HD}}{{THAC0=15}}{{Attacks=Bite for 2d8, Breath once every 10 rounds, 10ft arc, for 6d4 HP, save vs. breath to halve}}{{Size=L}}{{Section3=**Breath Weapon:** Living only in chill regions, they can unleash a stream of frost from their lungs once every 10 rounds, causing 6d4 points of damage to everything within 10 feet. A save vs. breath weapon is allowed for half damage.}}{{Section5=**Immune** to cold based attacks}}{{Section7=**Fire attacks** do 1HP extra per die of damage}}{{desc7=**Winter Wolves:** The most dangerous member of the species, the winter wolf is known for its great size and foul disposition. Living only in chill regions, they can unleash a stream of frost from their lungs once every 10 rounds, causing 6d4 points of damage to everything within 10 feet. A save vs. breath weapon is allowed for half damage. Cold-based attacks to not harm the winter wolf, but fire-based attacks cause an additional point of damage, per die of damage. Winter wolves are more intelligent than their cousins and, in addition to being able to communicate with worgs, have a fairly sophisticated language of their own. \nThe winter wolf is beautiful, with glistening white or silver fur and eyes of pale blue or silver. If in good condition, a pelt is worth 5,000 gold pieces.}}'},
{name:'Wolf',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Wolf}}RaceData=[w:Wolf, align:N, weaps:none, ac:none, cattr:int=2:4|mov=18|ac=7|hd=3r4|thac0=18|size=S|attk1=1+1d4:Bite:0:P]{{subtitle=Creature}}Specs=[Wolf,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Semi (2 to 4)}}{{AC=7}}{{Alignment=Neutral}}{{Move=18}}{{Hit Dice=3 HD}}{{THAC0=18}}{{Attacks=Bite for 1+1d4}}{{Size=S}}{{Life Expectancy=10 to 20 years}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=None}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=The wolf is a very active, cunning carnivore, capable of surviving in nearly every climate. Shrouded in mystery and suspicion, they are viewed as vicious killers that slaughter men and animals alike for the lack of better things to do. The truth is that never in recorded history has a non-rabid or non-charmed wolf attacked any creature having an equal or higher intellect than itself.}}{{desc9=**Combat:** Wolves hunt in packs during winter and late fall when only large herbivores are available. Wolves prefer small prey over the larger variety, because of the amount of energy required to run them down. Even then, they catch only the weak and sickly animals. Wolves usually hunt only one large quarry per week, per pack, going without food for days at a time. During summer months, a single wolf can consume over 30 mice in a single day.\nIf a wolf or wolf pack is attacked by humans, they run away, looking back momentarily to make sure they are not being followed. If backed into an inescapable location, they will attack by tearing at clothing or legs and arms until they have an opening to escape.}}'},
{name:'Wolverine',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Wolverine}}RaceData=[w:Wolverine, align:N, weaps:none, ac:none, cattr:int=1|mov=12|ac=5|hd=3r4|thac0=17|size=S|tohit=+4|attk1=1d4:Claw1:0:S|attk2=1d4:Claw2:0:S|attk3=1+1d4:Bite:0:P]{{subtitle=Creature}}Specs=[Wolverine,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Animal (1)}}{{AC=5}}{{Alignment=Neutral}}{{Move=12}}{{Hit Dice=3 HD}}{{THAC0=17}}{{Attacks=2 x Claws for 1d4, Bite for 1+1d4. Ferocious in battle, giving +4 to attacks}}{{Size=S}}{{Life Expectancy=Short}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Section5=*Ferocious in battle* giving the Wolverine +4 to attack when in battle}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc8=The wolverine, also referred to as the glutton, carcajou, or quickhatch, is the largest land-dwelling species of the family Mustelidae. It is a muscular carnivore and a solitary animal.}}'},
{name:'Wraith',type:'CreatureRace',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Wraith}}{{subtitle=Creature}}Specs=[Wraith,CreatureRace,0H,Creature]{{Section=**Attributes**}}{{Intelligence=Very (11-12)}}{{AC=4}}{{Alignment=Lawful Evil}}{{Move=12, FL24(B)}}{{Hit Dice=5+3}}{{THAC0=15}}{{Attack=Touch for 1d6, and drain 1 level}}{{Languages=cannot communicate, except through a speak with dead spell. They do not even seem to communicate with each other, except as master to slave for combat strategy. Any attempt to speak to a wraith is met with scorn, unless by a very powerful party}}{{Size=M, 6ft tall}}{{Life Expectancy=Already dead!}}{{Section2=**Powers**}}{{Section3=None}}{{Section4=**Special Advantages**}}{{Level Drain=If successfully touch their victim, as well as damage, drain 1 level of experience permanently}}{{Attack Immunity=Only hit by silver (half damage) or magically enchanted weapons of +1 or better}}{{Spell Immunity=Subject to all attack forms except *sleep, charm, hold* \\amp *death* spells, and all cold-based attacks}}{{Other Immunities=Immune to paralysation and poison}}{{Infravision=No need for light (dead eyes) so can "sense" normally in absolute darkness}}{{Section6=**Special Disadvantages**}}{{Avoids Bright Light=Cannot tolerate bright light, including sunlight, and cannot attack in it, but is not damaged by it}}RaceData=[w:Wraith, align:LE, cattr:int=11:12|mov=12|fly=24(B)|ac=4|size=M|hd=5+3r3|thac0=15|attk1=1d6:Touch:0:S|dmgmsg=On successful hit opponents \\lbrak;lose one level\\rbrak;\\lpar;!magic ~~level-change \\amp#64;{target¦Who\'s the Victim?¦token_id}¦-1\\rpar; of Experience. Remember immune to Sleep Charm Hold Death \\amp Cold. Silver (half-damage) or +1 or better weapons to hit, spattk:Drain 1 level of experience per successful hit, spdef:+1 or better weapons to hit]{{Section9=**Description**}}{{desc=The wraith is an evil undead spirit of a powerful human that seeks to absorb human life energy. These horrible creatures are usually seen as black, vaguely man-shaped clouds. They have no true substance, but tend to shape themselves with two upper limbs, a torso, and a head with two glowing red eyes. This shape is a convenience born from the habit of once having a human body.}}{{desc1=**Combat:** The touch of a wraith does damage in two ways. First, the chilling effect of the touch inflicts 1-6 points of damage, even to creatures immune to cold. Second, such a hit drains a level of experience from its victim.\nA wraith slowly regains its full hit points if left alone for at least a week (recovering one point every eight hours). A vial of holy water causes 2-8 points of damage (as acid) upon striking the body of a wraith. A *raise dead* spell will utterly destroy one if a saving throw vs. spell is failed.}}'},
@@ -1389,25 +1512,36 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Unlocked-Lock',type:'Ability',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.messageTemplate+'}{{name=^^chest^^ Unlocked}}Specs=[Unlocked-Lock,Ability,0H,Lock-Unlocked]{{desc=You have successfully overcome the lock. Do you want to open ^^chest^^?\n[Yes](!magic --display-ability w|@{^^chest^^|Thief}|^^chestid^^|Trap-@{^^chest^^|trap-status}) or [No](!magic --display-ability w|@{^^chest^^|Thief}|^^chestid^^|Container-@{^^chest^^|trap-status}). Or you can just walk away...}}\n!setattr --silent --charid ^^chestid^^ --trap-version|2 --trap-status||Unlocked'},
{name:'Wizard-Spell-Trap',type:'Trap|Ability',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.warningTemplate+'}{{title=^^chest^^\'s Trap is Triggered}}Specs=[Wizard-Spell-Trap,Trap|Ability,0H,Triggered]{{desc=Tinkering with the ^^chest^^ without disarming the trap has triggered it, and a *@{^^chest^^|trap-var1}* fills the area!}}AbilityData=[w:Wizard Spell Trap, magical:1, tvar1:Stinking-Cloud%%Wizard Spell, tvar2:6%%Casting Level, tvar3:square%%AoE Shape, tvar4:20%%AoE Length, tvar5:20%%AoE Width, tvar6:acid%%AoE type, ns:8],[cl:AB,w:No-Lock-Is-Trapped],[cl:AB,w:Found-Magical-Trap],[cl:AB,w:Remove-Magical-Trap-Roll],[cl:AB,w:Trap-is-Locked],[cl:AB,w:Trap-is-Unlocked],[cl:AB,w:Trap-Remains],[cl:AB,w:Reset-Trap],[cl:AB,w:Close-Container,action:1]{{GM Desc=This trap sets off any wizard spell the GM desires when triggered, and can display an area of effect with an appropriate area of effect image (for a list \\amp description of the area of effect function and available images, see the "Area of Effect" command documentation in the RoundMaster Help handout).\nTo specify the spell that is cast, and the area of effect of that spell, select the container token and use the GM\'s [Token Setup] button, or use the **!cmd --abilities** command}}\n!setattr --silent --charid ^^chestid^^ --casting-level|@{^^chest^^|trap-var2} --casting-name|^^chest^^\n!rounds --aoe @{^^chest^^|chest}|@{^^chest^^|trap-var3}|feet|0|@{^^chest^^|trap-var4}|@{^^chest^^|trap-var5}|@{^^chest^^|trap-var6}|true\n!magic --display-ability gm|@{^^chest^^|chest}|MU-Spells-DB|@{^^chest^^|trap-var1}'},
]},
- Class_DB: {bio:'Character Class Database v2.05 11/07/2023
This sheet holds definitions of Character Classes that can be used by the RPGMaster API system. The definitions includes valid alignments and races, hit dice, the weapons & armour each class can use, the types of spells usable by the class (if any), and the powers that the class gets. Depending on API configuration, the APIs can restrict characters of a particular class to these specifications, or not as desired.',
- gmnotes:'Change Log: v2.02-5 11/07/2023 Added classes in support of creatures in Creatures database v2.01 25/09/2022 Moved to RPGM Library and updated templates v1.06 14/07/2022 Removed hard-coded whisper commands on database entries as now directed to correct player(s) programmatically v1.05 11/05/2022 Added Priest of the Sea as a possible Priest class. v1.03 23/02/2022 Initial release with classes defined in the Players Handbook',
+ Class_DB: {bio:'Character Class Database v2.06 29/09/2023
This sheet holds definitions of Character Classes that can be used by the RPGMaster API system. The definitions includes valid alignments and races, hit dice, the weapons & armour each class can use, the types of spells usable by the class (if any), and the powers that the class gets. Depending on API configuration, the APIs can restrict characters of a particular class to these specifications, or not as desired.',
+ gmnotes:'Change Log: v2.06 29/09/2023 Added classes to support some giants and chromatic & metalic dragons v2.02-5 11/07/2023 Added classes in support of creatures in Creatures database v2.01 25/09/2022 Moved to RPGM Library and updated templates v1.06 14/07/2022 Removed hard-coded whisper commands on database entries as now directed to correct player(s) programmatically v1.05 11/05/2022 Added Priest of the Sea as a possible Priest class. v1.03 23/02/2022 Initial release with classes defined in the Players Handbook',
root:'Class-DB',
api:'attk,magic',
type:'class',
controlledby:'all',
avatar:'https://s3.amazonaws.com/files.d20.io/images/141880538/q9us_ihVJqijf8PpphgrqQ/max.png?1591624422',
- version:2.05,
+ version:2.06,
db:[{name:'Abjurer',type:'WizardClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Abjurer}}{{subtitle=Wizard Class}}{{Min Abilities=Int:[[9]], Wis:[[15]]}}{{Alignment=Any}}{{Race=Human only}}{{Hit Dice=1d4}}Specs=[Abjurer,WizardClass,0H,Wizard]{{=**Spells**}}{{Specialist=Abjuration}}{{Banned=Alteration \\amp Illusion}}ClassData=[w:Wizard, hd:1d4, race:human, sps:abjuration, spb:alteration|illusion, weaps:dagger|staff|dart|knife|sling, ac:magicitem|ring|cloak]{{desc=Spells of this school focus magical energies to provide protection. This protection can take a number of forms, including warding off specific types of weapons or creatures and discouraging or dispelling enemies. The school also includes a variety of spells involving avoidance and repellence. Abjuration spells concentrate on eliminating or hindering sources of potential harm rather than repairing damage.}}'},
{name:'Assassin',type:'RogueKitClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Assassin}}{{subtitle=Rogue Class}}{{Min Abilities=Dex:[[12]], Int:[[11]], Str:[[12]]}}{{Race=Any}}{{Hit Dice=1d6}}{{Alignment=Any not Good (most are some form of Evil)}}Specs=[Assassin,RogueKitClass,0H,Rogue]{{Skills=Thieving Abilities *Pick Pockets, Open Locks, Find/Remove Traps, Move Silently, Hide in Shadows, Detect Noise, Climb Walls,* and *Read Languages*, but only with reduced percentage points to allocate. Also, Assassins can *Backstab*.\nHave a chance to *Identify Poisons*}}ClassData=[w:Assassin, hd:1d6, align:ln|nn|n|cn|le|ne|ce, weaps:any, ac:padded|leather|studdedleather|elvenchain|magicitem|ring|cloak]{{desc=In any reasonably corrupt culture, there are those who wish to eliminate someone whose very existence stands in the way of their plans. To serve them there are Assassins: trained killers whose services are for hire.\nIn the AD\\ampD(R) 2nd Edition Players\' Handbook, the idea of an assassin, a hired killer, has been divorced from any particular character class. Indeed, a character can be any class and still be an assassin; this thief kit simply shows how a thief can be converted into an efficient, discreet killer. Characters of other classes still can (and often will) be assassins, so it would be best not to let down one\'s guard . . .}}{{Reference=*The Complete Thief\'s Handbook* Assassin Kit}}'},
{name:'Bard',type:'RogueClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Bard}}{{subtitle=Rogue Class}}{{Min Abilities=Dex:[[12]], Int:[[13]], Chr:[[15]]}}{{Race=Human or Half Elf}}{{Hit Dice=1d6}}{{Alignment=Any Neutral}}Specs=[Bard,RogueClass,0H,Rogue]{{Skills=Bardish Abilities *Pick Pockets, Detect Noise, Climb Walls,* and *Read Languages*. Can cast some wizard spells from 2nd Level (less likely to be Combat-type spells)}}ClassData=[w:Bard, hd:1d6, race:human|halfelf, align:ng|nn|n|ne|ln|cn, weaps:any, ac:padded|leather|hide|brigandine|ringmail|scalemail|chainmail|ring|magicitem|cloak, sps:any, slv:6|1|100|MU, spl1:0|1|2|2|3|3|3|3|3|3|3|3|3|3|3|4|4|4|4|4, spl2:0|0|0|1|1|2|2|3|3|3|3|3|3|3|3|3|4|4|4|4, spl3:0|0|0|0|0|0|1|1|2|2|3|3|3|3|3|3|3|4|4|4, spl4:0|0|0|0|0|0|0|0|0|1|1|2|2|3|3|3|3|3|4|4, spl5:0|0|0|0|0|0|0|0|0|0|0|0|1|1|2|2|3|3|3|4, spl6:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|2|2|3]{{desc=The bard is an optional character class that can be used if your DM allows. He makes his way in life by his charm, talent, and wit. A good bard should be glib of tongue, light of heart, and fleet of foot (when all else fails).\nIn precise historical terms, the title "bard" applies only to certain groups of Celtic poets who sang the history of their tribes in long, recitative poems. These bards, found mainly in Ireland, Wales, and Scotland, filled many important roles in their society. They were storehouses of tribal history, reporters of news, messengers, and even ambassadors to other tribes. However, in the AD\\ampD game, the bard is a more generalized character. Historical and legendary examples of the type include Alan-a-Dale, Will Scarlet, Amergin, and even Homer. Indeed, every culture has its storyteller or poet, whether he is called bard, skald, fili, jongleur, or something else.}}'},
+ {name:'Black-Dragon',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{}}Specs=[Black-Dragon,CreatureClass,0H,Red-Dragon]{{}}ClassData=[w:Black Dragon, slv:1|1|16|MU, spl1:0|0|0|0|0|0|0|1|2|3|4|5|6|7|8|9, ns:1]{{}}%{Class-DB|Red-Dragon}{{prefix=Black }}{{Hit Dice=As Black Dragon}}'},
+ {name:'Blue-Dragon',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{}}Specs=[Blue-Dragon,CreatureClass,0H,Red-Dragon]{{}}ClassData=[w:Blue Dragon, slv:3|1|18|MU, sps:any, spl1:0|0|0|0|0|0|0|0|0|1|2|3|3|3|3|3|3|3, spl2:0|0|0|0|0|0|0|0|0|0|0|0|1|2|3|3|3|3, spl3:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|3],[w:Blue Dragon, sps:any, slv:1|1|18|PR, spl1:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|3, ns:5],{{}}%{Class-DB|Red-Dragon}{{prefix=Blue }}{{Hit Dice=As Blue Dragon}}'},
+ {name:'Brass-Dragon',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{}}Specs=[Brass-Dragon,CreatureClass,0H,Red-Dragon]{{}}ClassData=[w:Brass Dragon, slv:2|1|17|MU, sps:any, spl1:0|0|0|0|0|0|0|0|0|1|1|2|3|3|4|4|5, spl2:0|0|0|0|0|0|0|0|0|0|1|1|2|3|3|4|4],[w:Brass Dragon, sps:any, slv:2|1|17|PR, spl1:0|0|0|0|0|0|0|0|0|0|0|0|1|1|2|2|3, spl2:0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|2|2, ns:5],{{}}%{Class-DB|Red-Dragon}{{prefix=Brass}}{{Hit Dice=As Brass Dragon}}{{Alignment=Chaotic Good (Neutral)}}'},
+ {name:'Bronze-Dragon',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{}}Specs=[Bronze-Dragon,CreatureClass,0H,Red-Dragon]{{}}ClassData=[w:Bronze Dragon, slv:5|1|19|MU, sps:any, spl1:0|0|0|0|0|0|0|0|0|0|1|1|2|2|2|2|2|2|2, spl2:0|0|0|0|0|0|0|0|0|0|0|1|1|2|2|2|2|2|2, spl3:0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|2|2|2, spl4:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|2, spl5:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1],[w:Bronze Dragon, sps:any, slv:3|1|19|PR, spl1:0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|2|2|2, spl2:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|2|2, spl3:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1, ns:5],{{}}%{Class-DB|Red-Dragon}{{prefix=Bronze}}{{Hit Dice=As Bronze Dragon}}{{Alignment=Lawful Good}}'},
{name:'Cleric',type:'PriestClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Cleric}}{{subtitle=Priest Class}}{{Min Abilities=Wis:[[9]]}}{{Race=Any}}{{Hit Dice=1d8}}{{ =**Alignment**}}{{Deity=Any}}{{Priests=Any}}{{Flock=Any}}Specs=[Cleric,PriestClass,0H,Priest]{{Powers=*Turn Undead*}}{{ =Spells}}{{Major Spheres=All, Astral, Charm, Combat, Creation, Divination, Guardian, Healing, Necromantic, Protection, Summoning, and Sun}}{{Minor Spheres=Elemental}}ClassData=[w:Cleric, hd:1d8, weaps:clubs|flails|staff|slings, ac:any, sps:all|astral|charm|combat|creation|divination|guardian|healing|necromantic|protection|summoning|sun, spm:elemental, ns:1],[cl:PW, w:Turn-Undead, lv:1, pd:-1]{{desc=The most common type of priest is the cleric. The cleric may be an adherent of any religion (though if the DM designs a specific mythos, the cleric\'s abilities and spells may be changed--see following). Clerics are generally good, but are not restricted to good; they can have any alignment acceptable to their order.\nThe cleric class is similar to certain religious orders of knighthood of the Middle Ages: the Teutonic Knights, the Knights Templars, and Hospitalers. These orders combined military and religious training with a code of protection and service. Members were trained as knights and devoted themselves to the service of the church. These orders were frequently found on the outer edges of the Christian world, either on the fringe of the wilderness or in war-torn lands. Archbishop Turpin (of The Song of Roland) is an example of such a cleric. Similar orders can also be found in other lands, such as the sohei of Japan.}}'},
{name:'Conjurer',type:'WizardClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Conjurer}}{{subtitle=Wizard Class}}{{Min Abilities=Int:[[9]], Con:[[15]]}}{{Alignment=Any}}{{Race=Human \\amp Half Elf}}{{Hit Dice=1d4}}Specs=[Conjurer,WizardClass,0H,Wizard]{{=**Spells**}}{{Specialist=Conjuration / Summoning}}{{Banned=Greater Divination \\amp Invocation}}ClassData=[w:Conjurer, hd:1d4, race:human|halfelf, sps:conjuration|summoning|conjurationsummoning, spb:greaterdivination|invocation, weaps:dagger|staff|dart|knife|sling, ac:magicitem|ring|cloak]{{desc=This school includes two different types of magic, though both involve bringing in matter from another place. Conjuration spells produce various forms of nonliving matter. Summoning spells entice or compel creatures to come to the caster, as well as allowing the caster to channel forces from other planes. Since the casting techniques and ability requirements are the same for both types of magic, conjuration and summoning are considered two parts of the same school.}}'},
- {name:'Creature',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Creature}}{{subtitle=Warrior Class}}{{Min Abilities=None}}{{Alignment=Any}}{{Race=Any}}Specs=[Creature,CreatureClass,0H,Creature]{{Powers=None}}{{Hit Dice=1d8}}ClassData=[w:Creature, align:any, race:any, hd:1d8, weaps:any, ac:any]{{desc=A creature can be any type of monster, pet, war-trained animal, woodland beast or dungeon denizen. It can have weapon use and armour, be intelligent, speak some or many languages, and be everything any other NPC or PC can be. Generally, it uses the Monster tab on Character Sheets. A specific class of creature can be specified by giving it a Race and defining a Class Database entry for that Race}}'},
+ {name:'Copper-Dragon',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{}}Specs=[Copper-Dragon,CreatureClass,0H,Red-Dragon]{{}}ClassData=[w:Copper Dragon, slv:4|1|18|MU, sps:any, spl1:0|0|0|0|0|0|0|0|0|1|2|3|3|3|3|3|3|3, spl2:0|0|0|0|0|0|0|0|0|0|0|0|1|2|3|3|3|3, spl3:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|2, spl4:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1],[w:Copper Dragon, sps:any, slv:2|1|18|PR, spl1:0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|3|3|3, spl2:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|3, ns:5],{{}}%{Class-DB|Red-Dragon}{{prefix=Copper}}{{Hit Dice=As Copper Dragon}}{{Alignment=Chaotic Good}}'},
+ {name:'Creature',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Creature}}{{subtitle=Warrior Class}}{{Min Abilities=None}}{{Alignment=Any}}{{Race=Any}}Specs=[Creature,CreatureClass,0H,Creature]{{Powers=None}}{{Hit Dice=1d8}}ClassData=[w:Creature, align:any, race:any, hd:1d8, weaps:any, ac:any, npp:0, twp:0.0]{{desc=A creature can be any type of monster, pet, war-trained animal, woodland beast or dungeon denizen. It can have weapon use and armour, be intelligent, speak some or many languages, and be everything any other NPC or PC can be. Generally, it uses the Monster tab on Character Sheets. A specific class of creature can be specified by giving it a Race and defining a Class Database entry for that Race}}'},
{name:'Diviner',type:'WizardClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Diviner}}{{subtitle=Wizard Class}}{{Min Abilities=Int:[[9]], Wis:[[16]]}}{{Alignment=Any}}{{Race=Human, Elf \\amp Half Elf}}{{Hit Dice=1d4}}Specs=[Diviner,WizardClass,0H,Wizard]{{=**Spells**}}{{Specialist=Greater Divination}}{{Banned=Conjuration / Summoning}}ClassData=[w:Diviner, hd:1d4, race:human|elf|halfelf, sps:greaterdivination, spb:conjurationsummoning|conjuration|summoning, weaps:dagger|staff|dart|knife|sling, ac:magicitem|ring|cloak]{{desc=This school includes a variety of spells that reveal information that would otherwise remain hidden or secret. Greater divination spells reveal the existence of specific items, creatures, or conditions, as well as information about the past, present, and future. This school also includes spells that contact creatures from other planes of existence, but do not induce direct action from those creatures.}}'},
{name:'Druid',type:'PriestClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Druid}}{{subtitle=Priest Class}}{{Min Abilities=Wis:[[12]], Chr:[[15]]}}{{Race=Human or Half Elf}}{{Hit Dice=1d8}}{{=**Alignment**}}{{Deity=Neutral}}{{Priests=Neutral}}{{Flock=Neutral}}Specs=[Druid,PriestClass,0H,Priest]{{ =**Powers**}}{{3rd Level=*Identify Plants \\amp Animals \\amp Pure Water, Pass Without Trace, Speak a Woodland Language* (1/level)}}{{7th Level=*Immune to woodland charm, Shapechange to Normal Animal* (3/day)}}{{ =**Spells**}}{{Major Spheres=All, Animal, Elemental, Healing, Plant, and Weather}}{{Minor Spheres=Divination}}ClassData=[w:Druid, hd:1d8, weaps:clubs|sickle|dart|spears|dagger|scimitar|slings|staff, ac:leather|padded|hide|woodenshield|magicitem|ring|cloak, sps:all|animal|elemental|healing|plant|weather, spm:divination, ns:3],[cl:PW, w:Druids-Identify, lv:3, pd:-1],[cl:PW, w:Pass-Without-Trace, lv:3, pd:-1],[cl:PW, w:Druids-Shapechange, lv:7, pd:3]{{desc=Historically, druids lived among the Germanic tribes of Western Europe and Britain during the days of the Roman Empire. They acted as advisors to chieftains and held great influence over the tribesmen. Central to their thinking was the belief that the earth was the mother and source of all life. They revered many natural things -- the sun, moon, and certain trees -- as deities. Druids in the AD\\ampD game, however, are only loosely patterned after these historical figures. They are not required to behave like or follow the beliefs of historical druids.}}'},
{name:'Enchanter',type:'WizardClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Enchanter}}{{subtitle=Wizard Class}}{{Min Abilities=Int:[[9]], Chr:[[16]]}}{{Alignment=Any}}{{Race=Human, Elf \\amp Half Elf}}{{Hit Dice=1d4}}Specs=[Enchanter,WizardClass,0H,Wizard]{{=**Spells**}}{{Specialist=Enchantment / Charm}}{{Banned=Invocation / Evocation \\amp Necromancy}}ClassData=[w:Enchanter, hd:1d4, race:human|elf|halfelf, sps:enchantment|charm|enchantmentcharm, spb:invocation|evocation|invocationevocation|necromancy, weaps:dagger|staff|dart|knife|sling, ac:magicitem|ring|cloak]{{desc=Similar to the school of conjuration/summoning, this school encompasses two general types of spells. Both types imbue their subjects with magical energy to create specific effects. *Charm* spells induce changes or influence the behavior of creatures, usually altering their subject\'s mental or emotional states. *Enchantment* spells invest non-living objects with magical powers. Neither *charm* nor *enchantment* spells have any effect on their subject\'s physical form.}}'},
{name:'Fighter',type:'WarriorClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Fighter}}{{subtitle=Warrior Class}}{{Min Abilities=Str:[[9]]}}{{Alignment=Any}}{{Race=Any}}Specs=[Fighter,WarriorClass,0H,Warrior]{{Powers=None}}{{Hit Dice=1d10}}ClassData=[w:Fighter, align:any, hd:1d10, race:any, weaps:any, ac:any]{{desc=The fighter is a warrior, an expert in weapons and, if he is clever, tactics and strategy. There are many famous fighters from legend: Hercules, Perseus, Hiawatha, Beowulf, Siegfried, Cuchulain, Little John, Tristan, and Sinbad. History is crowded with great generals and warriors: El Cid, Hannibal, Alexander the Great, Charlemagne, Spartacus, Richard the Lionheart, and Belisarius. Your fighter could be modeled after any of these, or he could be unique. A visit to your local library can uncover many heroic fighters.}}'},
+ {name:'Fire-Giant-Shaman',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{prefix=Fire Giant }}{{title=Shaman}}{{subtitle=Creature Class}}{{Min Abilities=None}}{{Race=Fire Giant}}{{Hit Dice=As Fire Giant}}{{Section1=**Alignment**}}{{Deity=Lawful Evil}}{{Priests=Lawful Evil}}{{Flock=Lawful Evil}}Specs=[Fire Giant Shaman,CreatureClass,0H,Priest]{{Powers=None}}{{ Section3=Spells}}{{Major Spheres=Elemental, Healing, Charm, Protection, Divination, or Combat}}{{Minor Spheres=None}}ClassData=[w:Fire Giant Shaman, weaps:any, ac:any, sps:all|Elemental|Healing|Charm|Protection|Divination|Combat]{{desc=There is a 20% chance that any band of fire giants will have a shaman (80%) or witch doctor (20%). If the group is lead by a king, there is an 80% chance of a spell caster. Fire giant shamans are priests of up to 7th level. A shaman can cast normal or reversed spells from the Elemental, Healing, Charm, Protection, Divination, or Combat spheres. Fire giant witch doctors are priest/wizards of up to 7th/3rd level; they prefer spells that can detect or thwart intruders.}}'},
+ {name:'Fire-Giant-Witch-Doctor',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{prefix=Fire Giant }}{{title=Witch Doctor}}{{subtitle=Creature Class}}{{Min Abilities=None}}{{Race=Fire Giant}}{{Hit Dice=As Fire Giant}}{{Section1=**Alignment**}}{{Deity=Lawful Evil}}{{Priests=Lawful Evil}}{{Flock=Lawful Evil}}Specs=[Fire Giant Witch Doctor,CreatureClass,0H,Priest]{{Powers=None}}{{ Section3=Spells}}{{Major Spheres=Elemental, Healing, Charm, Protection, Divination, or Combat}}{{Minor Spheres=None}}ClassData=[w:Fire Giant Witch Doctor, weaps:any, ac:any, slv:7|1|20|PR, sps:all|Elemental|Healing|Charm|Protection|Divination|Combat],[w:Fire Giant Witch Doctor, sps:any, slv:2|1|3|MU]{{desc=There is a 20% chance that any band of fire giants will have a shaman (80%) or witch doctor (20%). If the group is lead by a king, there is an 80% chance of a spell caster. Fire giant shamans are priests of up to 7th level. A shaman can cast normal or reversed spells from the Elemental, Healing, Charm, Protection, Divination, or Combat spheres. Fire giant witch doctors are priest/wizards of up to 7th/3rd level; they prefer spells that can detect or thwart intruders.}}'},
+ {name:'Frost-Giant-Shaman',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{prefix=Frost Giant }}{{title=Shaman}}{{subtitle=Creature Class}}{{Min Abilities=None}}{{Race=Frost Giant}}{{Hit Dice=As Frost Giant}}{{Section1=**Alignment**}}{{Deity=Chaotic Evil}}{{Priests=Chaotic Evil}}{{Flock=Chaotic Evil}}Specs=[Frost Giant Shaman,CreatureClass,0H,Priest]{{Powers=None}}{{ Section3=Spells}}{{Major Spheres=*Healing, charm, protection, divination*, or *weather*}}{{Minor Spheres=None}}ClassData=[w:Frost Giant Shaman, weaps:any, ac:any, sps:all|healing|charm|protection|divination|weather]{{desc=There is a 20% chance that any band of frost giants will have a shaman (80%) or witch doctor (20%). If the group is led by a jarl, there is an 80% chance for a spell caster. Frost giant shamans are priests of up to 7th level. A shaman can cast normal or reversed spells from the *healing, charm, protection, divination,* or *weather* spheres.}}'},
+ {name:'Frost-Giant-Witch-Doctor',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{prefix=Frost Giant }}{{title=Witch Doctor}}{{subtitle=Creature Class}}{{Min Abilities=None}}{{Race=Frost Giant}}{{Hit Dice=As Frost Giant}}{{Section1=**Alignment**}}{{Deity=Chaotic Evil}}{{Priests=Chaotic Evil}}{{Flock=Chaotic Evil}}Specs=[Frost Giant Witch Doctor,CreatureClass,0H,Priest]{{Powers=None}}{{Section3=Spells}}{{Major Spheres=*Healing, charm, protection, divination*, or *weather*}}{{Minor Spheres=None}}ClassData=[w:Frost Giant Witch Doctor, weaps:any, ac:any, slv:7|1|20|PR, sps:all|Healing|charm|protection|divination|weather],[w:Frost Giant Witch Doctor, sps:any, slv:2|1|3|MU]{{desc=There is a 20% chance that any band of frost giants will have a shaman (80%) or witch doctor (20%). If the group is led by a jarl, there is an 80% chance for a spell caster. Frost giant shamans are priests of up to 7th level. A shaman can cast normal or reversed spells from the *healing, charm, protection, divination,* or *weather* spheres. Frost giant witch doctors are priest/wizards of up to 7th/3rd level; they prefer spells that can bewilder and confound other giants. Favorite spells include: *unseen servant, shocking grasp, detect magic, ventriloquism, deeppockets, ESP, mirror image,* and *invisibility*.}}'},
{name:'Goblin-Shaman',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Goblin Shaman}}{{subtitle=Creature Class}}{{Min Abilities=None}}{{Race=Goblin}}{{Hit Dice=As Goblin}}{{ =**Alignment**}}{{Deity=Any}}{{Priests=Any}}{{Flock=Any}}Specs=[Goblin Shaman,CreatureClass,0H,Priest]{{Powers=None}}{{ =Spells}}{{Major Spheres=Divination, Healing (reversed), Protection, and Sun (reversed)}}{{Minor Spheres=None}}ClassData=[w:Goblin Shaman, weaps:clubs|flails|staff|slings, ac:any, sps:all|divination|healing|protection|sun]{{desc=Goblin shamans are rare, but have been known to reach 7th level. Their spheres include: Divination, Healing (reversed), Protection, and Sun (reversed).}}'},
+ {name:'Gold-Dragon',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{}}Specs=[Gold-Dragon,CreatureClass,0H,Red-Dragon]{{}}ClassData=[w:Gold Dragon, slv:7|1|20|MU, sps:any, spl1:0|0|0|0|0|0|0|0|0|0|0|1|2|2|2|2|2|2|2|2, spl2:0|0|0|0|0|0|0|0|0|0|0|0|0|2|2|2|2|2|2|2, spl3:0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|2|2|2|2|2, spl4:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|2|2|2|2, spl5:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|2|2|2, spl6:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|2|2, spl7:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|2, spl8:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1],[w:Gold Dragon, sps:any, slv:4|1|20|PR, spl1:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|2|2|2, spl2:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|2|2, spl3:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|2, spl4:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2, ns:5],{{}}%{Class-DB|Red-Dragon}{{prefix=Gold}}{{Hit Dice=As Gold Dragon}}{{Alignment=Lawful Good}}'},
+ {name:'Green-Dragon',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{}}Specs=[Green-Dragon,CreatureClass,0H,Red-Dragon]{{}}ClassData=[w:Green Dragon, slv:2|1|17|MU, sps:any, spl1:0|0|0|0|0|0|0|0|1|2|3|4|4|4|4|4|5, spl2:0|0|0|0|0|0|0|0|0|0|0|0|1|2|3|4|4, ns:5],{{}}%{Class-DB|Red-Dragon}{{prefix=Green }}{{Hit Dice=As Green Dragon}}'},
{name:'Illusionist',type:'WizardClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Illusionist}}{{subtitle=Wizard Class}}{{Min Abilities=Int:[[9]], Dex:[[16]]}}{{Alignment=Any}}{{Race=Human, Gnome}}{{Hit Dice=1d4}}Specs=[Illusionist,WizardClass,0H,Wizard]{{=**Spells**}}{{Specialist=Illusion / Phantasm}}{{Banned=Abjuration, Invocation / Evocation, Necromancy}}ClassData=[w:Illusionist, hd:1d4, race:human|gnome, sps:illusion|phantasm|illusionphantasm, spb:abjuration|invocation|evocation|invocationevocation|necromancy, weaps:dagger|staff|dart|knife|sling, ac:magicitem|ring|cloak]{{desc=Spells from the school of illusion bend reality to create apparent changes in the environment, in the caster, or in other persons or creatures. These spells do not cause real changes as alteration spells do, but instead alter the way that creatures and persons perceive reality. This school includes both illusion and phantasm spells.}}'},
{name:'Invoker',type:'WizardClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Invoker}}{{subtitle=Wizard Class}}{{Min Abilities=Int:[[9]], Con:[[16]]}}{{Alignment=Any}}{{Race=Human only}}{{Hit Dice=1d4}}Specs=[Invoker,WizardClass,0H,Wizard]{{=**Spells**}}{{Specialist=Invocation / Evocation}}{{Banned=Enchantment / Charm \\amp Conjuration / Summoning}}ClassData=[w:Invoker, hd:1d4, race:human, sps:invocation|evocation|invocationevocation, spb:enchantment|charm|enchantmentcharm|conjuration|summoning|conjurationsummoning, weaps:dagger|staff|dart|knife|sling, ac:magicitem|ring|cloak]{{desc=This school includes two types of spells, both of which use magical energy to create specific effects by bringing forth special forces that the caster shapes into constructs of energy or constructs of matter. Evocation spells use the natural magical forces of the planes. Invocation spells call on the intervention of powerful extradimensional beings.}}'},
{name:'Mage',type:'WizardClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Mage}}{{subtitle=Wizard Class}}{{Min Abilities=Int:[[9]]}}{{Alignment=Any}}{{Race=Human, Elf or Half-Elf}}{{Hit Dice=1d4}}Specs=[Mage,WizardClass,0H,Wizard]{{Spells=Any}}ClassData=[w:Mage, hd:1d4, race:human|elf|halfelf, weaps:dagger|staff|dart|knife|sling, ac:magicitem|ring|cloak]{{desc=Mages are the most versatile types of wizards, those who choose not to specialize in any single school of magic. This is both an advantage and disadvantage. On the positive side, the mage\'s selection of spells enables him to deal with many different situations. (Wizards who study within a single school of magic learn highly specialized spells, but at the expense of spells from other areas.) The other side of the coin is that the mage\'s ability to learn specialized spells is limited compared to the specialist\'s.\nMages have no historical counterparts; they exist only in legend and myth. However, players can model their characters after such legendary figures as Merlin, Circe, or Medea. Accounts of powerful wizards and sorceresses are rare, since their reputations are based in no small part on the mystery that surrounds them. These legendary figures worked toward secret ends, seldom confiding in the normal folk around them.}}'},
@@ -1437,13 +1571,16 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Rakshasa',type:'WarriorClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{title=Rakshasa}}{{subtitle=Creature Class}}{{Min Abilities=None}}{{Race=Rakshasa}}{{Hit Dice=As Rakshasa}}Specs=[Rakshasa,WarriorClass,0H,Creature]{{Section1=**Powers**}}{{Section2=None}}{{Section3=**Spells**}}{{Casting Class=**Wizard:** 4 1st level, 3 2nd level, 2 3rd level, all cast as a 7th level wizard\n**Priest:** 3 1st level cast as a 7th level Priest}}{{Major Spheres=Any}}{{Minor Spheres=None}}ClassData=[w:Rakshasa, hd:1d8, race:Rakshasa, align:LE, weaps:any, ac:magicitem|cloak|ring, sps:any, slv:3|7|7|MU|Ord, spl1:4, spl2:3, spl3:2],[w:Rakshasa, sps:any, slv:1|7|7|PR, spl1:3]{{desc=Rakshasa society is bound by rigid castes. Each rakshasa is born into a particular role in life and cannot advance. Females (known as rakshasi) are fit to be consorts, honored only by their faithfulness and the fighting ability of their children. There are 1-3 females per male.\nRakshasa society is led by a rajah or maharajah, whose commands are to be obeyed without question. Rakshasas wage war on humanity constantly, not only to feed themselves but because they believe that battle is the only way to gain honor. If confronted by humans who recognize their true appearance, they are insufferably arrogant.\nA rakshasa\'s life varies in cycles of wild self-indulgence in times of prosperity and strict fasting and sacrifice in times of trouble or before battle. They are honorable creatures but will twist the wording of an agreement to suit their purposes. They prefer to deal with humanity by using their illusion powers to deceive and manipulate them, but are brave and forthright in battle.}}'},
{name:'Rakshasa-Maharajah',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{}}ClassData=[w:Rakshasa Rajah, slv:6|13|13|MU|Ord, spl1:5, spl2:5, spl3:5, spl4:4, spl5:4, spl6:2],[w:Rakshasa Rajah, slv:5|13|13|PR, spl1:4, spl2:4, spl3:3, spl4:2, spl5:1]{{}}%{Class-DB|Rakshasa}{{name=Rajah}}Specs=[Rakshasa Rajah,CreatureClass,0H,Rakshasa]{{Casting Class=**Wizard:** 5 1st level, 5 2nd level, 5 3rd level, 4 4th level, 4 5th level, 2 6th level, cast as a 13th level wizard\n**Priest:** 4 1st level, 4 2nd level, 3 3rd level, 2 4th level, 1 5th level all cast as a 9th level Priest}}{{desc1=**Rakshasa Maharajahs:** About 5% of all rakshasa rajahs are rakshasa maharajahs, or dukes. Maharajahs have the same abilities as a ruhk, but have 13+39 Hit Dice, and the spell casting abilities of a 13th level wizard and 9th level priest. A maharajah is the leader of either several small, related clans, or a single powerful clan. Maharajahs reside on the outer planes, where they rule island communities of hundreds of rakshasas, and serve as minions to even greater powers.}}'},
{name:'Rakshasa-Rajah',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{}}ClassData=[w:Rakshasa Rajah, slv:4|11|11|MU|Ord, spl1:4, spl2:3, spl3:3, spl4:2],[w:Rakshasa Rajah, slv:3|11|11|PR, spl1:3, spl2:3, spl3:2]{{}}%{Class-DB|Rakshasa}{{name=Rajah}}Specs=[Rakshasa Rajah,CreatureClass,0H,Rakshasa]{{Casting Class=**Wizard:** 4 1st level, 3 2nd level, 3 3rd level, 2 4th level cast as an 11th level wizard\n**Priest:** 3 1st leve, 3 2nd level, 2 3rd level all cast as a 11th level Priest}}{{desc1=**Rakshasa Rajahs:** About 15% of all rakshasa ruhks are rakshasa rajahs, or lords. Each rajah is the leader (patriarch) of his local clan. These rulers of rakshasadom have the same abilities as a ruhk, but also have the spell casting abilities of both a 6th level priest and an 8th level wizard, cast at 11th level of ability.}}'},
- {name:'Ranger',type:'WarriorClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Ranger}}{{subtitle=Warrior Class}}{{Min Abilities=Str:[[12]], Dex:[[13]], Con:[[14]], Wis:[[14]]}}{{Alignment=Any Good}}{{Race=Human, Elf or Half-Elf}}Specs=[Ranger,WarriorClass,0H,Warrior]{{Hit Dice=1d10}}{{=**Powers**}}{{1st Level=*Tracking, Hide In Shadows* (Natural Surroundings), *Move Silently* (Natural Surroundings), *Animal Friendship*}}{{8th Level=Cast limited Priest Spells from *Animal* and *Plant* spheres}}ClassData=[w:Ranger, align:lg|ng|cg, hd:1d10, race:human|elf|halfelf, weaps:any, ac:any, sps:plant|animal, slv:3|8|9|PR, spl1:1|2|2|2|2|3|3|3|3, spl2:0|0|1|2|2|2|2|3|3, spl3:0|0|0|0|1|1|2|2|3, ns:1],[cl:PW, w:Rangers-Animal-Friendship, lv:1, pd:-1]{{desc=The ranger is a hunter and woodsman who lives by not only his sword, but also his wits. Robin Hood, Orion, Jack the giant killer, and the huntresses of Diana are examples of rangers from history and legend. The abilities of the ranger make him particularly good at tracking, woodcraft, and spying.}}'},
+ {name:'Ranger',type:'WarriorClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Ranger}}{{subtitle=Warrior Class}}{{Min Abilities=Str:[[12]], Dex:[[13]], Con:[[14]], Wis:[[14]]}}{{Alignment=Any Good}}{{Race=Human, Elf or Half-Elf}}Specs=[Ranger,WarriorClass,0H,Warrior]{{Hit Dice=1d10}}{{=**Powers**}}{{1st Level=*Tracking, Hide In Shadows* (Natural Surroundings), *Move Silently* (Natural Surroundings), *Animal Friendship*}}{{8th Level=Cast limited Priest Spells from *Animal* and *Plant* spheres}}ClassData=[w:Ranger, align:lg|ng|cg, hd:1d10, race:human|elf|halfelf, weaps:any, twp:0.0, ac:any, sps:plant|animal, slv:3|8|9|PR, spl1:1|2|2|2|2|3|3|3|3, spl2:0|0|1|2|2|2|2|3|3, spl3:0|0|0|0|1|1|2|2|3, ns:1],[cl:PW, w:Rangers-Animal-Friendship, lv:1, pd:-1]{{desc=The ranger is a hunter and woodsman who lives by not only his sword, but also his wits. Robin Hood, Orion, Jack the giant killer, and the huntresses of Diana are examples of rangers from history and legend. The abilities of the ranger make him particularly good at tracking, woodcraft, and spying.}}'},
+ {name:'Red-Dragon',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{prefix=Red }}{{title=Dragon}}{{subtitle=Creature Class}}{{Section=**Attributes**}}{{Min Abilities=None}}{{Race=Dragon}}{{Hit Dice=As Red Dragon}}{{Alignment=Chaotic Evil}}Specs=[Red Dragon,CreatureClass,0H,Wizard]{{Section2=**Powers**}}{{Dragon Fear=Dragons can inspire panic or fear. The mere sight of a young adult or older dragon causes creatures to flee in panic, or at least be very afraid affecting their combat abilities.}}{{Snatch=Young adult and older dragons can snatch. This occurs when a flying dragon dives and attempts to grab a creature in one of its claws.}}{{Plummet=If the DM chooses to allow plummets, an airborne dragon, or a dragon jumping and descending from at least 30 feet above a target, can land on a victim, potentially crushing \\amp pinning them.}}{{Wing Buffet=Young adult and older dragons can employ their wings in combat; targets must be at the dragon\'s sides. The damage inflicted is the same as a claw attack, and creatures struck must roll their Dexterity or less on 1d20 or be knocked prone.}}{{Stall=Any dragon flying near the ground can halt its forward motion and hover for one round; it must land immediately thereafter. Once stopped, the dragon can attack with its bite and all four legs.}}{{Spells=Dragons learn spells haphazardly over the years. The DM should randomly determine which spells any particular dragon knows.}}ClassData=[w:Red Dragon, weaps:none, ac:none, specmu:0, slv:4|1|20|MU, sps:any, spl1:0|0|0|0|0|0|0|0|0|0|0|1|2|2|2|2|2|2|2|2, spl2:0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|2|2|2|2|2, spl3:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|2|2|2, spl4:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|2],[w:Red Dragon, sps:any, slv:2|1|20|PR, spl1:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|2, spl2:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1, ns:5],[cl:PW,w:PW-Snatch,age:5,pd:-1,sp:0],[cl:PW,w:PW-Plummet,pd:-1,sp:0],[cl:PW,w:PW-Wing-Buffet,age:5,pd:-1,sp:0],[cl:PW,w:PW-Stall,pd:-1,sp:0],[cl:PW,w:PW-Dragon-Fear,age:5,pd:-1,sp:0]{{desc=Dragons are an ancient, winged reptilian race. They are known and feared for their size, physical prowess, and magical abilities. The oldest dragons are among the most powerful creatures in the world.\nMost dragons are identified by the color of their scales.\nAll subspecies of dragons have 12 age categories, and gain more abilities and greater power as they age, including spell-casting. Dragons learn spells haphazardly over the years. The DM should randomly determine which spells any particular dragon knows. The dragon can cast each spell once per day, unless random determination indicates the same spell more than once, in which case the dragon can cast it more than once a day. Dragons to not use spell books or pray to deities; they simply sleep, concentrate when they awaken, and remember their spells. Dragon spells have only a verbal component; the spells have a casting time of 1, regardless of level. Dragons cannot physically attack, use their breath weapon, use their magical abilities, or fly (except to glide) while casting a spell.}}'},
{name:'Rogue',type:'RogueClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Rogue}}{{subtitle=Rogue Class}}{{Min Abilities=Dex:[[9]]}}{{Race=Any}}{{Hit Dice=1d6}}{{Alignment=Any not Lawful}}Specs=[Rogue,RogueClass,0H,Rogue]{{=**Powers**}}{{1st Level=Thieving Abilities *Pick Pockets, Open Locks, Find/Remove Traps, Move Silently, Hide in Shadows, Detect Noise, Climb Walls,* and *Read Languages* Also, Thieves can *Backstab*}}{{10th Level=Limited ability to use magical \\amp priest scrolls, with 25% chance of backfire}}ClassData=[w:Rogue, hd:1d6, align:ng|nn|n|ne|cg|cn|ce, weaps:club|shortblade|fencingblade|dart|handxbow|lasso|shortbow|sling|broadsword|longsword|staff, ac:padded|leather|studdedleather|elvenchain|magicitem|ring|cloak]{{desc=Thieves come in all sizes and shapes, ready to live off the fat of the land by the easiest means possible. In some ways they are the epitome of roguishness.\nThe profession of thief is not honorable, yet it is not entirely dishonorable, either. Many famous folk heroes have been more than a little larcenous -- Reynard the Fox, Robin Goodfellow, and Ali Baba are but a few. At his best, the thief is a romantic hero fired by noble purpose but a little wanting in strength of character. Such a person may truly strive for good but continually run afoul of temptation.}}'},
{name:'Scrag-Shaman',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Freshwater Troll (Scrag) Shaman}}{{subtitle=Creature Class}}{{Min Abilities=None}}{{Race=Troll}}{{Hit Dice=As Troll}}{{Section=**Alignment**}}{{Deity=Chaotic Evil}}{{Priests=Chaotic Evil}}{{Flock=Chaotic Evil}}Specs=[Scrag Shaman,CreatureClass,0H,Priest]{{Section1=**Powers**}}{{Section2=None}}{{Section3=**Spells**}}{{Major Spheres=Charm, Divination, Elemental (Water), Sun (Darkness only), abd Weather}}{{Minor Spheres=None}}ClassData=[w:Troll Shaman, weaps:any, ac:any, sps:all|enchantment|charm|divination|elemental-water|sun|weather]{{desc=Trolls live in small packs of 3 to 12 trolls led by a dominant female who acts as shaman/chieftain. She casts priest spells at 7th level; spheres typically include Charm, Divination, Sun (Darkness only), and Weather, and Scrags also get Elemental (water) spells. Leadership is only retained by combat, so fights for pack control are frequent.}}'},
+ {name:'Silver-Dragon',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{}}Specs=[Silver-Dragon,CreatureClass,0H,Red-Dragon]{{}}ClassData=[w:Silver Dragon, slv:5|1|17|MU, sps:any, spl1:0|0|0|0|0|0|0|0|2|2|2|2|2|2|2|2|2, spl2:0|0|0|0|0|0|0|0|0|2|2|2|2|2|2|2|2, spl3:0|0|0|0|0|0|0|0|0|0|1|2|2|2|2|2|2, spl4:0|0|0|0|0|0|0|0|0|0|0|0|1|2|2|2|2, spl5:0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|2, spl6:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1],[w:Silver Dragon, sps:any, slv:4|1|17|PR, spl1:0|0|0|0|0|0|0|0|0|0|0|0|2|2|2|2|2, spl2:0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|2|2, spl3:0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|2, spl3:0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1, ns:5],{{}}%{Class-DB|Red-Dragon}{{prefix=Silver}}{{Hit Dice=As Silver Dragon}}{{Alignment=Lawful Good}}'},
{name:'Thief',type:'RogueClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Thief}}{{subtitle=Rogue Class}}{{Min Abilities=Dex:[[9]]}}{{Race=Any}}{{Hit Dice=1d6}}{{Alignment=Any not Lawful}}Specs=[Thief,RogueClass,0H,Rogue]{{=**Powers**}}{{1st Level=Thieving Abilities *Pick Pockets, Open Locks, Find/Remove Traps, Move Silently, Hide in Shadows, Detect Noise, Climb Walls,* and *Read Languages* Also, Thieves can *Backstab*}}{{10th Level=Limited ability to use magical \\amp priest scrolls, with 25% chance of backfire}}ClassData=[w:Thief, hd:1d6, align:ng|nn|n|ne|cg|cn|ce, weaps:club|shortblade|fencingblade|dart|handxbow|lasso|shortbow|sling|broadsword|longsword|staff, ac:padded|leather|studdedleather|elvenchain|magicitem|ring|cloak]{{desc=Thieves come in all sizes and shapes, ready to live off the fat of the land by the easiest means possible. In some ways they are the epitome of roguishness.\nThe profession of thief is not honorable, yet it is not entirely dishonorable, either. Many famous folk heroes have been more than a little larcenous -- Reynard the Fox, Robin Goodfellow, and Ali Baba are but a few. At his best, the thief is a romantic hero fired by noble purpose but a little wanting in strength of character. Such a person may truly strive for good but continually run afoul of temptation.}}'},
{name:'Transmuter',type:'WizardClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Transmuter}}{{subtitle=Wizard Class}}{{Min Abilities=Int:[[9]], Dex:[[15]]}}{{Alignment=Any}}{{Race=Human or Half Elf}}{{Hit Dice=1d4}}Specs=[Transmuter,WizardClass,0H,Wizard]{{=**Spells**}}{{Specialist=Alteration}}{{Banned=Abjuration \\amp Necromancy}}ClassData=[w:Transmuter, hd:1d4, race:human|halfelf, sps:alteration, spb:abjuration|necromancy, weaps:dagger|staff|dart|knife|sling, ac:magicitem|ring|cloak]{{desc=Spells of this school enable the caster to channel magical energies to cause direct and specific change in an existing object, creature, or condition. Alterations can affect a subject\'s form (*polymorph other*), weight (*feather fall*), abilities (*strength*), location (*teleport without error*), or even his physical well-being (*death fog*).}}'},
{name:'Troll-Shaman',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Troll Shaman}}{{subtitle=Creature Class}}{{Min Abilities=None}}{{Race=Troll}}{{Hit Dice=As Troll}}{{Section=**Alignment**}}{{Deity=Chaotic Evil}}{{Priests=Chaotic Evil}}{{Flock=Chaotic Evil}}Specs=[Troll Shaman,CreatureClass,0H,Priest]{{Section1=**Powers**}}{{Section2=None}}{{Section3=**Spells**}}{{Major Spheres=Charm, Divination, Sun (Darkness only), abd Weather}}{{Minor Spheres=None}}ClassData=[w:Troll Shaman, weaps:any, ac:any, sps:all|enchantment|charm|divination|sun|weather]{{desc=Trolls live in small packs of 3 to 12 trolls led by a dominant female who acts as shaman/chieftain. She casts\npriest spells at 7th level; spheres typically include Charm, Divination, Sun (Darkness only), and Weather.\nLeadership is only retained by combat, so fights for pack control are frequent.}}'},
{name:'Warrior',type:'WarriorClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Fighter}}{{subtitle=Warrior Class}}{{Min Abilities=Str:[[9]]}}{{Alignment=Any}}{{Race=Any}}Specs=[Fighter,WarriorClass,0H,Warrior]{{Powers=None}}{{Hit Dice=1d10}}ClassData=[w:Fighter, align:any, race:any, hd:1d10, weaps:any, ac:any]{{desc=The fighter is a warrior, an expert in weapons and, if he is clever, tactics and strategy. There are many famous fighters from legend: Hercules, Perseus, Hiawatha, Beowulf, Siegfried, Cuchulain, Little John, Tristan, and Sinbad. History is crowded with great generals and warriors: El Cid, Hannibal, Alexander the Great, Charlemagne, Spartacus, Richard the Lionheart, and Belisarius. Your fighter could be modeled after any of these, or he could be unique. A visit to your local library can uncover many heroic fighters.}}'},
+ {name:'White-Dragon',type:'CreatureClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{}}Specs=[White-Dragon,CreatureClass,0H,Red-Dragon]{{}}ClassData=[w:White Dragon, slv:1|1|16|MU, sps:any, spl1:0|0|0|0|0|0|0|0|0|1|1|2|2|3|3|4, ns:5],{{}}%{Class-DB|Red-Dragon}{{prefix=White }}{{Hit Dice=As White Dragon}}'},
{name:'Wizard',type:'WizardClass',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.classTemplate+'}{{name=Wizard}}{{subtitle=Wizard Class}}{{Min Abilities=Int:[[9]]}}{{Alignment=Any}}{{Race=Human, Elf or Half-Elf}}{{Hit Dice=1d4}}Specs=[Wizard,WizardClass,0H,Wizard]{{Spells=Any}}ClassData=[w:Wizard, hd:1d4, race:human|elf|halfelf, weaps:dagger|staff|dart|knife|sling, ac:magicitem|ring|cloak]{{desc=Mages are the most versatile types of wizards, those who choose not to specialize in any single school of magic. This is both an advantage and disadvantage. On the positive side, the mage\'s selection of spells enables him to deal with many different situations. (Wizards who study within a single school of magic learn highly specialized spells, but at the expense of spells from other areas.) The other side of the coin is that the mage\'s ability to learn specialized spells is limited compared to the specialist\'s.\nMages have no historical counterparts; they exist only in legend and myth. However, players can model their characters after such legendary figures as Merlin, Circe, or Medea. Accounts of powerful wizards and sorceresses are rare, since their reputations are based in no small part on the mystery that surrounds them. These legendary figures worked toward secret ends, seldom confiding in the normal folk around them.}}'},
]},
MI_DB_Armour: {bio:'Armour and Shields v6.06 06/06/2023
This Magic Item database holds definitions for Armour & Shields for the RPGMaster series APIs.',
@@ -1539,14 +1676,14 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Unknown-Bracers',type:'DMitem',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.armourTemplate+'}{{name=Unknown Bracers}}{{subtitle=Bracers}}{{Armour=Unknown Bracers}}Specs=[Unknown Bracers,DMitem,0H,Bracers]{{save=Unknown}}ACData=[a:Unknown Bracers,st:Bracers,t:Magical-Bracers,+:0,sz:S,wt:1,loc:wrists]{{desc=The powers of these bracers are unknown. In fact, are they magical bracers at all, or just of fine quality and just treasure?}}'},
{name:'Wooden-Shield',type:'Shield',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.armourTemplate+'}{{name=Medium Wooden Shield}}{{subtitle=Shield}}{{Shield=1-handed medium shield made of wood \\amp metal}}Specs=[Wooden Shield,Shield,1H,Shields]{{AC=+0, Medium shield}}ACData=[a:Medium Shield,st:Shield,t:Medium-Shield,+:0,sz:M,wt:10,loc:left hand|right hand]{{Speed=[[0]]}}{{Size=Medium}}{{Immunity=None}}{{Saves=No effect}}{{desc=All shields improve a character\'s Armor Class by 1 or more against a specified number of attacks. A shield is useful only to protect the front and flanks of the user. Attacks from the rear or rear flanks cannot be blocked by a shield (exception: a shield slung across the back does help defend against rear attacks). The reference to the size of the shield is relative to the size of the character. Thus, a human\'s small shield would have all the effects of a medium shield when used by a gnome.\n*The medium shield* is carried on the forearm and gripped with the hand. Its weight prevents the character from using his shield hand for other purposes. With a medium shield, a character can protect against any frontal or flank attacks.}}'},
]},
- MI_DB_Weapons: {bio:'Weapons Database v6.21 22/06/2023
This sheet holds definitions of weapons that can be used in the redMaster API system. They are defined in such a way as to be lootable and usable magic items for MagicMaster and also usable weapons in attackMaster.',
- gmnotes:'Change Log: v6.21 22/06/2023 Fixed some weapon issues v6.20 07/03/2023 Converted artefact weapons to use Magical Attacks for powers and functions v6.19 31/01/2023 Added Axe of Hurling and other new weapons v6.18 25/01/2023 Added weapons from The Complete Fighter\'s Handbook v6.17 16/12/2022 Added weapons used by creatures in the creatures database v6.16 11/12/2022 Fixed spell/power storing weapons v6.14-5 03/12/2022 Added more weapons including Flindbars v6.13 14/11/2022 Added Acid and Stun Darts, and weapon supertype "Throwing-" to support Race DB definitions. v6.11 21/10/2022 Added \'on\', \'off\' & \'c\' data attributes to weapon definitions, and Shortbow-of-Targeting v6.10 25/09/2022 Moved to RPGM Library and updated templates v6.06 14/07/2022 Removed hard-coded whisper commands on database entries as now directed to correct player(s) programmatically v6.04 31/05/2022 Refixed various errors that had crept back in v6.03 31/05/2022 Moved DB data to RPGMlib and added more weapons v6.02 31/05/2022 Fixed speed for magical shortswords; fixed macro calls for Wave v6.01 01/05/2022 Various minor fixes v5.10 28/02/2022 Added Shillelagh as a magical weapon to support Priest spell v5.9 20/02/2022 Pluralised weapon groups that had the same name as a weapon type (e.g. club and clubs) to add clarity in weapon proficiencies v5.8 04/02/2022 Added Scimitar+3 v5.7 17/01/2022 Corrected multiple weapon definitions to ensure consistency. v5.6 01/01/2022 Added summoned weapons needed for spells, such as Rainbow & Ice Knife v5.5 05/11/2021 Split the Ammo and Weapons databases v5.4 31/10/2021 Further encoded using machine readable data to support API databases v5.3.4 21/08/2021 Fixed incorrect damage for all types of Two-handed Sword v5.3.3 07/06/2021 Added the missing Scimitar macro v5.3.2 31/05/2021 Cleaned ranged weapon ranges, as specifying a range for the weapon in the {{To-Hit=...}} section will now adjust the range of the ammo by that amount (for extended range weapons). Self-ammoed weapons (like thrown daggers) should specify their range in the {{Range=...}} section. v5.3.1 19/05/2021 Fixed a couple of bugs, missing weapons in the transfer from MI-DB v5.3 14/05/2021 All standard weapons from the PHB now encoded. v5.2 12/05/2021 Added support for weapon types (S,P,B), and more standard weapons v5.1 06/05/2021 Added a number of standard and magical weapons v5.0 28/04/2021 Initial separation of weapons listings from the main MI-DB',
+ MI_DB_Weapons: {bio:'Weapons Database v6.22 24/09/2023
This sheet holds definitions of weapons that can be used in the redMaster API system. They are defined in such a way as to be lootable and usable magic items for MagicMaster and also usable weapons in attackMaster.',
+ gmnotes:'Change Log: v6.21-2 24/09/2023 Added weapons for some giants & other creatures, & fixed some weapon issues v6.20 07/03/2023 Converted artefact weapons to use Magical Attacks for powers and functions v6.19 31/01/2023 Added Axe of Hurling and other new weapons v6.18 25/01/2023 Added weapons from The Complete Fighter\'s Handbook v6.17 16/12/2022 Added weapons used by creatures in the creatures database v6.16 11/12/2022 Fixed spell/power storing weapons v6.14-5 03/12/2022 Added more weapons including Flindbars v6.13 14/11/2022 Added Acid and Stun Darts, and weapon supertype "Throwing-" to support Race DB definitions. v6.11 21/10/2022 Added \'on\', \'off\' & \'c\' data attributes to weapon definitions, and Shortbow-of-Targeting v6.10 25/09/2022 Moved to RPGM Library and updated templates v6.06 14/07/2022 Removed hard-coded whisper commands on database entries as now directed to correct player(s) programmatically v6.04 31/05/2022 Refixed various errors that had crept back in v6.03 31/05/2022 Moved DB data to RPGMlib and added more weapons v6.02 31/05/2022 Fixed speed for magical shortswords; fixed macro calls for Wave v6.01 01/05/2022 Various minor fixes v5.10 28/02/2022 Added Shillelagh as a magical weapon to support Priest spell v5.9 20/02/2022 Pluralised weapon groups that had the same name as a weapon type (e.g. club and clubs) to add clarity in weapon proficiencies v5.8 04/02/2022 Added Scimitar+3 v5.7 17/01/2022 Corrected multiple weapon definitions to ensure consistency. v5.6 01/01/2022 Added summoned weapons needed for spells, such as Rainbow & Ice Knife v5.5 05/11/2021 Split the Ammo and Weapons databases v5.4 31/10/2021 Further encoded using machine readable data to support API databases v5.3.4 21/08/2021 Fixed incorrect damage for all types of Two-handed Sword v5.3.3 07/06/2021 Added the missing Scimitar macro v5.3.2 31/05/2021 Cleaned ranged weapon ranges, as specifying a range for the weapon in the {{To-Hit=...}} section will now adjust the range of the ammo by that amount (for extended range weapons). Self-ammoed weapons (like thrown daggers) should specify their range in the {{Range=...}} section. v5.3.1 19/05/2021 Fixed a couple of bugs, missing weapons in the transfer from MI-DB v5.3 14/05/2021 All standard weapons from the PHB now encoded. v5.2 12/05/2021 Added support for weapon types (S,P,B), and more standard weapons v5.1 06/05/2021 Added a number of standard and magical weapons v5.0 28/04/2021 Initial separation of weapons listings from the main MI-DB',
root:'MI-DB',
api:'attk,magic',
type:'mi',
controlledby:'all',
avatar:'https://s3.amazonaws.com/files.d20.io/images/52530/max.png?1340359343',
- version:6.21,
+ version:6.22,
db:[{name:'Acid-Dart',type:'Ranged',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Acid Dart}}{{subtitle=Thrown weapon}}{{Speed=[[2]]}}{{Size=Tiny}}{{Weapon=1-handed ranged dart}}Specs=[Acid Dart,Ranged,1H,Acid Dart]{{To-hit=+2, + Str \\amp Dex bonuses}}ToHitData=[w:Acid Dart,sb:1,db:1,+:2,n:3,ch:20,cm:1,sz:T,ty:P,sp:2,rc:uncharged]{{Attacks=3 per round, + specialisation \\amp level, Piercing}}{{Ammo=+0, vs. SM:1d3, L:1d2 + Str Bonus}}AmmoData=[w:Acid Dart,t:Acid Dart,st:Acid Dart,sb:1,+:0,SM:1d3+2d4,L:1d2+2d4, msg:The acid does the extra damage of 2d4]{{Range=S:10, M:20, L:40}}RangeData=[t:Dart,+:0,r:1/2/4]{{desc=Deep Gnome Elite warriors (3rd-level and above) often carry hollow darts with acid inside (+2d4 additional acid damage)}}'},
{name:'Acorn-Fire-Seed',type:'Ranged',ct:'2',charge:'charged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Acorn Fire Seed (spell)}}{{subtitle=Thrown magical seed}}{{Speed=[[2]]}}{{Size=Tiny}}{{Weapon=1-handed ranged dart}}Specs=[Acorn-Fire-Seed,Ranged,1H,Dart]{{To-hit=+0, + Dex bonuses}}ToHitData=[w:Acorn Fire Seed,sb:0,db:1,+:0,n:1,ch:20,cm:1,sz:T,ty:B,sp:2,rc:charged,msg:Each acorn bursts upon striking any hard surface igniting any combustible materials within a \\lbrak;10-foot diameter\\rbrak;\\lpar;!rounds ~~aoe \\amp#64;{selected\\vbar;token_id}\\vbar;circle\\vbar;feet\\vbar;120\\vbar;10\\vbar;10\\vbar;fire\\rpar; of the point of impact. If a successful saving throw vs. spell is made a creature within the burst area receives only one-half damage. A creature struck directly suffers full damage (i.e. no saving throw)]{{Attacks=1 per round, + specialisation \\amp level, Fire burst}}{{Ammo=+0, vs. SM:2d8, L:2d8 in 10ft dia. from fire}}AmmoData=[w:Acorn Fire Seed,t:Acorn Fire Seed,st:Dart,sb:0,+:0,ru:-1,SM:2d8,L:2d8]{{Range=S:40, M:40, L:40}}RangeData=[t:Acorn Fire Seed,+:0,r:40]{{desc=The Fire Seed spell turns up to four acorns into special grenadelike missiles that can be hurled up to 40 yards. An attack roll is required to strike the intended target, and proficiency penalties are considered. Each acorn bursts upon striking any hard surface, causing 2d8 points of damage and igniting any combustible materials within a 10-foot diameter of the point of impact. If a successful saving throw vs. spell is made, a creature within the burst area receives only one-half damage, but a creature struck directly suffers full damage (i.e., no saving throw)}}'},
{name:'Awl-Pike',type:'Melee',ct:'13',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Awl Pike}}{{subtitle=Polearm}}{{Speed=[[13]]}}Speed=[13,uncharged]{{Size=Large}}{{Weapon=2-handed melee polearm}}Specs=[Awl Pike,Melee,2H,Polearm]{{To-hit=+0 + Str Bonus}}ToHitData=[w:Awl Pike,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:P,r:12-20,sp:13,rc:uncharged]{{Attacks=1 per 2 rounds + specialisation \\amp level, Piercing}}{{Damage=SM:1d6, L:1d12, + Str Bonus}}DmgData=[w:Awl Pike,sb:1,+:0,SM:1d6,L:1d12]{{desc=This is a normal Awl Pike, a type of Polearm. The point is sharp and keen, but nothing special. However, it still does double damage when set to receive a charge.\nEssentially this is a long spear 12 to 20 feet long ending in a spike point of tapered spear head. It was a popular weapon during the Renaissance. Since the pike stuck out in front, men could be packed side-by-side in dense formations, and several rows of men could fight. Large blocks of pikemen made formidable troops. However, once the pikemen engaged in close combat, they normally dropped their clumsy awl pikes and fought hand-to-hand with short swords.}}'},
@@ -1565,8 +1702,10 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Bo-stick',type:'Melee',ct:'4',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Bo stick}}{{subtitle=Staff}}{{Speed=[[4]]}}{{Size=Large}}{{Weapon=2-handed melee staff}}Specs=[Quarterstaff,Melee,2H,Staff]{{To-hit=+0 + Str bonus}}ToHitData=[w:Bo stick,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:B,r:5,sp:4,wt:4]{{Attacks=1 per round + level \\amp specialisation}}{{Damage=+0, vs SM:1d6, L:1d4, + Str bonus}}DmgData=[w:Bo stick,sb:1,+:0,SM:1d6,L:1d4]{{desc=A good, hardwood staff that is well balanced but nothing out of the ordinary. Unlike a quarterstaff, not iron-shod so does less damage vs. large, but shares the same proficiency.}}'},
{name:'Bolas',type:'ranged',ct:'8',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Bolas}}{{subtitle=Bolas}}{{Speed=[[8]]}}{{Size=Medium}}{{Weapon=1-handed ranged bolas}}Specs=[Bolas,ranged,1H,Bolas]{{To-Hit=+0 + dex \\amp str bonus}}ToHitData=[w:Bolas,sb:1,db:1,+:0,n:1,ch:20,cm:1,sz:L,ty:b,sp:8,msg:If doing a *Called Shot* must declair intended outcome before attack]{{Attacks=1 per round, doing 1d8 damage}}AmmoData=[w:Bolas,t:Bolas,sb:1,+:0,SM:1d3,L:1d2,msg:Wraps around target taking 1 full round and a Strength check to free themselves]{{Range=S:30, M:60, L:90}}RangeData=[st:bolas,r:3/6/9]{{desc=Three balls attached to ropes or cords about a yard in length; the other ends of the cords are tied together in a knot. The wielder of the bolas whirls them by the knot and throws them at a target; if they hit, they wrap around the target, with the balls smashing painfully into the target as they connect. Once they have wrapped themselves around a target, it takes the victim one full round and a successful ability check vs. Strength to get them free. (If the character fails his Strength check, he does not get the bolas free this round.)\nThis weapon does only a little damage, but it is especially useful if you are using the Hit Locations rules from the *Combat Rules* chapter}}'},
{name:'Broadsword',type:'Melee',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Broadsword}}{{subtitle=Sword}}{{Speed=[[5]]}}{{Size=Medium}}{{Weapon=1-handled melee long blade}}Specs=[Broad sword,Melee,1H,Long-blade]{{To-hit=+0 + Str Bonus}}ToHitData=[w:Broadsword,sb:1,+:0,n:1,ch:20,cm:1,sz:M,ty:S,r:5,sp:5,rc:uncharged]{{Attack=1 per round + specialisation \\amp level, Slashing}}{{Damage=+0 + Str Bonus, \nvs. SM:2d4, L:1+1d6}}DmgData=[w:Broadsword,sb:1,+:0,SM:2d4,L:1+1d6]{{desc=This is a normal sword. The blade is sharp and keen, but nothing special.}}'},
+ {name:'CG-Rock',type:'Ranged',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Rock}}{{subtitle=Ranged Weapon}}{{Speed=[[3]]}}{{Size=Large}}{{Weapon=2-handed ranged rock}}Specs=[CG-Rock,Ranged,2H,CG-Rock]{{To-hit=+0 + Str bonus}}ToHitData=[w:Rock,dx:1,sb:0,+:0,n:1,sz:L, ty:B,sp:3,rc:uncharged]{{Attacks=1 per round, Bludgeoning}}{{Damage=+0, vs SM:2d12, L:2d12, No strength bonus}}AmmoData=[w:Rock,t:CG-Rock,st:CG-Rock,sb:0,+:0,SM:2d12,L:2d12]}}{{Range=S:40, M:120, L:240}}RangeData=[t:FG-Rock,+:0,r:4/12/24]{{desc=These rocks are hurled by giants, especially *Cloud Giants*.}}'},
{name:'Cestus',type:'Melee',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Cestus}}{{subtitle=Bludgeoning Weapon}}{{Speed=[[2]]}}{{Size=Small}}{{Weapon=1-handed melee glove}}Specs=[Cestus|Innate,Melee,1H,Punch]{{To-hit=+0 + Str Bonus}}ToHitData=[w:Cestus,sb:1,+:0,n:1,ch:20,cm:1,sz:S,ty:B,r:5,sp:2,rc:uncharged]{{Attacks=1 per round + specialisation \\amp level, Bludgeoning}}{{Damage=+0 + Str Bonus, vs SM:1d4, L:1d3}}DmgData=[w:Cestus,sb:1,+:0,SM:1d4,L:1d3]{{desc=A glovelike weapon, studded with sharp spikes and edges on the back of the glove and across the knuckles. Cestus, because it is simply a bonus to punching-type attacks, does not require weapon proficiency; anyone can use cesti with no proficiency penalty. Therefore, Specialization with Cestus costs only weapon proficiency slot.}}'},
{name:'Chain',type:'Ranged',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Chain}}{{subtitle=Melee Weapon}}{{Speed=[[5]]}}{{Size=Large}}{{Weapon=2-handed melee chain}}Specs=[Chain,Ranged,2H,Chain]{{To-hit=+0 + Str bonus}}ToHitData=[w:Chain,sb:1,dx:1,+:0,n:1,ch:20,cm:1,sz:L,ty:B,sp:5,wt:4,msg:Especially useful for called shots; parry; disarm; pull/trip; dismounting riders; snag rider\'s head]{{Attacks=1 per round + level \\amp specialisation}}{{Damage=+0, vs SM:1d4+1, L:1d4, + Str bonus}}AmmoData=[w:Chain,t:Chain,sb:1,+:0,SM:1+1d4,L:1d4,ru:1,rc:uncharged]{{Range=S:5, M:10, L:20}}RangeData=[t:Chain,+:0,r:=5/10/20]{{desc=A 6ft or 10ft length of chain with weights at both ends. In combat, it\'s whirled very fast, the weighted end inflicting the damage on the target.\nThe chain combines some of the useful traits of melee weapons and the lasso. You can attack with it for normal Called Shots, Disarm, Parry, and Strike/Thrust maneuvers. Additionally, you can perform three of the lasso\'s five special functions: Pull/Trip by striking at a target\'s legs, Dismount a Rider, and Snag a Rider\'s Head.}}'},
+ {name:'Cloud-Giant-Morningstar',type:'Melee|Melee',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Cloud Giant Morningstar}}{{subtitle=Morningstar}}{{Speed=[[7]]}}{{Size=Large}}{{Weapon=1- or 2-handed melee club}}Specs=[Cloud-Giant-Morningstar,Melee,1H,Clubs],[Cloud-Giant-Morningstar,Melee,2H,Clubs]{{To-hit=+0 + Str bonus}}ToHitData=[w:Cloud Giant Morningstar,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:B,r:8,sp:7]{{Attacks=1 per round + level \\amp specialisation, Bludgeoning}}{{Damage=+0, vs SM:6d4, L:6d4, + Str bonus}}DmgData=[w:Cloud Giant Morningstar,sb:1,+:0,SM:6d4,L:6d4]{{desc=This is an enormous morningstar that can be wield one or two handed by a Cloud Giant or any creature with cloud giant strength (23). Creatures of Frost Giant strength or better (21) can only wield it two-handed, and those weaker cannot wield it at all. The spikes glint sharply in torchlight, but it is nothing special.}}'},
{name:'Club',type:'Melee|Melee',ct:'4',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Club}}{{subtitle=Bludgeoning Weapon}}{{Speed=[[4]]}}{{Size=Medium}}{{Weapon=1-handed melee club}}Specs=[Club,Melee,1H,Clubs],[Club,Melee,2H,Clubs]{{To-hit=+0 + Str Bonus}}ToHitData=[w:Club,sb:1,+:0,n:1,ch:20,cm:1,sz:M,ty:B,r:5,sp:4,rc:uncharged]{{Attacks=1 per round + specialisation \\amp level, Bludgeoning}}{{Damage=+0 + Str Bonus, vs SM:1d6, L:1d3}}DmgData=[w:Club,sb:1,+:0,SM:1d6,L:1d3]{{desc=This is a good but ordinary club. The wood is hard and heavy, but somewhat dull with smears of something brown.}}'},
{name:'Club+1',type:'Melee|Melee',ct:'4',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Club+1}}{{subtitle=Magic Weapon}}{{Speed=[[4]]}}{{Size=Medium}}{{Weapon=1-handed melee club}}Specs=[Club,Melee,1H,Clubs],[Club,Melee,2H,Clubs]{{To-hit=+1 + Str Bonus}}ToHitData=[w:Club,sb:1,+:1,n:1,ch:20,cm:1,sz:M,ty:B,r:5,sp:4,rc:uncharged]{{Attacks=1 per round + specialisation \\amp level, Bludgeoning}}{{Damage=+1 + Str Bonus, vs SM:1d6, L:1d3}}DmgData=[w:Club,sb:1,+:1,SM:1d6,L:1d3]{{desc=This is a magical club. The wood is hard and heavy with a silvery sheen, and is a +[[1]] magical weapon at all times.}}'},
{name:'Composite-Longbow',type:'Ranged',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Composite Longbow}}{{subtitle=Bow}}{{Speed=[[7]]}}{{Size=Large}}{{Weapon=2-handed ranged bow}}Specs=[Composite-Longbow,Ranged,2H,Bow]{{To-hit=+0 + any ammo, Dex and Str bonuses}}ToHitData=[w:Composite Longbow,sb:1,db:1,+:0,n:2,ch:20,cm:1,sz:L,ty:P,sp:7,rc:uncharged]{{Attacks=2 per round regardless of level or specialisation}}{{desc=This is a composite longbow (otherwise known as a Recurve Bow). The limbs have well-bonded laminations of good quality wood, which make it strong and flexible, but nothing special}}'},
@@ -1589,17 +1728,24 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Dart+3',type:'Ranged',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Dart+3}}{{subtitle=Thrown weapon}}{{Speed=[[2]]}}{{Size=Tiny}}{{Weapon=1-handed ranged dart}}Specs=[Dart,Ranged,1H,Dart]{{To-hit=+3, + Str \\amp Dex bonuses}}ToHitData=[w:Dart,sb:1,db:1,+:3,n:3,ch:20,cm:1,sz:T,ty:P,sp:2,rc:uncharged]}}{{Attacks=3 per round, + specialisation \\amp level, Piercing}}{{Ammo=+3, vs. SM:1d3, L:1d2, + Str Bonus}}AmmoData=[w:Dart,t:Dart,st:Dart,sb:1,+:3,SM:1d3,L:1d2]{{Range=S:10, M:20, L:40}}RangeData=[t:Dart,+:3,r:1/2/4]{{desc=A Dart of exceptionally fine quality, with a sparkling tip and glowing flight feathers of many colours. A +3 weapon at all times}}'},
{name:'Dragonslayer-Broadsword',type:'Melee|Melee',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Dragonslayer Broadsword}}{{subtitle=Sword}}{{Speed=[[5]]}}{{Size=Medium}}{{Weapon=1-handed slashing melee long blade}}Specs=[Broadsword,Melee,1H,Long-blade],[Broadsword,Melee,1H,Long-blade]{{To-hit=+2, +4 vs. Dragons, + Str Bonus}}ToHitData=[w:Dragonslayer+2,sb:1,+:2,n:1,ch:20,cm:1,sz:M,ty:S,r:5,sp:5,rc:uncharged],[w:Dragonslayer vs. Dragon,sb:1,+:4,n:1,ch:20,cm:1,sz:M,ty:S,r:5,sp:5]{{Attks per round=[[1]] per round}}{{Damage=+2, +4 vs Dragons, + Str bonus. Kills 1 type - or does triple damage}}DmgData=[w:Dragonslayer+2,sb:1,+:2,SM:2d4,L:1+1d6][w:Dragonslayer vs Dragon,sb:1,+:4,SM:2d4,L:1+1d6]{{desc=This +2 sword has a +4 bonus against any sort of true dragon. It either inflicts triple damage against one sort of dragon (i.e., 3d6+3+4), or might be of a type that slays the dragon in 1 blow and immediately disintegrates. It will only act as a normal +2 sword against a dragon of a diametrically different colour (e.g. if a Black Dragonslayer, then will only be ordinary vs. a Silver dragon). Note that an unusual sword with intelligence and alignment will not be made to slay dragons of the same alignment. Determine dragon type (excluding unique ones like Bahamut and Tiamat) by rolling 1d10:\n1 black (CE)\n2 blue (LE)\n3 brass (CG)\n4 bronze (LG)\n5 copper (CG)\n6 gold (LG)\n7 green (LE)\n8 red (CE)\n9 silver (LG)\n10 white (CE)}}'},
{name:'Drusus',type:'melee|melee',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Drusus}}{{subtitle=Gladius Short-Sword}}{{Speed=[[3]]}}{{Size=Medium}}{{Weapon=1-handed melee short-blade}}Specs=[drusus|short-sword,melee,1H,short-blade],[drusus|short-sword,melee,1H,short-blade]{{To-Hit=+0 + str bonus}}ToHitData=[w:Sharpened Drusus,sb:1,+:1,n:1,ch:20,cm:1,sz:M,ty:S,r:5,sp:3,msg:Must have been sharpened previous night by a *blacksmith armourer* or *weaponsmith* for 30 minutes. +1 to hit is due to sharpness. Is not a magical weapon and loses +1 if not sharpened. Permanently loses +1 and becomes ordinary *Gladius* if exposed to high heat (e.g. smith\'s forge or dragon breath)],[w:Blunt Drusus,sb:1,+:0,n:1,ch:20,cm:1,sz:M,ty:S,r:5,sp:3,msg:Unless exposed to high heat can get sharpened at end of day for 30 minutes by *blacksmith armourer* or *weaponsmith*.]{{Attacks=1 per round + level \\amp specialisation, Slashing}}{{Damage=+0, vs SM:1+1d6, L:1+1d8, + str bonus}}DmgData=[w:Sharpened Drusus,sb:1,+:0,SM:1+1d6,L:1+1d8],[w:Blunt Drusus,sb:1,+:0,SM:1d6,L:1d8]{{desc=The Drusus is a Gladius (short sword) of Exceptional quality. It looks just like an ordinary gladius; only by testing the sharpness of the blade can someone tell the difference. The Drusus has been forged so that the metal is better-tempered and holds an edge better, and then sharpened until it has a razor-like edge. Because of this, it does +1 damage and confers a non-magical +1 to attack rolls over the normal gladius.\nThe Drusus also has a disadvantage. In order to keep its keen edge, it must be regularly sharpened with a lot more attention and time than an ordinary weapon requires. After any day in which the Drusus has been fought with (even one attack!), someone with the Blacksmithing, Armorer, or Weaponsmithing secondary or nonweapon proficiency, must sharpen the blade for half an hour ... or, on the next day, it will act as an ordinary short sword (losing its to-hit and damage bonus) until it is so sharpened.\nExposure to high heat (a smith\'s forge, dragon\'s breath, lava, etc.) will ruin the temper on a Drusus, turning it into an ordinary short sword and forever destroying its bonus on attack and damage rolls.}}'},
+ {name:'Ettin-Club-Left',type:'Melee',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Ettin Club (left)}}{{subtitle=Club}}{{Speed=[[5]]}}{{Size=Large}}{{Weapon=1-handed melee club}}Specs=[Ettin Club,Melee,1H,Clubs]{{To-hit=+0 + Str bonus}}ToHitData=[w:Left Ettin Club,sb:1,+:0,n:1,sz:L, ty:B, r:6,sp:5]{{Attacks=1 per round + level \\amp specialisation, Bludgeoning}}{{Damage=+0, vs SM:2d8, L:2d8, + Str bonus}}DmgData=[w:Left Ettin Club,sb:1,+:0,SM:2d8,L:2d8]{{desc=This club is massive, and requires the strength of a *Hill Giant* to wield.}}'},
+ {name:'Ettin-Club-Right',type:'Melee',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Ettin Club (right)}}{{subtitle=Club}}{{Speed=[[5]]}}{{Size=Large}}{{Weapon=1-handed melee club}}Specs=[Ettin Club,Melee,1H,Clubs]{{To-hit=+0 + Str bonus}}ToHitData=[w:Right Ettin Club,sb:1,+:0,n:1,sz:L, ty:B, r:6,sp:5]{{Attacks=1 per round + level \\amp specialisation, Bludgeoning}}{{Damage=+0, vs SM:3d6, L:3d6, + Str bonus}}DmgData=[w:Right Ettin Club,sb:1,+:0,SM:3d6,L:3d6]{{desc=This club is massive, and requires the strength of a *Hill Giant* to wield.}}'},
{name:'Extended-Range-Longbow',type:'Ranged',ct:'8',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Extended Range Longbow}}{{subtitle=Bow}}{{Speed=[[8]]}}{{Size=Large}}{{Weapon=2-handed ranged bow}}Specs=[Longbow,Ranged,2H,Bow]{{To-hit=+0 + Dex and Str bonuses}}ToHitData=[w:X-range Longbow,sb:1,db:1,+:0,n:2,ch:20,cm:1,sz:L,ty:P,r:+0/+2/+2/+2,sp:8,rc:uncharged]{{Attacks=2 per round regardless of specialisation or level}}{{Range=Range of Ammo +20 at each of S, M \\amp L}}{{desc=This is a strong longbow which imparts extra range to its ammunition. The wood is polished, the string taut, and the limbs seem both stronger and more springy than the average bow. As a result, it can both impart the bowyer\'s strength bonus and 20 extra yards per range category (except PB)}}'},
+ {name:'FG-Rock',type:'Ranged',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Rock}}{{subtitle=Ranged Weapon}}{{Speed=[[3]]}}{{Size=Large}}{{Weapon=2-handed ranged rock}}Specs=[FG-Rock,Ranged,2H,FG-Rock]{{To-hit=+0 + Str bonus}}ToHitData=[w:Rock,dx:1,sb:0,+:0,n:1,sz:L, ty:B,sp:3,rc:uncharged]{{Attacks=1 per round, Bludgeoning}}{{Damage=+0, vs SM:2d10, L:2d10, No strength bonus}}AmmoData=[w:Rock,t:FG-Rock,st:FG-Rock,sb:0,+:0,SM:2d10,L:2d10]}}{{Range=S:40, M:100, L:20}}RangeData=[t:FG-Rock,+:0,r:4/10/20]{{desc=These rocks are hurled by giants, especially *Fire Giants*.}}'},
{name:'Fauchard',type:'melee',ct:'8',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Fauchard}}{{subtitle=Polearm}}{{Speed=[[8]]}}{{Size=large}}{{Weapon=2-handed melee polearm}}Specs=[Fauchard,melee,2H,polearm]{{To-Hit=+0 + str bonus}}ToHitData=[w:Fauchard,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:PS,r:6-8,sp:8,rc:uncharged]{{Attacks=1 per round + level \\amp specialisation, piercing \\amp Slashing}}{{Damage=+0, vs. SM:1d6, l:1d8, + str bonus}}DmgData=[w:fauchard,sb:1,+:0,SM:1d6,L:1d8]{{desc=This is a normal Fauchard, a type of polearm. The point is sharp and keen, but nothing special.\nAn outgrowth of the sickle and scythe, the Fauchard is a long, inward curving blade mounted on a shaft six to eight feet long. It can slash or thrust, although the inward curving point makes thrusting rather ineffective. Its advantage is that a peasant can easily convert his common scythe into this weapon of war.}}'},
{name:'Fauchard-Fork',type:'Melee',ct:'8',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Fauchard-Fork}}{{subtitle=Polearm}}{{Speed=[[8]]}}{{Size=Large}}{{Weapon=2-handed melee polearm}}Specs=[Fauchard,Melee,2H,Polearm]{{To-hit=+0 + Str Bonus}}ToHitData=[w:Fauchard-Fork,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:PS,r:6-8,sp:8,rc:uncharged]{{Attacks=1 per round + level \\amp specialisation, Piercing \\amp Slashing}}{{Damage=+0, vs. SM:1d8, L1d10, + Str bonus}}DmgData=[w:Fauchard-Fork,sb:1,+:0,SM:1d8,L:1d10]{{desc=This is a normal Fauchard-Fork, a type of Polearm. The blade is sharp and keen, but nothing special.\nThis is an attempted improvement on the fauchard, adding a long spike or fork to the back of the blade. Supposedly this improves the thrusting ability of the weapon. It is still an inefficient weapon.}}'},
{name:'Felling-Axe',type:'Melee|Ranged',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Felling Axe}}{{subtitle=Magic Weapon}}{{Speed=[[7]]}}{{Size=M}}{{Weapon=2-handed melee axe or 1-handed ranged throwing axe}}Specs=[Felling-Axe,Melee,2H,Axe],[Throwing-Axe,Ranged,1H,Throwing-blade]{{To-hit=+1 + Str \\amp Dex bonuses}}ToHitData=[w:Felling Axe,sb:1,+:1,n:1,ch:20,cm:1,sz:M,ty:S,r:5,sp:7,rc:uncharged],[w:Felling Axe,sb:1,db:1,+:1,n:1,ch:20,cm:1,sz:M,ty:S,r:-/1/2/3,sp:7,rc:uncharged]{{Attacks=1 per round + level \\amp specialisation, Slashing}}{{Damage=As melee weapon +1, vs. SM:2d6, L:2d6 + Str bonus}}DmgData=[w:Felling Axe,sb:1,+:1,SM:2d6,L:2d6],[]{{Ammo=As ranged weapon +1, SM:1d6, L1d4 + Str Bonus}}AmmoData=[w:Felling Axe,t:Felling-Axe,st:Felling-Axe,sb:1,+:1,SM1d6,L:1d4]{{Range=S:10, M:20, L:30}}[t:Felling-Axe,+:1,r:-/1/2/3]{{desc=Axe of unsurpassed balance and sharpness. Used as a Weapon it is +1, 2D6+1, but if used as a felling axe any individual of 12 or greater strength can fell a 2\' diameter tree in one round (pro-rate to other trees on ratio of diameters). A character of 17 strength can use it as a throwing axe.}}'},
+ {name:'Fire-Giant-Sword',type:'Melee',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Fire Giant Sword}}{{subtitle=Sword}}{{Speed=[[10]]}}{{Size=Large}}{{Weapon=2-handed melee long-blade}}Specs=[Fire-Giant-Sword,Melee,2H,long-blade|great-blade]{{To-hit=+0 + Str bonus}}ToHitData=[w:Fire Giant Sword,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:S,r:5,sp:10]{{Attacks=1 per round + level \\amp specialisation, Slashing}}{{Damage=+0, vs SM:2d10, L:6d6, + Str bonus}}DmgData=[w:Fire Giant Sword,sb:1,+:0,SM:2d10,L:6d6]{{desc=This is an enormous two-handed sword, sized for giants, and requires Fire Giant Strength to wield. The blade is sharp and keen, but nothing special.}}'},
{name:'Flail+1',type:'Melee',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Footman\'s Flail+1}}{{subtitle=Flail}}{{Speed=[[7]]}}{{Size=Medium}}{{Weapon=1-handed melee flail}}Specs=[Footmans Flail,Melee,1H,Flails]{{To-hit=+1 + Str Bonus}}ToHitData=[w:Footmans Flail+1,sb:1,+:1,n:1,ch:20,cm:1,sz:M,ty:B,r:5,sp:7,rc:uncharged]{{Attacks=1 per round + level \\amp specialisation, Bludgeoning}}{{Damage=+1 vs. SM:1d6+1, L:2d4 + Str bonus}}DmgData=[w:Footmans Flail+1,sb:1,+:1,SM:1+1d6,L:2d4]{{desc=A Footman\'s Flail of very good quality, which has shiny chain, very supple and strong leather, and has a slight silvery glow about it. At all times, it is a +[[1]] weapon}}'},
{name:'Flaming-Scimitar',type:'Melee|Melee',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Flaming Scimitar}}{{subtitle=Magic Sword}}{{Speed=[[5]]}}{{Size=Medium}}{{Weapon=1-handed melee long-blade}}Specs=[Scimitar,Melee,1H,Long-blade],[Scimitar,Melee,1H,Long-blade]{{To-hit=+1 + Str bonus}}ToHitData=[w:Scimitar+1,sb:1,+:1,n:1,ch:20,cm:1,sz:M,ty:S,r:5,sp:5,rc:uncharged],[w:Scimitar+1 Flaming,sb:1,+:1,n:1,ch:20,cm:1,sz:M,ty:S,r:5,sp:5,rc:uncharged]{{Attacks=1 per round + level \\amp specialisation, Slashing}}{{Damage=+1, normally SM:1d8, L:1d8, + Str bonus, when flaming add 1d6}}DmgData=[w:Scimitar+1,sb:1,+:1,SM:1d8,L:1d8],[w:Scimitar+1 Flaming,sb:1,+:1,SM:1d8+1d6,L:1d8+1d6]{{desc=This sword flames upon the command of the wielder, causing flame to appear all along the blade as if fed from some invisible magical oil channels running from the hilt. The flame easily ignites oil, burns webs, or sets fire to paper, parchment, dry wood, etc. For creatures who take flame damage, does an additional 1d6 of flaming damage}}'},
{name:'Flindbar',type:'Melee',ct:'4',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Flindbar}}{{subtitle=Flail}}{{Speed=[[4]]}}{{Size=Medium}}{{Weapon=1-handed melee flail}}Specs=[Flindbar,Melee,2H,Flails]{{To-hit=+0 + Str bonus}}ToHitData=[w:Flindbar,sb:1,+:0,n:2,ch:20,cm:1,sz:M,ty:B,r:5,sp:4]{{Attacks=2 per round + level \\amp specialisation}}{{Damage=+0 vs SM:1d4, L:1d4}}DmgData=[w:Flindbar,sb:1,+:0,SM:1d4,L:1d4,msg:Opponent must Save vs. Wand or have their weapon entangled in the chain and torn from their grasp by the flindbar]{{desc=This is a normal Flindbar, thought to be a type of flail. A flindbar is a pair of chain-linked iron bars which are spun at great speed. The chain is somewhat rusty (but sturdy) and the bars dull, and the flindbar is nothing special.}}'},
{name:'Footmans-flail',type:'melee|melee',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Footman\'s flail}}{{subtitle=Flail}}{{Speed=[[7]]}}{{Size=medium}}{{Weapon=1-handed melee flail}}Specs=[footmans flail,melee,1H,flails],[footmans flail,melee,2H,flails]{{To-Hit=+0, + str bonus}}ToHitData=[w:Footmans flail,sb:1,+:0,n:1,ch:20,cm:1,sz:M,ty:B,r:5,sp:7]{{Attacks=1 per round, + level \\amp specialisation, Bludgeoning}}{{Damage=+0, vs SM:1d6+1, L:2d4, + str bonus}}DmgData=[w:Footmans flail,sb:1,+:0,SM:1+1d6,L:2d4]{{desc=A standard footman\'s flail of good quality, but nothing special}}'},
{name:'Footmans-mace',type:'Melee',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Footman\'s Mace}}{{subtitle=Mace}}{{Speed=[[7]]}}{{Size=Medium}}{{Weapon=1-handed melee club}}Specs=[Footmans Mace,Melee,1H,Clubs]{{To-hit=+0, + Str bonus}}ToHitData=[w:Footmans Mace,sb:1,+:0,n:1,ch:20,cm:1,sz:M,ty:B,r:5,sp:7]{{Attacks=1 per round + level \\amp specialisation, Bludgeoning}}{{Damage=+0, vs SM:1d6+1, L:1d6, + Str bonus}}DmgData=[w:Footmans Mace,sb:1,+:0,SM:1+1d6,L:1d6]{{desc=This is a normal Footman\'s Mace. The business end is extra hard, but nothing special.}}'},
{name:'Footmans-pick',type:'Melee|Melee',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Footman\'s Pick}}{{subtitle=Pick}}{{Speed=[[7]]}}{{Size=Medium}}{{Weapon=1-handed melee pick}}Specs=[Footmans Pick,Melee,1H,Picks],[Footmans Pick,Melee,2H,Picks]{{To-hit=+0, + Str bonus}}ToHitData=[w:Footmans Pick,sb:1,+:0,n:1,ch:20,cm:1,sz:M,ty:P,r:5,sp:7]{{Attacks=1 per round, + level \\amp specialisation, Piercing}}{{Damage=+0, vs. SM:1d6+1, L:2d4, + Str bonus}}DmgData=[w:Footmans Pick,sb:1,+:0,SM:1+1d6,L:2d4]}}{{desc=This is a normal Footman\'s Pick. The business end is wickedly pointed, but nothing special.}}'},
+ {name:'Frost-Giant-Battle-Axe',type:'Melee|Melee',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Frost Giant Battle Axe}}{{subtitle=Axe}}{{Speed=[[7]]}}{{Size=Large}}{{Weapon=1- or 2-handed melee long-blade}}Specs=[Frost-Giant-Battle-Axe,Melee,1H,Axe],[Frost-Giant-Battle-Axe,Melee,2H,Axe]{{To-hit=+0 + Str bonus}}ToHitData=[w:Frost Giant Battle Axe,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:S,r:8,sp:7]{{Attacks=1 per round + level \\amp specialisation, Slashing}}{{Damage=+0, vs SM:2d8, L:2d8, + Str bonus}}DmgData=[w:Frost Giant Battle Axe,sb:1,+:0,SM:2d8,L:2d8]{{desc=This is an enormous battle axe that can be wield one or two handed by a Frost Giant or any creature with frost giant strength (21). Creatures of Hill Giant strength or better (19) can only wield it two-handed, and those weaker cannot wield it at all. The blade is sharp and keen, but nothing special.}}'},
+ {name:'Frost-Giant-Battle-Axe+2',type:'Melee|Melee',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Frost Giant Battle Axe+2}}{{subtitle=Axe}}{{Speed=[[7]]}}{{Size=Large}}{{Weapon=1- or 2-handed melee long-blade}}Specs=[Frost-Giant-Battle-Axe,Melee,1H,Axe],[Frost-Giant-Battle-Axe,Melee,2H,Axe]{{To-hit=+2 + Str bonus}}ToHitData=[w:Frost Giant Battle Axe,sb:1,+:2,n:1,ch:20,cm:1,sz:L,ty:S,r:8,sp:7]{{Attacks=1 per round + level \\amp specialisation, Slashing}}{{Damage=+2, vs SM:2d8, L:2d8, + Str bonus}}DmgData=[w:Frost Giant Battle Axe,sb:1,+:2,SM:2d8,L:2d8]{{desc=This is an enormous battle axe that can be wield one or two handed by a Frost Giant or any creature with frost giant strength (21). Creatures of Hill Giant strength or better (19) can only wield it two-handed, and those weaker cannot wield it at all. The blade is sharp and keen, but nothing special.}}'},
{name:'Gaff',type:'Melee',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Gaff}}{{subtitle=Hook}}{{Speed=[[2]]}}{{Size=Small}}{{Weapon=1-handed melee hook}}Specs=[Gaff,Melee,1H,Hooks]{{To-hit=+0 + Str bonus}}ToHitData=[w:Gaff,sb:1,+:0,n:1,ch:20,cm:1,sz:S,ty:P,r:4,sp:2]{{Attacks=1 per round + level \\amp specialisation}}{{Damage=+0, vs SM:1d4, L:1d3, + Str bonus}}DmgData=[w:Gaff,sb:1,+:0,SM:1d4,L:1d3]{{desc=The gaff or hook is actually a tool used to hook and land fish. It is commonly found where fishing boats are encountered, and the hooks are in plentiful supply, affording the disarmed adventurer a weapon of last resort.\nA successful hit with the Gaff or Hook will grapple the target as well as doing damage. A Dexterity check next round escapes without additional damage, a Strength check -3 escapes with damage.\nThe gaff consists of a metal hook with a wooden or metal crossbar at the base. A onehanded tool, the hook protrudes from between the middle and ring fingers. Some sailors who have lost a hand have a cup with a gaff hook attached to the stump, guaranteeing that they are never without a weapon.}}'},
+ {name:'Giant-Club',type:'Melee',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Giant Club}}{{subtitle=Club}}{{Speed=[[5]]}}{{Size=Large}}{{Weapon=1-handed melee club}}Specs=[Giant Club,Melee,1H,Clubs]{{To-hit=+0 + Str bonus}}ToHitData=[w:Giant Club,sb:1,+:0,n:1,sz:L, ty:B, r:5,sp:5]{{Attacks=1 per round + level \\amp specialisation, Bludgeoning}}{{Damage=+0, vs SM:2d6, L:2d6, + Str bonus}}DmgData=[w:Giant Club,sb:1,+:0,SM:2d6,L:2d6]{{desc=This club is massive, and requires the strength of a *Hill Giant* to wield.}}'},
{name:'Glaive',type:'melee',ct:'8',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Glaive}}{{subtitle=Polearm}}{{Speed=[[8]]}}{{Size=Large}}{{Weapon=2-handed melee polearm}}Specs=[glaive,melee,2H,polearm]{{To-Hit=+0, + str bonus}}ToHitData=[w:Glaive,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:S,r:8-10,sp:8]{{Attacks=1 per round, + level \\amp specialisation, Slashing}}{{Damage=+0, vs SM:1d6, L:1d10, + str bonus}}DmgData=[w:Glaive,sb:1,+:0,SM:1d6,L:1d10]{{desc=This is a normal Glaive, a type of polearm. The blade is sharp and keen, but nothing special. **Inflicts double damage against charging creatures of large or greater size**.\nOne of the most basic polearms, the glaive is a single-edged blade mounted on an eight- to ten-foot-long shaft. While not the most efficient weapon, it is relatively easy to make and use. Normally the blade turns outward to increase the cutting area until it almost resembles a cleaver or axe.}}'},
{name:'Glaive-guisarme',type:'Melee',ct:'9',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Glaive-guisarme}}{{subtitle=Polearm}}{{Speed=[[9]]}}{{Size=Large}}{{Weapon=2-handed melee polearm}}Specs=[Glaive,Melee,2H,Polearm]{{To-hit=+0 + Str bonus}}ToHitData=[w:Glaive-guisarme,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:PS,r:8-10,sp:9]{{Attacks=1 per round, + level \\amp specialisation, Piercing \\amp Slashing}}{{Damage=+0, vs SM:2d4, L:2d6 + Str bonus}}DmgData=[w:Glaive-guisarme,sb:1,+:0,SM:2d4,L:2d6]{{desc=This is a normal Glaive-guisarme, a type of Polearm. The blade is sharp and keen, but nothing special. **Inflicts double damage against charging creatures of Large or greater size**.\nAnother combination weapon, this one takes the basic glaive and adds a spike or hook to the back of the blade. In theory, this increases the usefulness of the weapon although its actual application is somewhat questionable.}}'},
{name:'Great-Axe',type:'Melee',ct:'9',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Great Axe}}{{subtitle=Axe}}{{Speed=[[9]]}}{{Size=Medium}}{{Weapon=2-handed melee axe}}Specs=[Great Axe,Melee,2H,Axe]{{To-hit=+0 + Str bonus}}ToHitData=[w:Great Axe,sb:1,+:0,n:1,ch:20,cm:1,sz:M,ty:S,r:5,sp:9]{{Attacks=1 per round + level \\amp specialisation, Slashing}}{{Damage=+0, vs. SM:1d10, L:2d8, + Str bonus}}DmgData=[w:Great Axe,sb:1,+:0,SM:1d10,L:2d8]{{desc=This is an impressive Great Axe. The blade is sharp and keen, but nothing special.}}'},
@@ -1607,6 +1753,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Greatsword',type:'Melee',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Greatsword}}{{subtitle=Sword}}{{Speed=[[9]]}}{{Size=Medium}}{{Weapon=2-handed melee great-blade}}Specs=[Greatsword, Melee, 2H, Great-blade]{{To-hit=+0 + Str bonus}}ToHitData=[w:Greatsword,Str Bonus sb:1,Attk +:0,No per round n:1,Crit hit ch:20,Crit Miss cm:1,Size sz:M,Type ty:S,Range r:6,Speed sp:9]{{Attacks=1 per round + level \\amp specialisation}}{{Damage=+0, vs SM:2d6, L:2d10, + Str bonus}}DmgData=[w:Greatsword,Str Bonus sb:1,Dmg +:0,Dmg SM:2d6,Dmg L:2d10]{{desc=This is a normal sword. The blade is sharp and keen, but nothing special.}}'},
{name:'Guisarme',type:'Melee',ct:'8',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Guisarme}}{{subtitle=Polearm}}{{Speed=[[8]]}}{{Size=Large}}{{Weapon=2-handed melee polearm}}Specs=[Guisarme,Melee,2H,Polearm]{{To-hit=+0 + Str bonus}}ToHitData=[w:Guisarme,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:S,r:8,sp:8]{{Attacks=1 per round + level \\amp specialisation, Slashing}}{{Damage=+0, vs SM:2d4, L:1d8, + Str bonus}}DmgData=[w:Guisarme,sb:1,+:0,SM:2d4,L:1d8]{{desc=This is a normal Guisarme, a type of Polearm. The blade is sharp and keen, but nothing special.\nThought to have derived from a pruning hook, this is an elaborately curved heavy blade. While convenient and handy, it is not very effective.}}'},
{name:'Guisarme-voulge',type:'melee',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Guisarme-voulge}}{{subtitle=Polearm}}{{Speed=[[10]]}}{{Size=Large}}{{Weapon=2-handed melee polearm}}Specs=[guisarme,melee,2H,polearm]{{To-Hit=+0 + str bonus}}ToHitData=[w:Guisarme-voulge,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:PS,r:8,sp:10]{{Attacks=1 per round + level \\amp specialisation, Piercing \\amp Slashing}}{{Damage=+0, vs SM:2d4, L:2d4, + str bonus}}DmgData=[w:Guisarme-voulge,sb:1,+:0,SM:2d4,L:2d4]{{desc=This is a normal Guisarme-voulge a type of polearm. The blade is sharp and keen, but nothing special.\nThis weapon has a modified axe blade mounted on an eight-foot long shaft. The end of the blade tapers to a point for thrusting and a back spike is fitted for punching through armor. Sometimes this spike is replaced by a sharpened hook for dismounting riders.}}'},
+ {name:'HG-Rock',type:'Ranged',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Rock}}{{subtitle=Ranged Weapon}}{{Speed=[[3]]}}{{Size=Large}}{{Weapon=2-handed ranged rock}}Specs=[Rock,Ranged,2H,Rock]{{To-hit=+0 + Str bonus}}ToHitData=[w:Rock,dx:1,sb:0,+:0,n:1,sz:L, ty:B,sp:3,rc:uncharged]{{Attacks=1 per round, Bludgeoning}}{{Damage=+0, vs SM:2d8, L:2d8, No strength bonus}}AmmoData=[w:Rock,t:Rock,st:Rock,sb:0,+:0,SM:2d8,L:2d8]}}{{Range=S:40, M:100, L:20}}RangeData=[t:Rock,+:0,r:4/10/20]{{desc=These rocks are hurled by giants, especially *Hill Giants*.}}'},
{name:'Halberd',type:'Melee',ct:'9',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Halberd}}{{subtitle=Polearm}}{{Speed=[[9]]}}{{Size=Large}}{{Weapon=2-handed melee polearm}}Specs=[Halberd,Melee,2H,Polearm]}}{{To-hit=+0 + Str bonus}}ToHitData=[w:Halberd,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:PS,r:5-8,sp:9]{{Attacks=1 per round + level \\amp specialisation, Piercing \\amp Slashing}}{{Damage=+0, vs SM:1d10, L:2d6, + Str bonus}}DmgData=[w:Halberd,sb:1,+:0,SM:1d10,L:2d6]{{desc=This is a normal Halberd, a type of Polearm. The blade is sharp and keen, but nothing special.\nAfter the awl pike and the bill, this was one of the most popular weapons of the Middle Ages. Fixed on a shaft five to eight feet long is a large axe blade, angled for maximum impact. The end of the blade tapers to a long spear point or awl pike. On the back is a hook for attacking armor or dismounting riders. Originally intended to defeat cavalry, it is not tremendously successful in that role since it lacks the reach of the pike and needs considerable room to swing. It found new life against blocks of pikemen. Should the advance of the main attack stall, halberdiers issue out of the formation and attack the flanks of the enemy. The pikemen with their overlong weapons are nearly defenseless in such close combat.}}'},
{name:'Half-Ogre-Sword',type:'Melee',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Half-Ogre Sword}}{{subtitle=Sword}}{{Speed=[[10]]}}{{Size=Large}}{{Weapon=1-handed melee great-blade}}Specs=[Half-Ogre-Sword,Melee,1H,long-blade|great-blade]{{To-hit=+0 + Str bonus}}ToHitData=[w:Half-Ogre-Sword,sb:1,+:0,n:1,ch:20,cm:1,sz:M,ty:S,r:5,sp:10]{{Attacks=1 per round + level \\amp specialisation, Slashing}}{{Damage=+0, vs SM:1d10, L:3d6, + Str bonus}}DmgData=[w:Half-Ogre-Sword,sb:1,+:0,SM:1d10,L:3d6]{{desc=This is a normal sword. The blade is sharp and keen, but nothing special.}}'},
{name:'Half-Ogre-War-Spear',type:'Melee|Ranged',ct:'6',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Half-Ogre War Spear}}{{subtitle=Spear}}{{Speed=[[6]]}}{{Size=Large}}{{Weapon=1-handed melee or thrown spear}}Specs=[Spear,Melee,1H,Spears],[Spear,Ranged,1H,Throwing-Spears]{{To-hit=+0 + Str \\amp Dex bonuses}}ToHitData=[w:Half-Ogre War Spear,sb:1,+:0,n:1,ch:20,cm:1,sz:M,ty:P,r:8,sp:6],[w:Half-Ogre War Spear,sb:1,db:1,+:0,n:1,ch:20,cm:1,sz:M,ty:P,sp:6]{{Attacks=1 per round + level \\amp specialisation, Piercing}}{{Damage=+0, vs SM:2d4, L:2d4, + Str bonus}}DmgData=[w:Half-Ogre War Spear,sb:1,+:0,SM:2d4,L:2d4],[]{{Ammo=+0, vs SM:2d4, L:2d4, + Str bonus}}AmmoData=[w:Half-Ogre War Spear,t:Spear,st:Spears,sb:1,+:0,SM:2d4,L:2d4]}}{{Range=S:10, M:20, L:30}}RangeData=[t:Spear,+:0,r:1/2/3]{{desc=This is a normal Spear. The point is sharp and it is well balanced, but nothing special.}}'},
@@ -1616,6 +1763,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Harpoon',type:'Melee|Ranged',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Harpoon}}{{subtitle=Spear}}{{Speed=[[7]]}}{{Size=Large}}{{Weapon=1-handed melee or thrown weapon}}Specs=[Harpoon,Melee,1H,Spears],[Harpoon,Ranged,1H,Throwing-Spears]{{To-hit=+0, + Dex (if thrown) \\amp Str bonuses}}ToHitData=[w:Harpoon,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:P,r:5,sp:7],[w:Harpoon,sb:1,db:1,+:0,n:1,ch:20,cm:1,sz:L,ty:P,sp:7]{{Attacks=1 per round, + level \\amp specialisation, Piercing}}{{Damage=+0, vs SM:2d4, L:2d6, + Str bonus}}DmgData=[w:Harpoon,sb:1,+:0,SM:2d4,L:2d6],[]{{Ammo=+0, vs SM:2d4, L:2d6 + Str bonus}}AmmoData=[w:Harpoon,t:Harpoon,st:Spear,sb:1,+:0,SM:2d4,L:2d6]{{Range=S:10, M:20, L:30}}RangeData=[t:Harpoon,+:0,r:1/2/3]{{desc=This is a normal Harpoon. The point is extra sharp and it is well balanced, but nothing special.}}'},
{name:'Heavy-Crossbow',type:'Ranged',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Heavy Crossbow}}{{subtitle=Crossbow}}{{Speed=[[10]]}}{{Size=Medium}}{{Weapon=2-handed ranged crossbow}}Specs=[Heavy Crossbow,Ranged,2H,Crossbow]{{To-hit=+0 + Dex bonus}}ToHitData=[w:Heavy Crossbow,sb:0,db:1,+:0,n:1/2,ch:20,cm:1,sz:M,ty:P,sp:10]{{Attacks=1 per 2 rounds + level \\amp specialisation, Piercing}}{{desc=This is a heavy crossbow, large and somewhat cumbersome. Made of good quality wood and various metals, it is somewhat difficult to hold and reload, and is nothing special}}'},
{name:'Heavy-Horse-Lance',type:'Melee',ct:'8',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Heavy Horse Lance}}{{subtitle=Lance}}{{Speed=[[8]]}}{{Size=Huge}}{{Weapon=1-handed mounted melee lance}}Specs=[Lance,Melee,1H,Lances]{{To-hit=+0, + Str bonus (Heavy War Horse only)}}ToHitData=[w:Heavy Horse Lance,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:P,r:10,sp:8]{{Attacks=1 per round (unless jousting), Piercing}}{{Damage=+0, vs SM:1d8+1, L:3d6, + Str bonus (Heavy War Horse only)}}DmgData=[w:Heavy Horse Lance,sb:1,+:0,SM:1+1d8,L:3d6]{{desc=This is a normal lance for use with a heavy war horse. The point is well hardened and the shaft in good condition, but nothing special.}}'},
+ {name:'Hill-Giant-Club',type:'Melee',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Hill Giant Club}}{{subtitle=Club}}{{Speed=[[5]]}}{{Size=Large}}{{Weapon=1-handed melee club}}Specs=[Hill Giant Club,Melee,1H,Clubs]{{To-hit=+0 + Str bonus}}ToHitData=[w:Hill Giant Club,sb:1,+:0,n:1,sz:L, ty:B, r:5,sp:5]{{Attacks=1 per round + level \\amp specialisation, Bludgeoning}}{{Damage=+0, vs SM:2d6, L:2d6, + Str bonus}}DmgData=[w:Longsword,sb:1,+:0,SM:2d6,L:2d6]{{desc=This club is massive, and requires the strength of a *Hill Giant* to wield.}}'},
{name:'Hook',type:'Melee',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Hook}}{{subtitle=Hook}}{{Speed=[[2]]}}{{Size=Small}}{{Weapon=1-handed melee hook}}Specs=[Hook,Melee,1H,Hooks]{{To-hit=+0, + Str bonus}}ToHitData=[w:Hook,sb:1,+:0,n:1,ch:20,cm:1,sz:S,ty:P,r:4,sp:2]{{Attacks=1 per round + level \\amp specialisation}}{{Damage=+0 vs SM:1d4, L:1d3, + Str bonus}}DmgData=[w:Hook,sb:1,+:0,SM:1d4,L:1d3]{{desc=The gaff or hook is actually a tool used to hook and land fish. It is commonly found where fishing boats are encountered, and the hooks are in plentiful supply, affording the disarmed adventurer a weapon of last resort.\nA successful hit with the Gaff or Hook will grapple the target as well as doing damage. A Dexterity check next round escapes without additional damage, a Strength check -3 escapes with damage.\nThe gaff consists of a metal hook with a wooden or metal crossbar at the base. A onehanded tool, the hook protrudes from between the middle and ring fingers. Some sailors who have lost a hand have a cup with a gaff hook attached to the stump, guaranteeing that they are never without a weapon.}}'},
{name:'Hook-Fauchard',type:'Melee',ct:'9',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Hook Fauchard}}{{subtitle=Polearm}}{{Speed=[[9]]}}{{Size=Large}}{{Weapon=2-handed melee polearm}}Specs=[Fauchard,Melee,2H,Polearm]{{To-hit=+0 + Str bonus}}ToHitData=[w:Hook Fauchard,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:PS,r:6-8,sp:9]{{Attacks=1 per round, + level \\amp specialisation, Piercing \\amp Slashing}}{{Damage=+0, vs SM:1d4, L:1d4, + Str bonus}}DmgData=[w:Hook Fauchard,sb:1,+:0,SM:1d4,L:1d4]{{desc=This is a normal Hook Fauchard, a type of Polearm. The blade is sharp and keen, but nothing special.\nThis combination weapon is another attempted improvement to the fauchard. A back hook is fitted to the back of the blade, supposedly to dismount horsemen. Like the fauchard, this is not a tremendously successful weapon.}}'},
{name:'Horeshoes-of-Strength',type:'Melee',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Horseshoes of Strength}}{{subtitle=Magic Item}}{{Speed=No effect}}{{Size=Small}}{{Weapon=1-hooved melee horseshoe}}Specs=[Horseshoes,Melee,1H,Horseshoes]{{To-hit=+1}}ToHitData=[w:Horseshoes+1,+:1,n:1,ch:20,cm:1,sz:S,ty:SB,r:5,sp:0]{{Attacks=2 per round (front kicks or rear kicks, Bludgeoning)}}{{Damage=+1, vs SM:1d3, L:1d3, for War Horse}}DmgData=[w:Horseshoes+1,+:1,SM:1d3,L:1d3]{{Reference=House Rules / Prices / Horses}}{{desc=Enable a horse to carry loads as if one level of horse higher. If a Heavy War Horse already, add 50% extra load. Also act as +1 weapon when horse attacks with hooves.}}'},
@@ -1653,6 +1801,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Main-Gauche',type:'Melee',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Main-Gauche}}{{subtitle=Large Dagger}}{{Speed=[[2]]}}{{Size=Small}}{{Weapon=1-handed melee short-bladed}}Specs=[Main-Gauche,Melee,1H,Short-blade]{{To-hit=+0 + Str Bonus}}ToHitData=[w:Main-Gauche,sb:1,+:0,n:2,ch:20,cm:1,sz:S,ty:SP,r:5,sp:2,rc:uncharged,msg:If proficient add +1 benefit on Disarm \\amp Parry maneuvers]{{Attacks=2 per round, + specialisation \\amp level, mainly Piercing (can do Slashing)}}{{Damage=+0, vs. SM:1d4, L:1d3, + Str Bonus}}DmgData=[w:Main-Gauche,sb:1,+:0,SM:1d4,L:1d3]}}{{desc=A large-bladed dagger with a basket hilt (see the description of a Cutlass) and large quillions. Though it is a stabbing weapon, it\'s primarily a defensive weapon wielded in the left-hand in two-weapon technique (or two-weapon style specialization).\nWhen used by someone with Main-gauche weapon proficiency, the weapon confers a +1 bonus to attack rolls with the Disarm and Parry maneuvers. Because of its cutlass-like basket hilt, the main-gauche, too, works like an iron gauntlet if the wielder wishes to punch someone with the hilt rather than slash with the blade.}}'},
{name:'Mancatcher',type:'Melee',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Mancatcher}}{{subtitle=Polearm}}{{Speed=[[7]]}}{{Size=Large}}{{Weapon=1-handed melee polearm}}Specs=[Mancatcher,Melee,1H,Polearm]{{To-hit=+0 + *Dex* bonus}}ToHitData=[w:Mancatcher,db:1,+:0,n:1,ch:20,cm:1,sz:L,ty:N,r:10,sp:7]{{Attacks=1 per round, automatic once caught}}{{Damage=+0, vs SM:1d2, L:1d2, automatic each round, no other bonuses}}DmgData=[w:Mancatcher,sb:1,+:0,SM:1d2,L:1d2]{{desc=This item is a highly specialized type of polearm designed to capture without killing a victim. It consists of a long pole with a spring-loaded set of sharpened jaws at the end. The victim is caught between the arms, which then snap shut. The mancatcher is effective only on man-sized creatures. The target is always treated as AC 10, modified for Dexterity. If a hit is scored, the character is caught. The caught victim loses all shield and Dexterity bonuses and can be pushed and pulled about. This causes an automatic 1d2 points of damage per round and gives a 25% chance of pulling the victim to the ground. The victim can escape on a successful bend bars/lift gates roll, although this results in 1d2 points more damage. A common tactic is to use the weapon to pull horsemen off their mounts, then pin them to the ground.}}'},
{name:'Manticore-tail',type:'Ranged',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Manticore Tail}}{{subtitle=Ranged Weapon}}{{Speed=[[0]] Innate Weapon}}{{Size=Large}}{{Weapon=Body part with projectile spikes}}Specs=[Manticore Tail,Ranged,1H,Innate]{{To-hit=+0 + Dex bonus}}ToHitData=[w:Manticore-tail,sb:1,db:0,+:0,n:1d6,ch:20,cm:1,sz:L,ty:P,sp:0,r:6/12/18]{{Attacks=1d6/round, Piercing}}{{desc=The tail of a Manticore is covered in spikes. In total, the typical Manticore tail has a total of 4d6 tail spikes which can be fired in upto 4 volleys. Each spike does 1d6 damage if it hits.}}'},
+ {name:'Maul-of-the-Titans',type:'Melee|Melee',ct:'4',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{title=Maul of the Titans}}{{subtitle=Mallet}}{{Speed=[[4]]}}{{Size=Large}}{{Weapon=Giant Mallet}}Specs=[Maul-of-the-Titans,Melee,1H,Clubs],[Maul-of-the-Titans,Melee,2H,Clubs]{{To-hit=+2 + str bonus}}ToHitData=[w:Maul of the Titans,dx:0,sb:1,+:2,n:2,sz:L, ty:B,sp:4,rc:uncharged]{{Attacks=2 per round, Bludgeoning}}{{Damage=4d10 bludgeoning damage + str dmg}}DmgData=[w:Maul of the Titans,sb:1,+:2,SM:4d10,L:4d10]{{Range=10ft}}{{desc=This huge mallet is 8 feet long and weighs over 150 pounds. Any giant-sized creature with Strength of 21 or grater can employ it to drive piles of up to 2 feet in diameter into normal earth at 4 feet per blow—two blows per round. The maul will smash to flinders an oaken door of up to 10-foot height by 4-foot width by 2-inch thickness in one blow—two if the door is heavily bound with iron. If used as a weapon, it has a +2 bonus to attack rolls and inflicts 4d10 hit points of damage, exclusive of Strength bonuses.}}'},
{name:'Medium-Horse-Lance',type:'Melee',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Medium Horse Lance}}{{subtitle=Lance}}{{Speed=[[7]]}}{{Size=Large}}{{Weapon=1-handed mounted melee lance}}Specs=[Lance,Melee,1H,Lances]{{To-hit=+0 + Str bonus when mounted}}ToHitData=[w:Medium Horse Lance,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:P,r:10,sp:7]{{Attacks=1 per round + level \\amp specialisation (when mounted), Piercing}}{{Damage=+0, vs SM:1d6+1, L:2d6, + Str bonus when mounted}}DmgData=[w:Medium Horse Lance,sb:1,+:0,SM:1+1d6,L:2d6]{{desc=This is a normal lance for use with a medium war horse. The point is well hardened and the shaft in good condition, but nothing special.}}'},
{name:'Military-Fork',type:'melee',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Military fork}}{{subtitle=Polearm}}{{Speed=[[7]]}}{{Size=Large}}{{Weapon=2-handed melee polearm}}Specs=[military fork,melee,2H,polearm]{{To-Hit=+0 + str bonus}}ToHitData=[w:Military Fork,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:P,r:8-10,sp:7]{{Attacks=1 per round + level \\amp specialisation, Piercing}}{{Damage=+0, vs SM:1d8, l:2d4, + str bonus}}DmgData=[w:Military Fork,sb:1,+:0,SM:1d8,L:2d4]{{desc=This is a normal military fork, a type of polearm. The points are sharp and keen, but nothing special. **Inflicts double damage against charging creatures of large or greater size.**\nThis is one of the simplest modifications of a peasant\'s tool since it is little more than a pitchfork fixed to a longer shaft. With tines strengthened and straightened, the military fork serves well. The need for cutting and cleaving eventually often results in combining the fork with other weapons.}}'},
{name:'Mongol-Horse-Bow',type:'Ranged',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Mongol Horse Bow}}{{subtitle=Bow}}{{Speed=[[7]]}}{{Size=Medium}}{{Weapon=2-handed ranged bow}}Specs=[Shortbow,Ranged,2H,Bow]{{To-hit=+0 + Dex bonus}}ToHitData=[w:Mongol Horse Bow,sb:1,db:1,+:0,n:2,ch:20,cm:1,sz:M,ty:P,sp:7]{{Attacks=2 per round, no increases, Piercing}}{{desc=Very similar to a shortbow, the Mongol Horse Bow is designed to work really well from the back of a horse, but works identically to a shortbow at all times.}}'},
@@ -1674,6 +1823,8 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Ranseur',type:'Melee|Melee',ct:'8',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Ranseur}}{{subtitle=Polearm}}{{Speed=[[8]]}}{{Size=Large}}{{Weapon=2-handed melee polearm}}Specs=[Ranseur,Melee,2H,Polearm],[Ranseur,Melee,2H,Polearm]{{To-hit=+0 + Str bonus}}ToHitData=[w:Ranseur,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:P,r:10-14,sp:8],[w:Ranseur set vs charge,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:P,r:10-14,sp:8]{{Attacks=1 per round + level \\amp specialisation, Piercing}}{{Damage=+0, vs SM:2d4, L:2d4, if set vs charge SM:4d4, L:4d4, + Str bonus}}DmgData=[w:Ranseur,sb:1,+:0,SM:2d4,L:2d4],[w:Ranseur vs charge,sb:1,+:0,SM:4d4,L:4d4]{{desc=This is a normal Ranseurn, a type of Polearm. The point is sharp and keen, but nothing special. **Inflicts double damage when set firmly vs. charge.**\nVery much like the partisan, the Ranseur differs in that the main blade is thinner and the projecting blades extended more like tines of a fork. These can trap a weapon and sometimes punch through armor.}}'},
{name:'Rapier',type:'Melee',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Rapier}}{{subtitle=Sword}}{{Speed=[[2]]}}{{Size=Medium}}{{Weapon=1-handed melee fencing-blade}}Specs=[Rapier,Melee,1H,Fencing-blade]{{To-hit=+0 no bonuses}}ToHitData=[w:Rapier,sb:0,+:0,n:2,ch:20,cm:1,sz:M,ty:P,r:5,sp:2]{{Attacks=2 per round + level \\amp specialisation, Piercing}}{{Damage=+0, vs SM:1d4+2, L:1d4, no bonuses}}DmgData=[w:Rapier,sb:0,+:0,SM:2+1d4,L:1d4]{{desc=This is a normal fencing sword. The blade is sharp but is otherwise unremarkable.}}'},
{name:'Rapier-for-Thieves',type:'Melee',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Thieves Rapier}}{{subtitle=Sword}}{{Speed=[[2]]}}{{Size=Medium}}{{Weapon=1-handed melee fencing-blade}}Specs=[Thieves-Rapier,Melee,1H,Fencing-blade]{{To-hit=+1 + Str bonus}}ToHitData=[w:Rapier,sb:1,+:1,n:2,ch:20,cm:1,sz:M,ty:P,r:5,sp:2]{{Attacks=2 per round + level, Piercing}}{{Damage=+1, vs SM:1d4+2, L:1d4, + Str bonus}}DmgData=[w:Rapier,sb:1,+:1,SM:2+1d4,L:1d4]{{desc=This is a normal fencing sword, but extra-effective in the hands of a thief. The blade is sharp but is otherwise unremarkable.}}'},
+ {name:'Roper-Strand',type:'Ranged',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Roper Strand}}{{subtitle=Ranged Tenticle}}{{Speed=[[0]]}}{{Size=Large}}{{Weapon=Tenticle}}Specs=[Roper-Strand,Ranged,1H,Roper-Strand]{{To-hit=+0 no str bonus}}ToHitData=[w:Roper Strand,dx:0,sb:0,+:0,n:1,sz:L, ty:B,sp:0,rc:uncharged, cmd:!rounds ~~aoe `{selected¦token_id}¦circle¦feet¦0¦\\lbrak;\\lbrak;10*(1+1d4)\\rbrak;\\rbrak;¦¦acid¦true, msg:This strand is only as long as shown by the area of effect and can only entangle those in its area]{{Attacks=1 per round, Bludgeoning}}{{Damage=No damage until "roped in", then bite for 5d4. Also, target must save vs. poison or be weakened to half strength (cumulative per successful attack)}}AmmoData=[w:Roper-Strand,t:Roper-Strand,st:Roper-Strand,sb:0,+:0,SM:0,L:0,cmd:!rounds ~~target single¦`{selected¦token_id}¦`{target¦Who has been roped?¦token_id}¦RoperStrand¦#\\ques;{Distance in feet from roper to victim?¦10\\comma;1¦20\\comma;2¦30\\comma;3¦40\\comma;4¦50\\comma;5}¦-1¦Entangled by the sticky tenticle and being reeled in¦grab ~~target single¦`{selected¦token_id}¦`{target¦Who has been roped?¦token_id}¦RoperAttack¦#\\lbrak;\\lbrak;10*1d3\\rbrak;\\rbrak;¦-10¦You feel somewhat strange¦stopwatch, msg:A successful hit by the tenticle has entangled the victim who is now being reeled in 10ft a round! Also you feel somewhat odd...]{{Range=S:30, L:50}}RangeData=[t:Roper-Strand,+:0,r:3/5]{{desc=A *roper* can shoot a total of six strands, one per round, as far as 50 feet; each strand can extend (1d4+1) x 10 feet and pull up to 750 pounds. Each time a strand hits (requiring a normal attack roll), the victim must make a successful saving throw vs. poison or lose half its Strength (round fractions down). Strength loss occurs 1d3 round after a hit, is cumulative for multiple hits, and lasts for 2d4 turns.\nIf a roper\'s prey cannot break free, it is pulled 10 feet closer per round; when it reaches the roper, the creature bites the victim for 5d4 points of damage (automatic hit against a victim held by a strand). A strand can be pulled off or broken by a character who makes a successful open doors roll. A strand can also be cut; it is AC 0, and it must take at least 6 points damage from a single hit of an edged weapon to be severed.}}'},
+ {name:'SG-Rock',type:'Ranged',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Rock}}{{subtitle=Ranged Weapon}}{{Speed=[[3]]}}{{Size=Large}}{{Weapon=2-handed ranged rock}}Specs=[SG-Rock,Ranged,2H,SG-Rock]{{To-hit=+0 + Str bonus}}ToHitData=[w:Rock,dx:1,sb:0,+:0,n:1,sz:L, ty:B,sp:3,rc:uncharged]{{Attacks=1 per round, Bludgeoning}}{{Damage=+0, vs SM:3d10, L:3d10, No strength bonus}}AmmoData=[w:Rock,t:SG-Rock,st:SG-Rock,sb:0,+:0,SM:3d10,L:3d10]}}{{Range=S:70, M:150, L:300}}RangeData=[t:SG-Rock,+:0,r:7/15/30]{{desc=These rocks are hurled by giants, especially *Stone Giants*.}}'},
{name:'Sabre',type:'Melee|Melee',ct:'4',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Sabre}}{{subtitle=Sword}}{{Speed=[[4]]}}{{Size=Medium}}{{Weapon=1-handed melee fencing-blade}}Specs=[Sabre,Melee,1H,Fencing-blade],[Sabre,Melee,1H,Fencing-blade]{{To-hit=+0 no bonuses}}ToHitData=[w:Sabre,sb:0,+:0,n:2,ch:20,cm:1,sz:M,ty:S,r:5,sp:4,msg:Gains +1 attack bonus on Parry maneuver],[w:Sabre Hilt Punch,sb:0,+:0,n:2,ch:20,cm:1,sz:M,ty:B,r:5,sp:4]{{Attacks=1 per round + level \\amp specialisation, Slashing \\amp Bludgeoning}}{{Damage=+0, vs SM:1d6+1, L:1d8+1, or punch vs. + str bonus}}DmgData=[w:Sabre,sb:0,+:0,SM:1+1d6,L:1+1d8],[w:Sabre Hilt Punch,sb:0,+:0,SM:1d3,L:1d3,msg:See the Player\'s Handbook p97-98. Metal gauntlets and other metal hand-protection makes that 1d3 plus strength bonus and punching effects.]{{desc=The sabre is a light slashing weapon. Its practitioners commonly use only sabre, and often take Single-Weapon Style Specialization and Sabre Weapon Specialization. They are very deadly with their blades and may be inordinately proud of the facial scars they accumulate (and deal out).\nSabre requires its own proficiency, which is related to rapier proficiency. Sabres, like cutlasses and main-gauches, are made with a basket hilt. This confers the normal basket-hilt benefits: +1 to attack rolls with Parry maneuver, and the iron-gauntlet benefit for Punching.}}'},
{name:'Sai',type:'Melee',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Sai}}{{subtitle=Bludgeoning Weapon}}{{Speed=[[2]]}}{{Size=Small}}{{Weapon=1-handed melee bludgeoning weapon}}Specs=[Sai,Melee,1H,Sai]{{To-hit=+0 + Str Bonus}}ToHitData=[w:Sai,sb:1,+:0,n:1,ch:20,cm:1,sz:S,ty:B,r:5,sp:2,rc:uncharged]{{Attacks=1 per round + specialisation \\amp level, Bludgeoning}}{{Damage=+0 + Str Bonus, vs SM:1d4, L:1d2}}DmgData=[w:Sai,sb:1,+:0,SM:1d4,L:1d2]{{desc=This is a short, defensive weapon, consisting of a metal bar with a hilt, and oversized upward-curving quillions. When used by someone with proficiency in the weapon, sai confer a +1 to attack rolls bonus when using the Pin and Disarm maneuvers. Many warriors proficient in the sai take Style Specialization in Two-Weapon technique and utilize twin sai in combat.\nThe normal sai is only a Bludgeoning-damage weapon. However, certain warriors prefer for it to be a sharp stabbing weapon, so the damage may be Piercing instead. A sai may only have one type of damage, not both. This type is for bludgeoning.\nSai are readily available in oriental ports, and are exported.}}'},
{name:'Sai-Piercing',type:'Melee',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Piercing Sai}}{{subtitle=Piercing Weapon}}{{Speed=[[2]]}}{{Size=Small}}{{Weapon=1-handed melee piercing weapon}}Specs=[Sai,Melee,1H,Sai]{{To-hit=+0 + Str Bonus}}ToHitData=[w:Piercing Sai,sb:1,+:0,n:1,ch:20,cm:1,sz:S,ty:P,r:5,sp:2,rc:uncharged]{{Attacks=1 per round + specialisation \\amp level, Piercing}}{{Damage=+0 + Str Bonus, vs SM:1d4, L:1d2}}DmgData=[w:Sai,sb:1,+:0,SM:1d4,L:1d2]{{desc=This is a short, defensive weapon, consisting of a metal bar with a hilt, and oversized upward-curving quillions, and in this case sharpened at the tip. When used by someone with proficiency in the weapon, sai confer a +1 to attack rolls bonus when using the Pin and Disarm maneuvers. Many warriors proficient in the sai take Style Specialization in Two-Weapon technique and utilize twin sai in combat.\nThe normal sai is only a Bludgeoning-damage weapon. However, certain warriors prefer for it to be a sharp stabbing weapon, so the damage may be Piercing instead. A sai may only have one type of damage, not both. This type is for Piercing.\nSai are readily available in oriental ports, and are exported.}}'},
@@ -1703,12 +1854,13 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Stiletto',type:'Melee|Ranged',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Stiletto}}{{subtitle=Knife}}{{Speed=[[2]]}}{{Size=Small}}{{Weapon=1-handed melee fencing-blade, short-blade or throwing-blade}}Specs=[Stiletto|Knife,Melee,1H,Fencing-blade|Short-blade],[Stiletto|Knife,Ranged,1H,Throwing-blade]{{To-hit=+0 + Str \\amp Dex bonuses}}ToHitData=[w:Stiletto,sb:1,+:0,n:2,ch:20,cm:1,sz:S,ty:P,r:3,sp:2,msg:Manually add a +2 bonus to hit when attacking those wearing *Plate Mail* (bronze or normal) *Ring Mail* or *Chain Mail* as its narrow point and blade slip in more readily through any sort of armor that is not solid metal or overlapping plates of metal.],[w:Stiletto,sb:1,db:1,+:0,n:2,ch:20,cm:1,sz:S,ty:P,sp:2,msg:Manually add a +2 bonus to hit when attacking those wearing *Plate Mail* (bronze or normal) *Ring Mail* or *Chain Mail* as its narrow point and blade slip in more readily through any sort of armor that is not solid metal or overlapping plates of metal.]{{Attacks=2 per round + level \\amp specialisation, Slashing \\amp Piercing}}{{Damage=+0, vs SM: 1d3, L:1d2, + Str bonus}}DmgData=[w:Stiletto,sb:1,+:0,SM:1d3,L:1d2],[ ]{{Ammo=+0, vs SM:1d3, L:1d2 + Str bonus}}AmmoData=[w:Stiletto,t:Stiletto|Knife,sb:1,+:0,SM:1d3,L:1d2]{{Range=S:10, M:20, L:30}}RangeData=[t:Stiletto|Knife,+:0,r:1/2/3]{{desc=A standard Stiletto, a type of knife, of good quality. Pointedly sharp, but otherwise ordinary.\nConfers a +2 (non-magical) bonus to attack rolls against certain armor types: Plate mail (bronze and normal), ring mail, and chain mail. (This is because its narrow point and blade slip in more readily through any sort of armor that is not solid metal or overlapping plates of metal.)}}'},
{name:'Stone',type:'ranged',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Stone}}{{subtitle=Stone}}{{Speed=[[1]]}}{{Size=Small}}{{Weapon=1-handed ranged stone}}Specs=[stone,ranged,1H,stones]{{To-Hit=+0 + dex \\amp str bonus}}ToHitData=[w:Stone,sb:1,db:1,+:0,n:1,ch:20,cm:1,sz:L,ty:B,sp:1]{{Attacks=1 per round, doing 1d8 damage}}AmmoData=[w:Stone,t:Stone,sb:1,+:0,SM:1d8,L:1d8]{{Range=S:10, M:20, L:20}}RangeData=[st:stones,r:1/2/2]{{desc=A normal stone from the ground, weighing approximately 10 to 20 lbs}}'},
{name:'Strong-Longbow',type:'Ranged',ct:'8',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Strong Longbow}}{{subtitle=Bow}}{{Speed=[[8]]}}{{Size=Large}}{{Weapon=2-handed ranged bow}}Specs=[Longbow,Ranged,2H,Bow]{{To-hit=+0, + Str \\amp Dex bonuses}}ToHitData=[w:Longbow,sb:1,db:1,+:0,n:2,ch:20,cm:1,sz:L,ty:P,sp:8]{{Attacks=2 per round + level \\amp specialisation, Piercing}}{{desc=This is a longbow with strong limbs, able to be drawn by a very strong bowyer, incorporating strength bonuses. The wood is polished, the limbs flexible, the string taut, but nothing special.}}'},
- {name:'Stun-Dart',type:'Ranged',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Stun Dart}}{{subtitle=Thrown weapon}}{{Speed=[[2]]}}{{Size=Tiny}}{{Weapon=1-handed ranged dart}}Specs=[Stun Dart,Ranged,1H,Stun Dart]{{To-hit=+2, + Str \\amp Dex bonuses}}ToHitData=[w:Stun Dart,sb:1,db:1,+:2,n:3,ch:20,cm:1,sz:T,ty:P,sp:2,rc:uncharged]{{Attacks=3 per round, + specialisation \\amp level, Piercing}}{{Ammo=+0, vs. SM:1d3, L:1d2 + Str Bonus}}AmmoData=[w:Stun Dart,t:Stun Dart,st:Stun Dart,sb:1,+:0,SM:1d3,L:1d2, msg:Releases \\lbrak;Stun Gas\\rbrak;\\lpar;!rounds ~~aoe \\amp#64;{target\\vbar;Who was hit and breathes the gas?\\vbar;token_id}\\vbar;circle\\var;feet\\vbar;0\\vbar;5\\vbar;5\\vbar;acid\\vbar;true ~~target area¦^^tid^^¦\\amp#64;{target\\vbar;Who was hit and breathes the gas?\\vbar;token_id}\\vbar;Stun dart gas\\vbar;1\\vbar;-1\\vbar;Stunned for 1 round - followed by 4 rounds slowed\\vbar;lightning-helix\\rpar; which stuns the victims for 1 round, and then slows them for 4 more rounds]{{Range=S:10, M:20, L:40}}RangeData=[t:Dart,+:0,r:1/2/4]{{desc=Deep Gnomes make and wield stun darts, throwing them to a range of 40 feet, with a +2 bonus to hit. Each dart releases a small puff of gas when it strikes; any creature inhaling the gas must save versus poison or be stunned for 1 round and slowed for the four following rounds.}}'},
+ {name:'Stun-Dart',type:'Ranged',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Stun Dart}}{{subtitle=Thrown weapon}}{{Speed=[[2]]}}{{Size=Tiny}}{{Weapon=1-handed ranged dart}}Specs=[Stun Dart,Ranged,1H,Stun Dart]{{To-hit=+2, + Str \\amp Dex bonuses}}ToHitData=[w:Stun Dart,sb:1,db:1,+:2,n:3,ch:20,cm:1,sz:T,ty:P,sp:2,rc:uncharged]{{Attacks=3 per round, + specialisation \\amp level, Piercing}}{{Ammo=+0, vs. SM:1d3, L:1d2 + Str Bonus}}AmmoData=[w:Stun Dart,t:Stun Dart,st:Stun Dart,sb:1,+:0,SM:1d3,L:1d2, msg:Releases \\lbrak;Stun Gas\\rbrak;\\lpar;!rounds ~~aoe \\amp#64;{target\\vbar;Who was hit and breathes the gas?\\vbar;token_id}\\vbar;circle\\vbar;feet\\vbar;0\\vbar;5\\vbar;5\\vbar;acid\\vbar;true ~~target area¦^^tid^^¦\\amp#64;{target\\vbar;Who was hit and breathes the gas?\\vbar;token_id}\\vbar;Stun dart gas\\vbar;1\\vbar;-1\\vbar;Stunned for 1 round - followed by 4 rounds slowed\\vbar;lightning-helix\\rpar; which stuns the victims for 1 round, and then slows them for 4 more rounds]{{Range=S:10, M:20, L:40}}RangeData=[t:Dart,+:0,r:1/2/4]{{desc=Deep Gnomes make and wield stun darts, throwing them to a range of 40 feet, with a +2 bonus to hit. Each dart releases a small puff of gas when it strikes; any creature inhaling the gas must save versus poison or be stunned for 1 round and slowed for the four following rounds.}}'},
{name:'Sword-of-adaptation+1',type:'Melee',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Sword of Adaptation+1}}{{subtitle=Magic Sword}}{{Speed=[[5]]}}{{Size=Medium}}Specs=[Sword of Adaptation,Melee,1H,Sword]{{To-hit=+[[1]]}}{{Damage=+[[1]]}}{{Roll=Varies by use}}{{desc=This is an exceptional magical sword. The blade is sharp and keen, and is a +[[1]] magical weapon at all times. However, it can adapt to be a sword of any type the wielder desires (and is proficient with). It will take [[1]] round to change shape to a different type of sword.}}'},
{name:'Tetsubo',type:'Melee',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Tetsubo}}{{subtitle=Polearm}}{{Speed=[[7]]}}{{Size=Large}}{{Weapon=2-handed melee polearm}}Specs=[Tetsubo,Melee,2H,Polearm]{{To-hit=+0 + Str Bonus}}ToHitData=[w:Tetsubo,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:B,r:6,sp:7,rc:uncharged]{{Attacks=1 per round, + specialisation \\amp level, Bludgeoning}}{{Damage=+0, vs. SM:1d8, L:1d8, + Str Bonus}}DmgData=[w:Tetsubo,sb:1,+:0,SM:1d8,L:1d8]}}{{desc=The tetsubo is a long walking-staff, its upper end shod with studded iron strips. \nIts weapon proficiency is related to other polearms; specialization confers the usual benefits.\nTetsubos can be had in oriental markets, but none are exported because it is a relatively simple weapon to make.}}'},
{name:'Throwing-Axe',type:'Melee|Ranged',ct:'4',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Throwing Axe}}{{subtitle=Axe}}{{Speed=[[4]]}}{{Size=Medium}}{{Weapon=1-handed melee \\amp thrown axe}}Specs=[Throwing Axe,Melee,1H,Axe],[Throwing Axe,Ranged,1H,Axe]{{To-hit=+0, + Str \\amp Dex bonuses}}ToHitData=[w:Throwing Axe,sb:1,+:0,n:1,ch:20,cm:1,sz:M,ty:S,r:5,sp:4],[w:Throwing Axe,sb:1,db:1,+:0,n:1,ch:20,cm:1,sz:M,ty:S,sp:4]{{Attacks=1 per round + level \\amp specialisation, Slashing}}{{Damage=+0, vs SM:1d6, L:1d4, + Str bonus}}DmgData=[w:Throwing Axe,sb:1,+:0,SM:1d6,L:1d4],[]{{Ammo=+0, SM:1d6, L:1d4, + Str bonus}}AmmoData=[w:Throwing Axe,t:Throwing Axe,st:Axe,sb:1,+:0,SM:1d6,L:1d4]}}{{Range=S:10, M:20, L:30}}RangeData=[t:Throwing Axe,+:0,r:1/2/3]{{desc=This is a normal Hand- or Throwing-Axe. The blade is extra sharp and it is well balanced, but nothing special.}}'},
{name:'Throwing-Dagger+4',type:'Melee|Ranged',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Throwing Dagger +0/+4}}{{subtitle=Magic Weapon}}{{Speed=[[2]]}}{{Size=Small}}{{Weapon=1-handed melee or thrown short-blade}}Specs=[Dagger,Melee,1H,Short-blade],[Dagger,Ranged,1H,Throwing-blade]{{To-hit=+0, +4 when thrown, + Str \\amp Dex bonus}}ToHitData=[w:Throwing Dagger+0,sb:1,+:0,n:2,ch:20,cm:1,sz:S,ty:S,r:5,sp:2],[w:Throwing-Dagger+4,sb:1,db:1,+:4,n:2,ch:20,cm:1,sz:S,ty:P,sp:2]{{Attacks=2 per round + level \\amp specialisation, Slashing \\amp Piercing}}{{Damage=+0, vs SM:1d4, L:1d3, + Str bonus}}DmgData=[w:Throwing Dagger+0,sb:1,+:0,SM:1d4,L:1d3],[ ]}}{{Ammo=+4, vs SM:1d4, L:1d3, + Str bonus}}AmmoData=[w:Throwing Dagger+4,t:Dagger,st:Dagger,sb:1,+:4,SM:1d4,L:1d3]{{Range=S:10, M:20, L:30}}RangeData=[t:Dagger,+:4,r:1/2/3]{{desc=This is a finely balanced throwing dagger, which is +4 to hit and for damage when thrown (though it has no bonuses if used in the hand)}}'},
{name:'Throwing-axe+1',type:'Melee|Ranged',ct:'4',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Throwing Axe+1}}{{subtitle=Magic Weapon}}{{Speed=[[4]]}}{{Size=Medium}}{{Weapon=1-handed melee or thrown axe}}Specs=[Throwing-Axe,Melee,1H,Axe],[Throwing-Axe,Ranged,1H,Throwing-blade]{{To-hit=+1 + Str \\amp Dex bonuses}}ToHitData=[w:Throwing Axe+1,sb:1,+:1,n:1,ch:20,cm:1,sz:M,ty:S,r:3,sp:4],[w:Throwing Axe+1,sb:1,db:1,+:1,n:1,ch:20,cm:1,sz:M,ty:S,sp:4,r:-/1/2/3]{{Attacks=1 per round + level \\amp specialisation}}{{Damage=+1, vs SM:1d6, L:1d4, + Str bonus}}DmgData=[w:Throwing Axe+1,sb:1,+:1,SM:1d6,L:1d4],[]}}{{Ammo=+1, vs SM:1d6, L:1d4, + Str bonus}}AmmoData=[w:Throwing Axe,t:Throwing-Axe,sb:1,+:1,SM:1d6,L:1d4]{{Range=S:10, M:20, L:30}}RangeData=[t:Throwing-Axe,+:1,r:-/1/2/3]{{desc=A standard Throwing Axe of fine quality, good enough to be enchanted to be a +1 magical weapon}}'},
+ {name:'Titan-Special-Attack',type:'Melee|Ranged',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{title=Titan Special Attack}}{{subtitle=Special Attack}}{{Speed=[[10]]}}{{Size=N/A}}{{Weapon=Some Titans kick, some punch, others use a breath attack, lightning, etc.}}Specs=[Titan-Special-Attack,Melee,1H,Titan-Special-Attack],[Titan-Special-Attack,Ranged,1H,Titan-Special-Attack]{{To-hit=+0 no str bonus}}ToHitData=[w:Titans Special Melee Attack,dx:0,sb:0,+:0,n:1/2, ty:SPB,sp:10,r:1000,rc:uncharged],[w:Titans Special Ranged Attack,dx:0,sb:0,+:0,n:1/2, ty:SPB,sp:10,rc:uncharged]{{Attacks=one every two rounds, either Melee or Ranged}}DmgData=[w:Titan Special Attack,sb:0,+:0,SM:10*1d6,L:10*1d6],[]{{Damage=10 to 60 HP damage}}AmmoData=[w:Titans Special Ranged Attack,t:Titan-Special-Attack,st:Titan-Special-Attack,sb:0, ru:1,+:0,SM:10*1d6,L:10*1d6]{{Range=Special}}RangeData=[t:Titan-Special-Attack,r:1000/2000/3000]{{desc=Titans may choose to make a single other attack in a round. This form of special attack is so destructive and deadly, that a titan will use it only if there are no other options left open. The form of each titan\'s attack will be different (some kick, some punch, others use a breath attack, lightning, etc.), but the effect is the same for each. The special attack inflicts 10-60 points of damage per hit and can be used every other round. These mighty attacks have been known to destroy buildings and sink ships.}}'},
{name:'Touch',type:'Melee|Melee|Ranged|Ranged',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Touch}}{{subtitle=Innate Action}}{{Speed=[[0]]}}{{Size=None}}{{Weapon=1- or 2-handed melee innate ability}}Specs=[Innate,Melee,1H,Innate],[Innate,Melee,2H,Innate],[Innate,Ranged,1H,Innate],[Innate,Ranged,2H,Innate]{{To-hit=+0 + Str bonus (melee only)}}ToHitData=[w:Touch,sb:1,+:0,n:1,ch:20,cm:1,sz:T,ty:B,r:5,sp:0],[w:Touch,sb:1,+:0,n:1,ch:20,cm:1,sz:T,ty:B,r:5,sp:0],[w:Touch,sb:0,+:0,n:1,ch:20,cm:1,sz:T,ty:B,sp:0],[w:Touch,sb:0,+:0,n:1,ch:20,cm:1,sz:T,ty:B,sp:0]{{Attacks=1 per round + level}}{{Damage=Depends on action or spell}}DmgData=[w:Touch,sb:0,+:0,SM:0,L:0],[w:Touch,sb:0,+:0,SM:0,L:0],[],[]{{Ranged Effect=Only relevant when casting a ranged attack spell}}AmmoData=[w:Touch,t:Touch,ru:1,sb:0,+:0,SM:0,L:0]{{Range=As per ranged attack spell}}RangeData=[t:Touch,+:0,r:-/20]{{desc=Touching with a hand or other limb not containing a weapon. Typically a spell caster\'s ability which they select as a weapon when aiming to use a Touch spell}}'},
{name:'Trident',type:'Melee|Melee|Ranged',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Trident}}{{subtitle=Weapon}}{{Speed=7}}{{Size=Large}}{{Weapon=1 or 2-handed melee or thrown spear}}Specs=[Trident,Melee,1H,Spears],[Trident,Melee,2H,Spears],[Trident,Ranged,1H,Throwing-Spears]{{To-hit=+0 + Str \\amp Dex bonuses}}ToHitData=[w:Trident,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:P,r:8,sp:7],[w:Trident 2H,sb:1,+:0,n:1,ch:20,cm:1,sz:L,ty:P,r:8,sp:7],[w:Trident,sb:1,db:1,+:0,n:1,ch:20,cm:1,sz:L,ty:P,sp:7]{{Attacks=1 per round + level \\amp specialisation, Piercing}}{{Damage=+0, 1-handed vs SM:1d6+1, L:3d4, 2-handed vs SM:1d8+1, L:3d4, + Str bonus}}DmgData=[w:Trident,sb:1,+:0,SM:1+1d6,L:3d4],[w:Trident 2H,sb:1,+:0,SM:1+1d8,L:3d4],[]{{Ammo=+0, vs SM:1d6+1, L:3d4, + Str bonus}}AmmoData=[w:Trident,t:Trident,st:Spear,sb:1,+:0,qty:1,SM:1+1d6,L:3d4]{{Range=S:10, L:20}}RangeData=[t:Trident,+:0,r:1/1/2]{{desc=This three-tined fork atop a stout 6-foot long rod appears to be a barbed military fork or Trident. It can be used a either a melee weapon or thrown a short distance as a ranged weapon. It is of good quality, but otherwise ordinary.}}'},
{name:'Trident-of-Fish-Command',type:'Melee|Ranged|Magic',ct:'7',charge:'rechargeable',cost:'0',body:'\\amp{template:'+fields.weaponTemplate+'}{{name=Trident of Fish Command}}{{subtitle=Weapon}}WeapData=[w:Trident of Fish Command,sp:7,rc:rechargeable]{{Speed=7}}{{Size=Large}}{{Weapon=1-handed melee or thrown spear}}Specs=[Trident,Melee,1H,Spears],[Trident,Ranged,1H,Throwing-Spears],[Trident,Magic,0H,Enchantment-Charm]{{To-hit=+3 + Str \\amp Dex bonuses}}ToHitData=[w:Trident Fish Command,sb:1,+:3,n:1,ch:20,cm:1,sz:L,ty:P,r:8,sp:7],[w:Trident Fish Command,sb:1,db:1,+:3,n:1,ch:20,cm:1,sz:L,ty:P,sp:7],[w:Fish Command,desc:Fish-Command,sp:1,lv:6,c:1]{{Attacks=1 per round + level \\amp specialisation, Piercing}}{{Damage=+3, vs SM:1d6+1, L:3d4, + Str bonus}}DmgData=[w:Trident Fish Command,sb:1,+:3,SM:1+1d6,L:3d4],[]{{Ammo=+3, vs SM:1d6+1, L:3d4, + Str bonus}}AmmoData=[w:Trident Fish Command,t:Trident,st:Spear,sb:1,+:3,qty:1,SM:1+1d6,L:3d4]{{Range=S:10, L:20}}RangeData=[t:Trident,+:3,r:1/1/2]{{Other Powers=Fish Command}}{{desc=This three-tined fork atop a stout 6-foot long rod appears to be a barbed military fork of some sort. However, its magical properties enable its wielder to cause all fish within a 60-foot radius to roll saving throws vs. spell. This uses one charge of the trident. Fish failing this throw are completely under empathic command and will not attack the possessor of the trident nor any creature within 10 feet of him. The wielder of the device can cause fish to move in whatever direction is desired and can convey messages of emotion (i.e., fear, hunger, anger, indifference, repletion, etc.). Fish making their saving throw are free of empathic control, but they will not approach within 10 feet of the trident.\nIn addition to ordinary fish, the trident affects sharks and eels. It doesn\'t affect molluscs, crustaceans, amphibians, reptiles, mammals, and similar sorts of non-piscine marine creatures. A school of fish should be checked as a single entity.\nA trident of this type contains 1d4+16 charges. It is otherwise a +1 magical weapon.}}'},
@@ -2102,7 +2254,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Staff-of-the-Woodlands+1',type:'Rod|Melee|Magic|Magic|Magic|Magic|Magic|Magic|Rod',ct:'4',charge:'rechargeable',cost:'0',body:'\\amp{template:'+fields.wandTemplate+'}{{title=Staff}}{{name= of the Woodalnds+1}}{{subtitle=Staff}}WandData=[w:Staff of the Woodlands,st:Staff,wt:4,sp:4,c:0,qty:19+1d6,rc:rechargeable,loc:both hands,ns:3],[cl:PW,w:PR-Pass-Without-Trace,sp:10,pd:1],[cl:PW,w:PR-Barkskin,sp:5,pd:1],[cl:PW,w:PR-Tree,sp:6,pd:1]{{Speed=[[4]]}}{{Size=Medium}}{{Weapon=2-handed melee staff}}Specs=[Staff of the Woodlands|Quarterstaff,Rod|Melee,2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Rod,1H|2H,Alteration]{{To-hit=+1, +Str Bonus}}ToHitData=[w:Staff of the Woodlands+1,sb:1,+:1,n:1,ch:20,cm:1,sz:M,ty:B,r:5,sp:4,c:0],[w:Wall of Thorns,desc:PR-Wall-of-Thorns,sp:9,lv:12,c:1],[w:Animal Friendship+Speak with Animals,cmd:!magic --display-ability \\amp#64;{selected|token_id}|PR-Spells-DB|Animal-Friendship --display-ability \\amp#64;{selected|token_id}|PR-Spells-DB|Speak-with-Animals,sp:10,lv:8,c:1],[w:Animate Tree,desc:Animate-Tree,sp:10,lv:12,c:1],[w:Pass Without Trace,pw:PR-Pass-Without-Trace,sp:10,lv:8,c:0],[w:Barkskin,pw:PR-Barkskin,sp:5,lv:8,c:0],[w:Tree,pw:PR-Tree,sp:6,lv:8,c:0]{{Attacks=+1, 1 per round + level \\amp spec}}{{Damage=+1 plus str bonus, SM: 1d6, L:1d6}}DmgData=[w:Staff of the Woodlands+1,sb:1,+:1,SM:1d6,L:1d6]{{Use=Take in-hand using the *Change Weapon* dialogue, then use the *Attack* action for a Melee weapon attack as normal, or to use one of the powers of the staff}}{{Looks Like=This sort of staff is always made from oak, ash, or yew, finely grained, beautifully carved with vines, leaves and scenes of nature, and bound with bronze.}}{{desc=It is effective only in the hands of a druid. Each such staff has the following powers, with each expending one charge per use:\n• Wall of thorns\n• Animal friendship plus speak with animals (together for 1 charge)\n• Animate tree\nIn addition to these powers, each staff of the woodlands has a magical weapon value. Those with a lesser value have extra magical powers that do not require charges and can be employed once per day: The +4 staff has no additional powers; the +3 staff also confers the power of pass without trace; the +2 staff confers the powers of pass without trace and barkskin; the +1 staff confers the powers of the +2 staff plus the power of the tree spell.}}'},
{name:'Staff-of-the-Woodlands+2',type:'Rod|Melee|Magic|Magic|Magic|Magic|Magic|Rod',ct:'4',charge:'rechargeable',cost:'0',body:'\\amp{template:'+fields.wandTemplate+'}{{title=Staff}}{{name= of the Woodalnds+2}}{{subtitle=Staff}}WandData=[w:Staff of the Woodlands,st:Staff,wt:4,sp:4,c:0,qty:19+1d6,rc:rechargeable,loc:both hands,ns:2],[cl:PW,w:PR-Pass-Without-Trace,sp:10,pd:1],[cl:PW,w:PR-Barkskin,sp:5,pd:1]{{Speed=[[4]]}}{{Size=Medium}}{{Weapon=2-handed melee staff}}Specs=[Staff of the Woodlands|Quarterstaff,Rod|Melee,2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Rod,1H|2H,Alteration]{{To-hit=+2, +Str Bonus}}ToHitData=[w:Staff of the Woodlands+2,sb:1,+:2,n:1,ch:20,cm:1,sz:M,ty:B,r:5,sp:4,c:0],[w:Wall of Thorns,desc:PR-Wall-of-Thorns,sp:9,lv:12,c:1],[w:Animal Friendship+Speak with Animals,cmd:!magic --display-ability \\amp#64;{selected|token_id}|PR-Spells-DB|Animal-Friendship --display-ability \\amp#64;{selected|token_id}|PR-Spells-DB|Speak-with-Animals,sp:10,lv:8,c:1],[w:Animate Tree,desc:Animate-Tree,sp:10,lv:12,c:1],[w:Pass Without Trace,pw:PR-Pass-Without-Trace,sp:10,lv:8,c:0],[w:Barkskin,pw:PR-Barkskin,sp:5,lv:8,c:0]{{Attacks=+2, 1 per round + level \\amp spec}}{{Damage=+2 plus str bonus, SM: 1d6, L:1d6}}DmgData=[w:Staff of the Woodlands+2,sb:1,+:2,SM:1d6,L:1d6]{{Use=Take in-hand using the *Change Weapon* dialogue, then use the *Attack* action for a Melee weapon attack as normal, or to use one of the powers of the staff}}{{Looks Like=This sort of staff is always made from oak, ash, or yew, finely grained, beautifully carved with vines, leaves and scenes of nature, and bound with bronze.}}{{desc=It is effective only in the hands of a druid. Each such staff has the following powers, with each expending one charge per use:\n• Wall of thorns\n• Animal friendship plus speak with animals (together for 1 charge)\n• Animate tree\nIn addition to these powers, each staff of the woodlands has a magical weapon value. Those with a lesser value have extra magical powers that do not require charges and can be employed once per day: The +2 staff confers the powers of *pass without trace* and *barkskin*.}}'},
{name:'Staff-of-the-Woodlands+3',type:'Rod|Melee|Magic|Magic|Magic|Magic|Rod',ct:'4',charge:'rechargeable',cost:'0',body:'\\amp{template:'+fields.wandTemplate+'}{{title=Staff}}{{name= of the Woodalnds+3}}{{subtitle=Staff}}WandData=[w:Staff of the Woodlands,st:Staff,wt:4,sp:4,c:0,qty:19+1d6,rc:rechargeable,loc:both hands,ns:1],[cl:PW,w:PR-Pass-Without-Trace,sp:10,pd:1]{{Speed=[[4]]}}{{Size=Medium}}{{Weapon=2-handed melee staff}}Specs=[Staff of the Woodlands|Quarterstaff,Rod|Melee,2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Rod,1H|2H,Alteration]{{To-hit=+3, +Str Bonus}}ToHitData=[w:Staff of the Woodlands+3,sb:1,+:3,n:1,ch:20,cm:1,sz:M,ty:B,r:5,sp:4,c:0],[w:Wall of Thorns,desc:PR-Wall-of-Thorns,sp:9,lv:12,c:1],[w:Animal Friendship+Speak with Animals,cmd:!magic --display-ability \\amp#64;{selected|token_id}|PR-Spells-DB|Animal-Friendship --display-ability \\amp#64;{selected|token_id}|PR-Spells-DB|Speak-with-Animals,sp:10,lv:8,c:1],[w:Animate Tree,desc:Animate-Tree,sp:10,lv:12,c:1],[w:Pass Without Trace,pw:PR-Pass-Without-Trace,sp:10,lv:8,c:0]{{Attacks=+3, 1 per round + level \\amp spec}}{{Damage=+3 plus str bonus, SM: 1d6, L:1d6}}DmgData=[w:Staff of the Woodlands+3,sb:1,+:3,SM:1d6,L:1d6]{{Use=Take in-hand using the *Change Weapon* dialogue, then use the *Attack* action for a Melee weapon attack as normal, or to use one of the powers of the staff}}{{Looks Like=This sort of staff is always made from oak, ash, or yew, finely grained, beautifully carved with vines, leaves and scenes of nature, and bound with bronze.}}{{desc=It is effective only in the hands of a druid. Each such staff has the following powers, with each expending one charge per use:\n• Wall of thorns\n• Animal friendship plus speak with animals (together for 1 charge)\n• Animate tree\nIn addition to these powers, each staff of the woodlands has a magical weapon value. Those with a lesser value have extra magical powers that do not require charges and can be employed once per day: The +3 staff confers the power of *pass without trace*.}}'},
- {name:'Staff-of-theWoodlands+4',type:'Rod|Melee|Magic|Magic|Magic|Rod',ct:'4',charge:'rechargeable',cost:'0',body:'\\amp{template:'+fields.wandTemplate+'}{{title=Staff}}{{name= of the Woodalnds+4}}{{subtitle=Staff}}WandData=[w:Staff of the Woodlands,st:Staff,wt:4,sp:4,c:0,qty:19+1d6,rc:rechargeable,loc:both hands]{{Speed=[[4]]}}{{Size=Medium}}{{Weapon=2-handed melee staff}}Specs=[Staff of the Woodlands|Quarterstaff,Rod|Melee,2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Rod,1H|2H,Alteration]{{To-hit=+4, +Str Bonus}}ToHitData=[w:Staff of the Woodlands+4,sb:1,+:4,n:1,ch:20,cm:1,sz:M,ty:B,r:5,sp:4,c:0],[w:Wall of Thorns,desc:PR-Wall-of-Thorns,sp:9,lv:12,c:1],[w:Animal Friendship+Speak with Animals,cmd:!magic --display-ability \\amp#64;{selected|token_id}|PR-Spells-DB|Animal-Friendship --display-ability \\amp#64;{selected|token_id}|PR-Spells-DB|Speak-with-Animals,sp:10,lv:8,c:1],[w:Animate Tree,desc:Animate-Tree,sp:10,lv:12,c:1]{{Attacks=+4, 1 per round + level \\amp spec}}{{Damage=+4 plus str bonus, SM: 1d6, L:1d6}}DmgData=[w:Staff of the Woodlands+4,sb:1,+:4,SM:1d6,L:1d6]{{Use=Take in-hand using the *Change Weapon* dialogue, then use the *Attack* action for a Melee weapon attack as normal, or to use one of the powers of the staff}}{{Looks Like=This sort of staff is always made from oak, ash, or yew, finely grained, beautifully carved with vines, leaves and scenes of nature, and bound with bronze.}}{{desc=It is effective only in the hands of a druid. Each such staff has the following powers, with each expending one charge per use:\n• Wall of thorns\n• Animal friendship plus speak with animals (together for 1 charge)\n• Animate tree\nIn addition to these powers, each staff of the woodlands has a magical weapon value. Those with a lesser value have extra magical powers that do not require charges and can be employed once per day. However, the +4 staff has no additional powers.}}'},
+ {name:'Staff-of-the-Woodlands+4',type:'Rod|Melee|Magic|Magic|Magic|Rod',ct:'4',charge:'rechargeable',cost:'0',body:'\\amp{template:'+fields.wandTemplate+'}{{title=Staff}}{{name= of the Woodalnds+4}}{{subtitle=Staff}}WandData=[w:Staff of the Woodlands,st:Staff,wt:4,sp:4,c:0,qty:19+1d6,rc:rechargeable,loc:both hands]{{Speed=[[4]]}}{{Size=Medium}}{{Weapon=2-handed melee staff}}Specs=[Staff of the Woodlands|Quarterstaff,Rod|Melee,2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Magic,1H|2H,Staff],[Staff of the Woodlands,Rod,1H|2H,Alteration]{{To-hit=+4, +Str Bonus}}ToHitData=[w:Staff of the Woodlands+4,sb:1,+:4,n:1,ch:20,cm:1,sz:M,ty:B,r:5,sp:4,c:0],[w:Wall of Thorns,desc:PR-Wall-of-Thorns,sp:9,lv:12,c:1],[w:Animal Friendship+Speak with Animals,cmd:!magic --display-ability \\amp#64;{selected|token_id}|PR-Spells-DB|Animal-Friendship --display-ability \\amp#64;{selected|token_id}|PR-Spells-DB|Speak-with-Animals,sp:10,lv:8,c:1],[w:Animate Tree,desc:Animate-Tree,sp:10,lv:12,c:1]{{Attacks=+4, 1 per round + level \\amp spec}}{{Damage=+4 plus str bonus, SM: 1d6, L:1d6}}DmgData=[w:Staff of the Woodlands+4,sb:1,+:4,SM:1d6,L:1d6]{{Use=Take in-hand using the *Change Weapon* dialogue, then use the *Attack* action for a Melee weapon attack as normal, or to use one of the powers of the staff}}{{Looks Like=This sort of staff is always made from oak, ash, or yew, finely grained, beautifully carved with vines, leaves and scenes of nature, and bound with bronze.}}{{desc=It is effective only in the hands of a druid. Each such staff has the following powers, with each expending one charge per use:\n• Wall of thorns\n• Animal friendship plus speak with animals (together for 1 charge)\n• Animate tree\nIn addition to these powers, each staff of the woodlands has a magical weapon value. Those with a lesser value have extra magical powers that do not require charges and can be employed once per day. However, the +4 staff has no additional powers.}}'},
{name:'To-hit-Wand-PolyTouch',type:'',ct:'0',charge:'uncharged',cost:'0',body:'**@{selected|token_name} hits AC [[( [[0]] - [[1d20]] + (@{selected|thac0}) )]] with their Wand of Polymorph in touch mode.**\n/w "@{selected|character_name}" [Success](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Select a target|token_id}|Poly-touch|16|-1|Polymorphed by Poly-Touch|snail)'},
{name:'WW-Cast',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.wandTemplate+'Spell}{{title=Wand of Wonder}}{{splevel=Wand}}{{school=Alteration}}{{components=V,M}}{{time=[[6]]}}{{range=Special}}{{duration=Special}}{{aoe=Special}}{{save=Where Applicable}}{{effects=The *wand of wonder* is a strange and unpredictable device that will generate any number of strange effects, randomly, each time it is used. A percentile dice is rolled to determine what the effect is. With this version of the wand, the player does not know what the effects are until they happen.\n[Roll D100](!\\amp#13;\\amp#47;gr 1d100 for Wand of Wonder) then choose from\n[01-10](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Slow which creature?|token_id}|Slow|10|-1|Creature is slowed, with a worse AC \\amp attacks|snail) [11-18](!magic --message gm|@{selected|token_id}|Wand of Wonder|Tell player that the result is actually \\amp#91;[1d100]\\amp#93; which is actually untrue and belief only lasts for 1 round) [19-25](!magic --display-ability @{selected|token_id}|MU-Spells-DB|Gust-of-Wind) [26-30](!magic --display-ability @{selected|token_id}|MU-Spells-DB|Stinking-Cloud) [31-33](!rounds --aoe @{selected|token_id}|circle|feet|0|120|120|blue|true\\amp#13;!magic --message public|@{selected|token_id}|Heavy Rain|A heavy downpour of rain occurs in the displayed area) [34-36](!magic --message @{selected|token_id}|Summon Mammal|\\lbrak;Roll d100 again\\rbrak;\\lpar;!\\cr;\\ampamp;#47;r 1d100\\rpar; and summon rhino on 1-25, elephant on 26-50, or mouse on 51-00. Ask DM to *Drag \\amp Drop* the relevant creature onto the map) [37-46](!rounds --aoe @{selected|token_id}|bolt|feet|0|70|5|lightning|true\\amp#13;!magic --message @{selected|token_id}|Lightning Bolt|The lightning bolt does \\lbrak;6d6, 1s as 2s\\rbrak;\\lpar;!\\ampamp;#13;\\ampamp;#47;w gm \\ampamp;#91;\\lbrak;{ {1d6}, {1d6}, {1d6}, {1d6}, {1d6}, {1d6}, {2}, {2}, {2}, {2}, {2}, {2} }k6\\rbrak;\\ampamp;#93;HP damage\\rpar; HP of damage) [47-49](!magic --message @{selected|token_id}|Butterflies|Everyone in the area marked, including the caster, is blinded by clouds of large fluttering butterflies! Use the *Select a Target* button to select blinded creatures\\amp#13;!rounds --aoe @{selected|token_id}|circle|feet|0|120|120|light|true|@{selected|token_id}|area|Blindness|2|-1|Blinded by 600 large butterflies fluttering in a cloud|bleeding-eye) [50-53](!magic --display-ability @{selected|token_id}|MU-Spells-DB|Enlarge) [54-58](!rounds --aoe @{selected|token_id}|circle|feet|30|30|30|dark\\amp#13;!magic --message w|@{selected|token_id}|Darkness 15ft Radius|Place the corsshair on the edge of the range circle then confirm) [59-62](!rounds --aoe @{selected|token_id}|bolt|feet|0|40|40|green|true\\amp#13;!magic --message public|@{selected|token_id}|Instant Field|Grass has grown in the 160sq.ft. indicated) [63-65](!magic --message public|@{selected|token_id}|Vanishing Object|A target nonliving object of up to 1,000 pounds mass and up to 30 cubic feet in size has vanished) [66-69](!magic --message public|@{selected|token_id}|Shrinkage|The wand wielder has diminished to 1/12th of their previous size) [70-79](!magic --display-ability @{selected|token_id}|Powers-DB|WoF-Fireball) [80-84](!rounds --target caster|@{selected|token_id}|Invisibility|99|0|Have become invisible, as per spell, with +4 improvement in AC. Become visible on attack|half-haze) [85-87](!rounds --aoe @{selected|token_id}|circle|feet|0|60|60|green|true|@{selected|token_id}|single|WoW Leafy|99|0|Make like a tree and leaf|three-leaves) [88-90](!rounds --aoe @{selected|token_id}|bolt|feet|0|30|2|magic|true\\amp#13;!magic --message public|@{selected|token_id}|Stream of 1gp Gems|\\amp#91;\\lbrak;10\\amp#42;\\lpar;1d4\\rpar;\\rbrak;\\amp#93; gems shoot out of the wand and do \\amp#91;\\lbrak;5d4\\rbrak;\\amp#93; HP damage to the 1st creature they hit in range) [91-97](!rounds --aoe @{selected|token_id}|bolt|feet|0|40|30|magic|true|@{selected|token_id}|area|Blindness|\\amp#91;[1d6]\\amp#93;|-1|Blinded by the pretty dancing lights!|bleeding-eye) [98-00](!rounds --aoe @{selected|token_id}|bolt|feet|0|60|5|magic|true|@{selected|token_id}|single|WoW Petrified|99|0|If was flesh, is now stone. If was stone, is now flesh|aura)\nThe wand uses one charge per function. It may not be recharged. Where applicable, saving throws should be made.}}{{materials=Wand}}{{Use=Take the wand in-hand using the *Change Weapon* dialogue in order to use its powers with the *Attack* action}}'},
{name:'Wand-MM-1',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.wandTemplate+'}{{name=Wand of Magic Missiles\nfires 1 missile}}{{desc=One missile does [[?{Roll missile damage|1+1d4}]] damage to the target creature}}'},
@@ -2398,6 +2550,14 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Pearl-of-Power-9th-Level',type:'Miscellaneous',ct:'3',charge:'recharging',cost:'0',body:'\\amp{template:'+fields.itemTemplate+'}{{}}Specs=[Pearl of Power,Miscellaneous,1H,Invocation]{{}}MiscData=[w:Pearl of Power,st:Pearl,sp:3,qty:1,rc:recharging]{{}}%{MI-DB|Pearl-of-Power}{{name= of Power\n*9th level spells*}}{{Use=Re-memorise [a 9th level spell](!magic --button EDIT_MUSPELLS|@{selected|token_id}|9|-1|-1|||single) but only one you memorised for today}}{{GM info=}}'},
{name:'Pearl-of-Wisdom',type:'Miscellaneous',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.itemTemplate+'}{{title=Pearl}}{{name= of Wisdom}}{{subtitle=Magical Pearl}}Specs=[Pearl of Wisdom,Miscellaneous,0H,Alteration]{{Size=Tiny}}MiscData=[w:Pearl of Wisdom,st:Pearl,sz:T,wt:0,sp:3,qty:1,rc:uncharged]{{Looks Like=A seemingly normal pearl of average size and coloration}}{{Use=Manually add a point of wisdom to the possessor\'s wisdom after 30 days.}}{{desc=Although it appears to be a normal pearl, a pearl of wisdom causes a priest to increase one point in Wisdom if they retains the pearl for one month. The increase happens at the end of 30 days, but thereafter the priest must keep the pearl with them or the one point gain will be lost.}}'},
{name:'Pearl-of-the-Sirines',type:'Miscellaneous',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.itemTemplate+'}{{title=Pearl}}{{name= of the Sirines}}{{subtitle=Magical Pearl}}Specs=[Pearl of the Sirines,Miscellaneous,0H,Alteration]{{Size=Tiny}}MiscData=[w:Pearl of the Sirines,st:Pearl,sz:T,wt:0,sp:3,qty:1,rc:uncharged]{{Looks Like=A seemingly normal pearl of good size and excellent coloration, very beautiful and worth at least 1,000 gp}}{{desc=Radiates faintly of enchantment if magic is detected for. If it is clasped firmly in hand (or to the breast) and the possessor attempts actions related to the pearl\'s power areas, he will understand and be able to employ the item.\nThe pearl enables its possessor to breathe in water as if he were in clean, fresh air. Underwater movement rate is 24. The possessor is immune to ill effects from the poison touch of a sirine. The pearl must be within the general area of the possessor - less than 10 feet distant - to convey its powers to him.}}'},
+ {name:'Periapt-of-Foul-Rotting',type:'Miscellaneous',ct:'3',charge:'cursed',cost:'0',body:'\\amp{template:'+fields.itemTemplate+'}{{title=Gem}}{{name=\nPeriapt of Foul Rotting}}{{subtitle=Cursed Gem}}Specs=[Periapt of Foul Rotting,Miscellaneous,0H,Necromancy]{{Size=Tiny}}MiscData=[w:Periapt of Foul Rotting,st:Engraved Gem,sz:T,wt:0,sp:3,qty:1,rc:cursed]{{Use=Manually deduct a point each of Dexterity, Constitution, and Charisma per week beginning one week after claiming the item from the possessor\'s character sheet}}{{GM info=Always either auto-hide or manually hide this item using the *Add-Items* dialog and do not reveal except when finally and fully identified by the party or NPCs assisting the party.}}{{Looks Like=A gem of small value, engraved with some indistinct design}}{{desc=If any character claims it as his own, they will contract a terrible rotting disease which can be removed only by application of a *remove curse* spell followed by a *cure disease* and then a *heal*, *limited wish*, or *wish* spell. The rotting can also be countered by crushing a *periapt of health* and sprinkling its dust upon the afflicted character. Otherwise, the afflicted loses one point each of Dexterity, Constitution, and Charisma per week beginning one week after claiming the item. When any score reaches 0, the character is dead. Each point lost due to the disease will be permanent regardless of subsequent removal of the affliction.}}'},
+ {name:'Periapt-of-Health',type:'Miscellaneous',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.itemTemplate+'}{{title=Gem}}{{name=\nPeriapt of Health}}{{subtitle=Magical Gem}}Specs=[Periapt of Health,Miscellaneous,0H,Necromancy]{{Size=Tiny}}MiscData=[w:Periapt of Health,st:Engraved Gem,sz:T,wt:0,sp:3,qty:1,rc:uncharged]{{Use=Manually apply all effects of this gem}}{{Looks Like=A gem of small value, engraved with some indistinct design}}{{desc=This gem appears exactly the same as a *periapt of foul rotting*, but the possessor will be immune from all diseases save that of the latter periapt so long as they have it on their person.}}'},
+ {name:'Periapt-of-Proof-Against-Poison',type:'Miscellaneous',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.itemTemplate+'}{{title=Gem}}{{name=\nPeriapt of Proof Against Poison}}{{subtitle=Magical Gem}}Specs=[Periapt of Proof Against Poison,Miscellaneous,0H,Necromancy]{{Size=Tiny}}MiscData=[w:Periapt of Proof Against Poison,st:Engraved Gem,sz:T,wt:0,sp:3,qty:1,rc:uncharged]{{Use=Manually apply all effects of this gem}}{{Looks Like=A gem of small value, engraved with some indistinct design}}{{GM info=Roll 1d20 and consult the table below to determine the effectiveness of a particular periapt. Then place the appropriate power of periapt in the container:\n\\amplt;table\\ampgt;\\amplt;tr\\ampgt;\\amplt;th style="text-align:center"\\ampgt;[D20 roll](!\\amp#13;\\amp#47;gr 1d20)\\amplt;/th\\ampgt;\\amplt;th style="text-align:center"\\ampgt;Special Save\\amplt;/th\\ampgt;\\amplt;th style="text-align:center"\\ampgt;Plus of Periapt\\amplt;/th\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;1-8\\amplt;/td\\ampgt;\\amplt;td\\ampgt;19\\amplt;/td\\ampgt;\\amplt;td\\ampgt;+1\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;9-14\\amplt;/td\\ampgt;\\amplt;td\\ampgt;17\\amplt;/td\\ampgt;\\amplt;td\\ampgt;+2\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;15-18\\amplt;/td\\ampgt;\\amplt;td\\ampgt;15\\amplt;/td\\ampgt;\\amplt;td\\ampgt;+3\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;19-20\\amplt;/td\\ampgt;\\amplt;td\\ampgt;13\\amplt;/td\\ampgt;\\amplt;td\\ampgt;+4\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;/table\\ampgt;}}{{desc=Indistinguishable from other periapts. The character who has one of these magical gems is allowed a saving throw vs. poison that normally disallow any such opportunity. The Special Save column on the table below lists the saving throw for such poisons. The owner rolls against his normal score for poisons which are usually at a penalty, and gets a plus on all other poison saves.}}'},
+ {name:'Periapt-of-Proof-Against-Poison+1',type:'Miscellaneous',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.itemTemplate+'}{{}}Specs=[Periapt of Proof Against Poison,Miscellaneous,0H,Necromancy]{{}}MiscData=[w:Periapt of Proof Against Poison,st:Engraved Gem,sz:T,wt:0,sp:3,qty:1,rc:uncharged]{{}}%{MI-DB|Periapt-of-Proof-Against-Poison{{name=\nPeriapt of Proof Against Poison+1}}{{GM info=}}{{}}{{desc=Indistinguishable from other periapts. The character who has one of these magical gems is allowed a saving throw vs. poison of 19 for poison that normally would disallow any such opportunity. The owner rolls against his normal score for poisons which are usually at a penalty, and gets a gets +1 on all other poison saves.\n**Note:** these benefits are *not* applied automatically, and should be set as situational modifiers for any appropriate saving throw.}}'},
+ {name:'Periapt-of-Proof-Against-Poison+2',type:'Miscellaneous',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.itemTemplate+'}{{}}Specs=[Periapt of Proof Against Poison,Miscellaneous,0H,Necromancy]{{}}MiscData=[w:Periapt of Proof Against Poison,st:Engraved Gem,sz:T,wt:0,sp:3,qty:1,rc:uncharged]{{}}%{MI-DB|Periapt-of-Proof-Against-Poison{{name=\nPeriapt of Proof Against Poison+2}}{{GM info=}}{{}}{{desc=Indistinguishable from other periapts. The character who has one of these magical gems is allowed a saving throw vs. poison of 17 for poison that normally would disallow any such opportunity. The owner rolls against his normal score for poisons which are usually at a penalty, and gets a gets +2 on all other poison saves.\n**Note:** these benefits are *not* applied automatically, and should be set as situational modifiers for any appropriate saving throw.}}'},
+ {name:'Periapt-of-Proof-Against-Poison+3',type:'Miscellaneous',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.itemTemplate+'}{{}}Specs=[Periapt of Proof Against Poison,Miscellaneous,0H,Necromancy]{{}}MiscData=[w:Periapt of Proof Against Poison,st:Engraved Gem,sz:T,wt:0,sp:3,qty:1,rc:uncharged]{{}}%{MI-DB|Periapt-of-Proof-Against-Poison{{name=\nPeriapt of Proof Against Poison+3}}{{GM info=}}{{}}{{desc=Indistinguishable from other periapts. The character who has one of these magical gems is allowed a saving throw vs. poison of 15 for poison that normally would disallow any such opportunity. The owner rolls against his normal score for poisons which are usually at a penalty, and gets a gets +3 on all other poison saves.\n**Note:** these benefits are *not* applied automatically, and should be set as situational modifiers for any appropriate saving throw.}}'},
+ {name:'Periapt-of-Proof-Against-Poison+4',type:'Miscellaneous',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.itemTemplate+'}{{}}Specs=[Periapt of Proof Against Poison,Miscellaneous,0H,Necromancy]{{}}MiscData=[w:Periapt of Proof Against Poison,st:Engraved Gem,sz:T,wt:0,sp:3,qty:1,rc:uncharged]{{}}%{MI-DB|Periapt-of-Proof-Against-Poison{{name=\nPeriapt of Proof Against Poison+4}}{{GM info=}}{{}}{{desc=Indistinguishable from other periapts. The character who has one of these magical gems is allowed a saving throw vs. poison of 13 for poison that normally would disallow any such opportunity. The owner rolls against his normal score for poisons which are usually at a penalty, and gets a gets +4 on all other poison saves.\n**Note:** these benefits are *not* applied automatically, and should be set as situational modifiers for any appropriate saving throw.}}'},
+ {name:'Philosophers-Stone',type:'Miscellaneous',ct:'3',charge:'charged',cost:'0',body:'\\amp{template:'+fields.itemTemplate+'}{{prefix=Philosopher\'s }}{{title=Stone}}{{subtitle=Magical Stone}}Specs=[Philosophers Stone,Miscellaneous,0H,Alteration]{{Size=Tiny}}MiscData=[w:Philosophers Stone,st:Stone,sz:T,wt:1,sp:3,qty:1,rc:charged]{{Use=Manually apply all effects of this stone}}{{Looks Like=An ordinary, sooty black piece of rock}}{{desc=This is a rare and magical substance. It radiates faintly of unknown magic. If the stone is broken open, a cavity will be discovered. The interior of this cavity is lined with a quicksilver which enables the transmutation of the base metals (iron and lead) into silver and gold. A wizard will be required to bring about such transmutation, however. \nFrom 50 to 500 pounds of iron can be made into silver; from 10 to 100 pounds of lead can be turned into gold from a single *philosopher\'s stone*. Transmutation must be made fully upon the first attempt, all the quicksilver being employed at one time.\nTwo other substances may be found in a *philosopher\'s stone* instead of the quicksilver described above, at the DM\'s discretion. If he decides there\'s something different in the stone, there is a 75% chance that a greenish, crystalline salt will be found. This allows the manufacture of 1d4 *potions of longevity*. There is a 25% chance that a white powder will be found in a stone. When mixed with a *potion of longevity*, this can actually restore life to a dead human or demihuman. The mixture must be administered internally within one week of the creature\'s demise (see the *raise dead* spell).}}'},
]},
MI_DB_Custom: {bio:'Custom Magic Items v6.16 21/04/2023
This Magic Item database holds definitions for all custom Magic Items that do not come from any published manual',
gmnotes:'Change Log v6.16 21/04/2023 Split custom magic items from the standard database v6.15 20/04/2023 Added more items & started DB compression v6.14 15/04/23 Added more magic items v6.13 09/04/2023 Added ability for bags to automatically create item character sheet, optionally containing initial items v6.11 31/01/2023 Added new magic items v6.10 25/09/2022 Moved to RPGM Library and updated templates v6.01 14/07/2022 Removed hard-coded whisper commands on database entries as now directed to correct player(s) programmatically v6.00 06/04/2022 Adapted to use --display-ability command for chaining abilities v5.9 09/03/2022 Added saving throw data to MIs that affect saves v5.8 23/02/2022 Fixed issues with Headband of Intelligence, Robe of Protection, & Shocking Bracers v5.7 04/02/2022 Shocking Bracers updated to fix errors on first use v5.6 01/01/2022 Updated to common release version v5.2 - 5.5 Skipped to even up version numbers v5.1 31/10/2021 Encoded using machine readable data to support API databases v5.0 01/10/2021 Split MI-DB into separate databases for different types of Item v4.3.3 09/06/2021 Bug fix for Red Ioun Stone v4.3.2 06/05/2021 Added some magic items from the Dungeon of Death v4.3.1 09/04/2021 Fixed a couple of Magic Item macro bugs v4.3 02/04/2021 Changed spell targeting to use MagicMaster API v4.2.1 24/03/2021 Added new MIs for Dungeon of Death v4.2 07/03/2021 Added DM-only list of Magic Items as Priest Level 3 - does not appear for Players. Also changed Magic Item powers to use the !magic API v4.1.11 04/03/2021 Added in a few MIs from Simon\'s dungeon & added 5 unknown potions, A to E v4.1.10 25/02/2021 Unfroze the MI Powers table by duplication v4.1.9 23/02/2021 Added more MIs from Simon\'s Dungeon of Death v4.1.8 17/02/2021 Added MIs from Simon\'s Dungeon of Death v4.1.7 29/01/2021 Added MIs held by characters that somehow seem to have got lost in this version of the MI-DB v4.1.6 21/01/2021 Added new MIs from Simon\'s Dungeon of Death v4.1.5 19/01/2021 Added missing MI Power of Clairaudience for the Robe of Ears v4.1.4 08/01/2021 Added missing entry for Ointment of Flying in Potions list v4.1.3 16/12/2020 Fixed issue with Wand of Paralysation duration when targeting, plus some other small bugs v4.1.2 29/11/2020 New magic items created for Jacob & Solar (Steve L.\'s characters) v4.1.1 09/11/2020 Sorted the MI-DB, compressed some item descriptions so fit better in chat window, and also replaced long descriptions with linked Handouts where possible. v4.1 08/11/2020 Introduction of Magic Item powers for unique MIs, which are stored in the MI-DB rather than player character sheets. This allows them to not need loading into a character\'s powers, but to automatically be available once the MI is acquired. v4.0 29/10/2020 Same as v3.3.1, but aligned version number with v4 Macro Library release v3.3.1 20/10/2020 Updated all embedded macro calls to deal with separation of database from macro library, and also set casting levels & names for various MI spell effects. v3.3 16/10/2020 Split the database of Magic Items from the macro workings so that the MI database can be shared with other macro systems. v3.2.2 14/10/2020 Added Ring of The Hawk, supported by Attacks macro library v3.6 v3.2.1 14/10/2020 Added Magic Items for both Lost Mines & The High Dungeon v3.2 19/09/2020 Updated to deal more effectively with lag, adjusted some menus, and added support for multi-status effects. Developed and then abandoned the use of Dusts for rechargable MIs, but totally changed this approach in later version. v3.1 25/08/2020 Added the ability to deduct multiple charges of a Magic Item when using it. Player specified, and not linked to what they are using it for. v3.0 25/08/2020 Vetted & updated ready for Roger\'s campaign. Also changed all calls to !tj to take \'--\' as the command introducer and allow multiple commands in one call and forcing execution in order, so as to overcome asynchronous processing issues. v2.0 Jumped this major version number entirely, to bring in line with other library releases. v1.3 22/08/2020 Added Magic Items gained in various recent quests v1.2 08/08/2020 Changed whispers /w using Token_name to instead use Character_name, as if they were different, errors occurred. v1.1 06/08/2020 Loaded all known character-held MIs from current campaigns. Coordinated all markers and effects across all MIs & Spell libraries. v1.0 01/08/2020 Testing went fine in Alpha and Beta, so applying first wave of enhancements. v0.1 19/07/2020 Initial creation for testing',
@@ -2492,14 +2652,14 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Wizard-locked-scrollcase',type:'Scrollcase',ct:'0',charge:'single-uncharged',cost:'0',body:'\\amp{template:'+fields.itemTemplate+'}{{name=Scrollcase}}{{subtitle=Item}}Specs=[Scrollcase,Scrollcase,1H,Treasure]{{Speed=[[0]]}}MiscData=[w:Locked Scrollcase,sp:0,rc:single-uncharged,bag:0]{{Size=Medium}}{{Immunity=None}}{{Saves=None}}{{Use=If you succeed in opening the scrollcase, drag its sheet from the Journal onto the map to drop a token, then use *Search for MIs* or *Store MIs* to retrieve or place scrolls in it}}{{desc=A scrollcase that can hold a scroll. It has runes written on the side... can you read them?\n[I have *Read Magic*](!magic --reset-single @{selected|token_id}|Wizard-locked-scrollcase|view) [I have other means](!magic --reset-single @{selected|token_id}|Wizard-locked-scrollcase|view) [No, I\'ll force it](!\\amp#13;\\ampamp;{template:'+fields.warningTemplate+'}\\amp#123;{desc=It\'s going to explode...! Phew, no it didn\'t. Don\'t try that again!}\\amp#125;) [No, I\'ll leave it](!\\amp#13;\\amp#47;w "@{selected|character_name}" \\ampamp;{template:'+fields.messageTemplate+'}\\amp#123;{name=Leaving Scrollcase}\\amp#125;\\amp#123;{desc=Perhaps give it to someone else to try.}\\amp#125;)]}}{{GM Info=If more than one *Wizard-locked-scrollcase* appears in the campaign you should rename each of them using the *Add Items* GM dialogue to make them distinct. You can also set how many scrolls can be stored (e.g. 1) by adjusting the bag size in the *Add Items* dialogue. Dragging the scrollcase sheet to the map can happen at any time - the wizard lock does not prevent this}}'},
{name:'Wyvern-Skin',type:'Miscellaneous',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.itemTemplate+'}{{name=Wyvern Skin}}{{subtitle=Useful Item}}Specs=[Wyvern Skin,Miscellaneous,1H,Treasure]{{Speed=[[0]]}}MiscData=[w:Wyvern Skin,st:Creature Skin,sp:0,rc:uncharged]{{Size=Large}}{{desc=A skin from a Wyvern that has the potential to be made into +1 leather armour}}'},
]},
- MU_Spells_DB: {bio:'Magic User Spell Database v6.04 20/07/2023
This database holds the definitions and API calls to enact Wizard Spells. Spells can be memorised, and once used disapear from memory, only being refreshed on a long rest (1st level spells can optionally be refreshed on a short rest). Characters, NPCs and Monsters can learn, memorise and use these spells via the abilities, menus and commands of the MagicMaster API
Important Note: most of the spell macros require a Roll20 Pro membership, and the installation of the ChatSetAttr, TokenMod, MagicMaster and RoundMaster API Scripts, to allow parameter passing between macros, update of character sheet variables, and marking spell effects on tokens. If you do not have this level of subscription, I highly recommend you get it as a DM, as you get lots of other goodies as well. If you want to know how to load the API Scripts to your game, the RoLL20 API help here gives guidance, or Richard can help you.
Instructions
In order to understand the format of spell macros in this database and how to change or add to them, please refer to the MagicMaster API documentation.',
- gmnotes:'Change Log: v6.04 20/07/2023 Added itemSpells for the Necklace of Missiles fireball globes v6.03 07/07/2023 Weaponised all offensive touch and ranged spells v6.02 16/10/2022 Added Chromatic Orb using "weaponised spell" functions v6.01 25/09/2022 Moved to RPGM Library and updated templates v5.91 14/07/2022 Removed hard-coded whisper commands on database entries as now directed to correct player(s) programmatically v5.9 06/04/2022 Adapted to use --display-ability command for chaining abilities v5.8 17/03/2022 Corrected some spell descriptions and targeting messages v5.6 01/01/2022 Added all remaining spells from the PHB v5.1 - 5.5 Skipped to even up version numbers v5.0 31/10/2021 Encoded using machine readable data to support API databases v4.4 16/10/2021 Added Area of Effect display v4.3.1 03/09/2021 Added spells for WPM The Undiscovered Caverns v4.3 02/09/2021 Added all 1st & 2nd level spells v4.2.1 01/05/2021 Extensive bug checking & fixing v4.2 26/03/2021 Implemented spell targeting using the MagicMaster API v4.1.7 14/02/2021 Changed all !setattr --sel parameters to be --charid instead, so they can work more easily with the MagicMaster API. v4.1.6 27/01/2021 Added Blur as a spell v4.1.5 22/01/2021 Added a button to Magic Missile spell to fire all missiles at one target v4.1.4 19/01/2021 Added spells gained by MUs in both low level and high level campaigns v4.1.3 17/12/2020 Updated several spells with duration statuses and effects (for Dr Lexicon) v4.1.2 30/11/2020 Added spells for Steve L.\'s ported characters in low level campaign v4.1.1 22/11/2020 Added spell effect marker to Detect-Magic, and corrected some minor typos v4.1 16/11/2020 Split the spells database from the Macro Library processing to reduce the size of the library which might have been triggering randomisation of the macro sort order v4.0.1 07/11/2020 Copy in fix v3.5.4 v4.0 29/10/2020 v4 has cost of material components as per v3.4 turned on (v3 has them turned off) v3.5.4 07/11/2020 Fixed bug with setting common variables for casting level & name v3.5.3 29/10/2020 Fixed bug with Initialising sheet variables v3.5.2 20/10/2020 Added Slow as a spell v3.5.1 12/10/2020 Updated Long Rests to set ammo maximums to ammo remaining, to reflect that any not recovered when you rest are lost v3.5 06/10/2020 Linked Long Rests with the Campaign Calendar, and prevented Long Rests until the DM does the "End of Day" procedure to charge daily costs. v3.4.1 29/09/2020 Bug fix to allow older character sheets to use Short & Long Rests without errors. v3.4 24/09/2020 Added costs of materials as \'max\' value of CT- spell entries, then deduct from gold when cast. v3.3 18/09/2020 Changed to normally cast at spell-casters level, and allow separate change to level if needed. Constructed so casting level and caster\'s name can be set separately v3.2.1 16/09/2020 Tweaked for Lost & Found campaign v3.2 05/09/2020 Updated all the marker effect names to cater for the new Effect functionality, and allow multiple overlapping spell effects to work properly v3.1 28/08/2020 Added spells for White Plume Mountain. Also added the ability to [Review] spells from spells known/granted to the character before Memorising them. v3.0 25/08/2020 Vetted & updated ready for Roger\'s campaign. Also changed all calls to !tj to take \'--\' as the command introducer and allow multiple commands in one call and forcing execution in order, so as to overcome asynchronous processing issues. v2.8 23/08/2020 Updated all spells after Simon\'s The Desecrated Temple campaign to reflect level increases, and to ensure all were internally consistent. v2.7 17/08/2020 Saving throw buttons were missing their \'!\', and so did not even appear! Fixed v2.6 08/08/2020 Changed whispers /w using Token_name to instead use Character_name, as if they were different, errors occurred. v2.5 06/08/2020 Coordinated and updated all spell effect markers across all MIs and Spell libraries. v2.4 03/08/2020 Added the MU-Spells-menu macro to provide a succinct menu to access MU-Spell functions. v2.3 31/07/2020 Added the use of token markers to indicate spell effects and durations v2.2 16/07/2020 Added multiple spell use macros to cater for current spell knowledge in SB\'s Desecrated Temple party v2.1 12/07/2020 Updated and corrected bugs in the Cast-spell, Memorise-Ln-spells, Reset-spells and Blank-Spellbook macros v2.0 Conversion of all spells to use default Roll Templates, with API Buttons for relevant dice rolls. Addition of the Spellbook macro, and the capability to have a list of known spells from which spells for the day can be memorised. v1.0 Initial release',
+ MU_Spells_DB: {bio:'Magic User Spell Database v6.05 25/09/2023
This database holds the definitions and API calls to enact Wizard Spells. Spells can be memorised, and once used disapear from memory, only being refreshed on a long rest (1st level spells can optionally be refreshed on a short rest). Characters, NPCs and Monsters can learn, memorise and use these spells via the abilities, menus and commands of the MagicMaster API
Important Note: most of the spell macros require a Roll20 Pro membership, and the installation of the ChatSetAttr, TokenMod, MagicMaster and RoundMaster API Scripts, to allow parameter passing between macros, update of character sheet variables, and marking spell effects on tokens. If you do not have this level of subscription, I highly recommend you get it as a DM, as you get lots of other goodies as well. If you want to know how to load the API Scripts to your game, the RoLL20 API help here gives guidance, or Richard can help you.
Instructions
In order to understand the format of spell macros in this database and how to change or add to them, please refer to the MagicMaster API documentation.',
+ gmnotes:'Change Log: v6.05 25/09/2023 Fixed error with Protection from Good 10ft radius v6.04 20/07/2023 Added itemSpells for the Necklace of Missiles fireball globes v6.03 07/07/2023 Weaponised all offensive touch and ranged spells v6.02 16/10/2022 Added Chromatic Orb using "weaponised spell" functions v6.01 25/09/2022 Moved to RPGM Library and updated templates v5.91 14/07/2022 Removed hard-coded whisper commands on database entries as now directed to correct player(s) programmatically v5.9 06/04/2022 Adapted to use --display-ability command for chaining abilities v5.8 17/03/2022 Corrected some spell descriptions and targeting messages v5.6 01/01/2022 Added all remaining spells from the PHB v5.1 - 5.5 Skipped to even up version numbers v5.0 31/10/2021 Encoded using machine readable data to support API databases v4.4 16/10/2021 Added Area of Effect display v4.3.1 03/09/2021 Added spells for WPM The Undiscovered Caverns v4.3 02/09/2021 Added all 1st & 2nd level spells v4.2.1 01/05/2021 Extensive bug checking & fixing v4.2 26/03/2021 Implemented spell targeting using the MagicMaster API v4.1.7 14/02/2021 Changed all !setattr --sel parameters to be --charid instead, so they can work more easily with the MagicMaster API. v4.1.6 27/01/2021 Added Blur as a spell v4.1.5 22/01/2021 Added a button to Magic Missile spell to fire all missiles at one target v4.1.4 19/01/2021 Added spells gained by MUs in both low level and high level campaigns v4.1.3 17/12/2020 Updated several spells with duration statuses and effects (for Dr Lexicon) v4.1.2 30/11/2020 Added spells for Steve L.\'s ported characters in low level campaign v4.1.1 22/11/2020 Added spell effect marker to Detect-Magic, and corrected some minor typos v4.1 16/11/2020 Split the spells database from the Macro Library processing to reduce the size of the library which might have been triggering randomisation of the macro sort order v4.0.1 07/11/2020 Copy in fix v3.5.4 v4.0 29/10/2020 v4 has cost of material components as per v3.4 turned on (v3 has them turned off) v3.5.4 07/11/2020 Fixed bug with setting common variables for casting level & name v3.5.3 29/10/2020 Fixed bug with Initialising sheet variables v3.5.2 20/10/2020 Added Slow as a spell v3.5.1 12/10/2020 Updated Long Rests to set ammo maximums to ammo remaining, to reflect that any not recovered when you rest are lost v3.5 06/10/2020 Linked Long Rests with the Campaign Calendar, and prevented Long Rests until the DM does the "End of Day" procedure to charge daily costs. v3.4.1 29/09/2020 Bug fix to allow older character sheets to use Short & Long Rests without errors. v3.4 24/09/2020 Added costs of materials as \'max\' value of CT- spell entries, then deduct from gold when cast. v3.3 18/09/2020 Changed to normally cast at spell-casters level, and allow separate change to level if needed. Constructed so casting level and caster\'s name can be set separately v3.2.1 16/09/2020 Tweaked for Lost & Found campaign v3.2 05/09/2020 Updated all the marker effect names to cater for the new Effect functionality, and allow multiple overlapping spell effects to work properly v3.1 28/08/2020 Added spells for White Plume Mountain. Also added the ability to [Review] spells from spells known/granted to the character before Memorising them. v3.0 25/08/2020 Vetted & updated ready for Roger\'s campaign. Also changed all calls to !tj to take \'--\' as the command introducer and allow multiple commands in one call and forcing execution in order, so as to overcome asynchronous processing issues. v2.8 23/08/2020 Updated all spells after Simon\'s The Desecrated Temple campaign to reflect level increases, and to ensure all were internally consistent. v2.7 17/08/2020 Saving throw buttons were missing their \'!\', and so did not even appear! Fixed v2.6 08/08/2020 Changed whispers /w using Token_name to instead use Character_name, as if they were different, errors occurred. v2.5 06/08/2020 Coordinated and updated all spell effect markers across all MIs and Spell libraries. v2.4 03/08/2020 Added the MU-Spells-menu macro to provide a succinct menu to access MU-Spell functions. v2.3 31/07/2020 Added the use of token markers to indicate spell effects and durations v2.2 16/07/2020 Added multiple spell use macros to cater for current spell knowledge in SB\'s Desecrated Temple party v2.1 12/07/2020 Updated and corrected bugs in the Cast-spell, Memorise-Ln-spells, Reset-spells and Blank-Spellbook macros v2.0 Conversion of all spells to use default Roll Templates, with API Buttons for relevant dice rolls. Addition of the Spellbook macro, and the capability to have a list of known spells from which spells for the day can be memorised. v1.0 Initial release',
root:'MU-Spells-DB',
api:'magic',
type:'spells',
controlledby:'all',
avatar:'https://s3.amazonaws.com/files.d20.io/images/163483347/1CLiNzi4jlxXK1-lVr7MTQ/max.png?1599726214',
- version:6.04,
+ version:6.05,
db:[{name:'-',type:'',ct:'0',charge:'uncharged',cost:'0',body:'@{selected|token_name} suddenly realises he has another unfilled page in his spellbook!'},
{name:'Advanced-Illusion',type:'MUspellL5',ct:'10',charge:'uncharged',cost:'0.02',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casting\nAdvanced Illusion\nas a level @{selected|casting-level} caster}}{{splevel=Level 5 Wizard}}{{school=Illusion-Phantasm}}Specs=[Advanced Illusion,MUspellL5,1H,Illusion-Phantasm]{{components=V,S,M}}{{time=[[1]] round}}{{range=[[60+(10*@{selected|casting-level})]] yards}}{{duration=[[@{selected|casting-level}]] rounds}}{{aoe=[40ft.cu.+ @{selected|casting-level} x 10ft.cu.s](!rounds --aoe @{selected|token_id}|rectangle|feet|[[180+(30*@{selected|casting-level})]]|||)}}{{save=Special}}{{reference=PHB p164}}{{healing=[Show Illusion](!rounds --target caster|@{selected|token_id}|Advanced-illusion|@{selected|casting-level}|-1|Wow - that looks real. \n Advanced Illusion looks good|three-leaves)}}SpellData=[w:Advanced Illusion,lv:5,sp:10,gp:0.02,cs:VSM]{{effects=A *spectral forces* spell that operates through a program. Unnecessary for the wizard to concentrate on the spell after casting it. }}{{materials=A bit of fleece and several grains of sand - 2cp to source}}'},
{name:'Affect-Normal-Fires',type:'MUspellL1',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casts\nAffect Normal Fires\nas a level @{selected|casting-level} caster}}{{splevel=Level 1 Wizard}}{{school=Alteration}}Specs=[Affect-Normal-Fires,MUspellL1,1H,Alteration]{{components=V, S}}{{time=[[1]]}}{{range=[[5*@{selected|casting-level}]]ft.}}{{duration=[[2*@{selected|casting-level}]]}}{{aoe=[10ft radius](!rounds --aoe @{selected|token_id}|circle|feet|[[5*@{selected|casting-level}]]|20||cold)}}{{save=None}}{{reference=PHB p131}}SpellData=[w:Affect-Normal-Fires,lv:1,sp:1,gp:0,cs:VS]{{effects=Enables wizard to affect any or all normal fires in area.}}'},
@@ -2746,7 +2906,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Protection-from-Cantrips',type:'MUspellL2',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casts\nProtection from Cantrips\nas a level @{selected|casting-level} caster}}{{splevel=Level 2 Wizard}}{{school=Abjuration}}Specs=[Protection from Cantrips,MUspellL2,1H,Abjuration]{{components=V,S}}{{time=[[1]] round}}{{range=touch}}{{duration=[[5+@{selected|Casting-level}]] hours}}{{aoe=Creature or Object touched}}{{save=None}}{{healing=[Protect](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Select who to Protect|token_id}|Protection-from-Cantrips|99|0|Protected from Cantrip spells|white-tower)}}{{reference=PHB p144}}SpellData=[w:Protection-from-Cantrips,lv:2,sp:10,gp:0,cs:VS]{{effects=The wizard receives immunity to the effects of cantrips cast by other wizards, apprentices, or creatures that use the *Cantrip* spell.}}'},
{name:'Protection-from-Evil',type:'MUspellL1',ct:'1',charge:'uncharged',cost:'10',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casts\nProtection from Evil\nas a level @{selected|casting-level} caster}}{{splevel=Level 1 Wizard}}{{school=Abjuration (reversable)}}Specs=[Protection from Evil,MUspellL1,1H,Abjuration]{{components=V,S, M}}{{time=[[1]]}}{{range=Touch}}{{duration=[[2*@{selected|casting-level}]] rounds}}{{aoe=Creature touched}}{{save=None}}{{healing=[Become Protected](!rounds --target single|@{selected|token_id}|Prot-from-Evil|[[2*@{selected|casting-level}]]|-1|+2 prot vs evil attk \\amp save, blocks evil ctrl, blocks xtra-planar|white-tower)}}{{reference=PHB p137}}SpellData=[w:Protection-from-Evil,lv:1,sp:1,gp:10,cs:VSM]{{effects=Creates a magical barrier around the recipient at a distance of 1 foot which moves with the recipient and has three major effects: attacks by \\amp saves caused by evil creatures improved; possession \\amp mental attacks by evil creatures blocked; and prevents bodily contact by extraplanar or conjured creatures.}}{{materials=Trace a 3-foot-diameter circle on the floor (or ground) with powdered silver worth 100sp in total.}}'},
{name:'Protection-from-Evil-10ft-radius',type:'MUspellL3',ct:'3',charge:'uncharged',cost:'10',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casts\nProtection from Evil, 10ft radius\nas a level @{selected|casting-level} caster}}{{splevel=Level 3 Wizard}}{{school=Abjuration (reversable)}}Specs=[Protection from Evil 10ft radius,MUspellL3,1H,Abjuration]{{components=V,S, M}}{{time=[[3]]}}{{range=Touch}}{{duration=[[2*@{selected|casting-level}]] rounds}}{{aoe=10ft around Creature touched}}{{save=None}}{{healing=[Become Protected](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who to centre protection on?|token_id}|Prot-from-Evil-10ft|[[2*@{selected|casting-level}]]|-1|+2 prot vs evil attk \\amp save, blocks ctrl, blocks xtra-planar in a 10ft radius|white-tower)}}{{reference=PHB p152}}SpellData=[w:Protection-from-Evil-10ft-radius,lv:3,sp:3,gp:10,cs:VSM]{{effects=Creates a magical barrier around the recipient at a distance of 10 feet which moves with the recipient and has three major effects: attacks by \\amp saves caused by evil creatures improved; possession \\amp mental attacks by evil creatures blocked; and prevents bodily contact by extraplanar or conjured creatures.}}{{materials=Trace a 3-foot-diameter circle on the floor (or ground) with powdered silver worth 100sp in total.}}'},
- {name:'Protection-from-Good-10ft-radius',type:'MUspellL1',ct:'3',charge:'uncharged',cost:'0.5',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casts\nProtection from Good, 10ft radius\nas a level @{selected|casting-level} caster}}{{splevel=Level 3 Wizard}}{{school=Abjuration (reversable)}}Specs=[Protection from Good 10ft radius,MUspellL1,1H,Alteration]{{components=V,S, M}}{{time=[[3]]}}{{range=Touch}}{{duration=[[2*@{selected|casting-level}]] rounds}}{{aoe=10ft around Creature touched}}{{save=None}}{{healing=[Become Protected](!rounds --target single|@{selected|token_id}|Prot-from-Good-10ft|[[2*@{selected|casting-level}]]|-1|+2 prot vs good attk \\amp save, blocks ctrl, blocks xtra-planar in a 10ft radius|white-tower)}}{{reference=PHB p152 (Prot. from Evil 10ft radius)}}SpellData=[w:Protection-from-Good-10ft-radius,lv:3,sp:3,gp:0.5,cs:VSM]{{effects=Creates a magical barrier around the recipient at a distance of 10 feet which moves with the recipient and has three major effects: attacks by \\amp saves caused by evil creatures improved; possession \\amp mental attacks by evil creatures blocked; and prevents bodily contact by extraplanar or conjured creatures.}}{{materials=Trace a 3-foot-diameter circle on the floor (or ground) with powdered iron worth 5sp.}}'},
+ {name:'Protection-from-Good-10ft-radius',type:'MUspellL3',ct:'3',charge:'uncharged',cost:'0.5',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casts\nProtection from Good, 10ft radius\nas a level @{selected|casting-level} caster}}{{splevel=Level 3 Wizard}}{{school=Abjuration (reversable)}}Specs=[Protection from Good 10ft radius,MUspellL3,1H,Alteration]{{components=V,S, M}}{{time=[[3]]}}{{range=Touch}}{{duration=[[2*@{selected|casting-level}]] rounds}}{{aoe=10ft around Creature touched}}{{save=None}}{{healing=[Become Protected](!rounds --target single|@{selected|token_id}|Prot-from-Good-10ft|[[2*@{selected|casting-level}]]|-1|+2 prot vs good attk \\amp save, blocks ctrl, blocks xtra-planar in a 10ft radius|white-tower)}}{{reference=PHB p152 (Prot. from Evil 10ft radius)}}SpellData=[w:Protection-from-Good-10ft-radius,lv:3,sp:3,gp:0.5,cs:VSM]{{effects=Creates a magical barrier around the recipient at a distance of 10 feet which moves with the recipient and has three major effects: attacks by \\amp saves caused by evil creatures improved; possession \\amp mental attacks by evil creatures blocked; and prevents bodily contact by extraplanar or conjured creatures.}}{{materials=Trace a 3-foot-diameter circle on the floor (or ground) with powdered iron worth 5sp.}}'},
{name:'Protection-from-Normal-Missiles',type:'MUspellL3',ct:'3',charge:'uncharged',cost:'1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casts\nProtection From Normal Missiles\nas a level @{selected|casting-level} caster}}{{splevel=Level 3 Wizard}}{{school=Abjuration}}Specs=[Protection from Normal Missiles,MUspellL3,1H,Abjuration]{{components=VSM}}{{time=3}}{{range=Touch}}{{duration=[[@{selected|casting-level}]] turns}}{{aoe=Creature touched}}{{save=None}}{{reference=PHB p152}}SpellData=[w:Protection from Normal Missiles,lv:3,sp:3,gp:1,cs:VSM]{{healing=[Resist Missiles](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who will be protected?|token_id}|Prot-norm-missiles|[[10*@{selected|casting-level}]]|-1|Protected from non-magical small missiles \\amp less damage from large or missiles with magic plusses|white-tower)}}{{effects=Bestows total invulnerability to hurled and projected missiles and causes a reduction of 1 from each die of damage (but no die inflicts less than 1 point of damage) inflicted by large or magical missiles}}{{materials=A piece of rare tortoise or turtle shell, costing 1gp to source}}'},
{name:'Pyrotechnics',type:'MUspellL2',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casts\nPyrotechnics\nas a level @{selected|casting-level} caster}}{{splevel=Level 2 Wizard}}{{school=Alteration}}Specs=[Pyrotechnics,MUspellL2,1H,Alteration]{{components=V, S, M}}{{time=[[2]]}}{{range=[120 yards](!rounds --aoe @{selected|token_id}|circle|yards|0|240||lightning|true)}}{{duration=Special}}{{aoe=[[1]] fire source}}{{save=Special}}{{reference=PHB p144}}SpellData=[w:Pyrotechnics,lv:2,sp:2,gp:0,cs:VSM]{{effects=A pyrotechnics spell draws on an existing fire source to produce one of two effects, at the option of the caster: [Fireworks](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Select a target|token_id}|Pyrotechnics-fireworks|\\amp#63;{Duration if fireworks?|\\amp#91;[1d4+1]\\amp#93;}|-1|\'Temporarily blinded by fireworks\'|bleeding-eye) that lasts one round, or [Smoke](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Select a target|token_id}|Pyrotechnics-smoke|@{selected|casting-level}|-1|\'Cannot see more than 2ft in smoke\'|edge-crack) to arise from the source and form a choking cloud that lasts for [[@{selected|casting-level}]] rounds.}}{{materials=One fire source within a 20-foot cube, which is immediately extinguished. An extremely large fire used as a source might be only partially extinguished. Magical fires are not extinguished, although a fire-based creature (such as a fire elemental) used as a source suffers 1 point of damage per caster level.}}'},
{name:'Rainbow-Pattern',type:'MUspellL4',ct:'4',charge:'uncharged',cost:'0.2',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casting\nRainbow Pattern\nas a level @{selected|casting-level} caster}}{{splevel=Level 4 Wizard}}{{school=Alteration, Illusion-Phantasm}}Specs=[Rainbow Pattern,MUspellL4,1H,Alteration|Illusion-Phantasm]{{components=S,M}}{{time=[[4]]}}{{range=[[10]] yards}}{{duration=Special}}{{aoe=[30ft. cube](!rounds --aoe @{selected|token_id}|square|yards|10|10||magic)}}{{save=Negates}}{{reference=PHB p162}}{{damage=[Fascinate them](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Who to fascinate?|token_id}|Rainbow-pattern|99|0|Pretty rainbow... must follow the pretty rainbow...|chained-heart)}}SpellData=[w:Rainbow Pattern,lv:4,sp:4,gp:0.2,cs:SM]{{effects=Creates rainbow-hued band of interweaving patterns. Creature caught in it may become fascinated. Persists without attention for [1d3](!\\amp#13;\\amp#47;r 1d3) rounds.}}{{materials=The wizard need not utter a sound, but he must gesture appropriately while holding a crystal prism and the material component, a piece of phosphor, total cost 2sp}}'},
@@ -2854,14 +3014,14 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Small-Globe',type:'ItemSpell',ct:'3',charge:'uncharged',cost:'0',body:'%{MU-Spells-DB|Fireball}{{}}Specs=[Small Globe,ItemSpell,1H,Evocation]{{}}SpellData=[w:Small Globe,sp:3,lv:3]{{}}'},
{name:'Tiny-Globe',type:'ItemSpell',ct:'3',charge:'uncharged',cost:'0',body:'%{MU-Spells-DB|Fireball}{{}}Specs=[Tiny Globe,ItemSpell,1H,Evocation]{{}}SpellData=[w:Tiny Globe,sp:3,lv:3]{{}}'},
]},
- PR_Spells_DB: {bio:'Priest Spell Database v6.03 06/07/2023
This database holds the definitions and API calls to enact Priest Spells. Spells can be memorised, and once used disapear from memory, only being refreshed on a long rest (1st level spells can optionally be refreshed on a short rest). Characters, NPCs and Monsters can learn, memorise and use these spells via the abilities, menus and commands of the MagicMaster API
Important Note: most of the spell macros require a Roll20 Pro membership, and the installation of the ChatSetAttr, TokenMod, MagicMaster and RoundMaster API Scripts, to allow parameter passing between macros, update of character sheet variables, and marking spell effects on tokens. If you do not have this level of subscription, I highly recommend you get it as a DM, as you get lots of other goodies as well. If you want to know how to load the API Scripts to your game, the RoLL20 API help here gives guidance, or Richard can help you.
Instructions
In order to understand the format of spell macros in this database and how to change or add to them, please refer to the MagicMaster API documentation.',
- gmnotes:'Change Log:v6.03 Converted all Touch Attack spells to be "weaponized", and added missin L7 spells v6.02 16/10/2022 Updated Spiritual Hammer to use weaponised spell functions v6.01 25/09/2022 Moved to RPGM Library and updated templates v5.91 14/07/2022 Removed hard-coded whisper commands on database entries as now directed to correct player(s) programmatically v5.9 06/04/2022 Adapted to use --display-ability command for chaining abilities v5.8 18/03/2022 Corrected sphere for Locate-Animals-or-Plants v5.7 23/02/2022 Corrected error in Create Food & Water spell v5.6 01/01/2022 Added all remaining Priest spells from the PHB v5.2 - 5.5 Skipped to even up version numbers v5.11 13/12/2021 Hid non-castable versions of spells v5.0 31/10/2021 Encoded using machine readable data to support API databases v4.3.1 01/06/2021 Removed ammo reset calls from long rest macros, as this is now handled by the MagicMaster API long rest function v4.3 25/02/2021 Eliminated ability macros that are no longer needed for spell use, replaced by MagicMaster API script v4.2.1 21/02/2021 fixed initial wave of bugs in MagicMaster, and added short & long rest functions. v4.2 18/02/2021 Integrated with the new MagicMaster API for casting, memorising and viewing spells. v4.1.2 21/01/2021 Added tip text to numbers of spells at each level explaining the maths v4.1 15/11/2020 Split macro library workings from spells database, and also added in sheet-flags attribute which, if 1, uses value of sheet-pr-spells-type to determine the size of the spellbook v4.0 29/10/2020 v4 has the cost of spells turned on, as introduced in v3.4. (v3 macros have them turned off) v3.5.3 29/10/2020 Fixed bug with initialising sheet variables v3.5.2 20/10/2020 Added a 1st level spell for Regenerate, which is actually a power that can me regained with a Short Rest. v3.5.1 12/10/2020 Updated Long Rests to set ammo maximums to ammo remaining, to reflect that any not recovered when you rest are lost v3.5 06/10/2020 Linked Long Rests with the Campaign Calendar, and prevented Long Rests until the DM does the "End of Day" procedure to charge daily costs. v3.4.1 29/09/2020 Bug fix to allow older character sheets to use Short & Long Rests without errors. v3.4 24/09/2020 Added costs of materials as \'max\' value of CT- spell entries, then deduct from gold when cast. v3.3 18/09/2020 Changed to normally cast at spell-casters level, and allow separate change to level if needed. Constructed so casting level and caster\'s name can be set separately 3.2.1 16/09/2020 Tweaked for Lost & Found campaign v3.2 05/09/2020 Updated all the marker effect names to cater for the new Effect functionality, and allow multiple overlapping spell effects to work properly v3.1 01/09/2020 Added the ability to [Review] spells from spells known/granted to the character before Memorising them. v3.0 25/08/2020 Vetted & updated ready for Roger\'s campaign. Also changed all calls to !tj to take \'--\' as the command introducer and allow multiple commands in one call and forcing execution in order, so as to overcome asynchronous processing issues. v2.8 23/08/2020 Added all 1st & 2nd level Priest Spells, and ensured all othre spells were internally consistent. v2.7 17/8/2020 Saving throw buttons were missing their \'!\', and so did not even appear! Fixed v2.6 8/8/2020 Changed whispers /w using Token_name to instead use Character_name, as if they were different, errors occurred. v2.5 6/8/2020 Coordinated and updated all effect markers across all MIs and Spell libraries. v2.4 3/8/2020 Added the PR-Spells-menu macro to provide a succinct menu to access PR-Spell functions. v2.3 31/7/2020 Added the ability for spells to mark tokens with markers to indicate spell effects and durations v2.2 16/7/2020 Added multiple spell use macros to cater for current spell knowledge in SB\'s Desecrated Temple party v2.1 12/7/2020 Updated and corrected bugs in the Cast-spell, Memorise-Ln-spells, Reset-spells and Blank-Spellbook macros v2.0 10/7/2020 Conversion of all spells to use default Roll Templates, with API Buttons for relevant dice rolls. Addition of the Spellbook macro, and the capability to have a list of known spells from which spells for the day can be memorised. v1.0 Initial release',
+ PR_Spells_DB: {bio:'Priest Spell Database v6.04 28/09/2023
This database holds the definitions and API calls to enact Priest Spells. Spells can be memorised, and once used disapear from memory, only being refreshed on a long rest (1st level spells can optionally be refreshed on a short rest). Characters, NPCs and Monsters can learn, memorise and use these spells via the abilities, menus and commands of the MagicMaster API
Important Note: most of the spell macros require a Roll20 Pro membership, and the installation of the ChatSetAttr, TokenMod, MagicMaster and RoundMaster API Scripts, to allow parameter passing between macros, update of character sheet variables, and marking spell effects on tokens. If you do not have this level of subscription, I highly recommend you get it as a DM, as you get lots of other goodies as well. If you want to know how to load the API Scripts to your game, the RoLL20 API help here gives guidance, or Richard can help you.
Instructions
In order to understand the format of spell macros in this database and how to change or add to them, please refer to the MagicMaster API documentation.',
+ gmnotes:'Change Log:v6.04 28/09/2023 Fixed "Weather Summoning" v6.03 06/07/2023 Converted all Touch Attack spells to be "weaponized", and added missin L7 spells v6.02 16/10/2022 Updated Spiritual Hammer to use weaponised spell functions v6.01 25/09/2022 Moved to RPGM Library and updated templates v5.91 14/07/2022 Removed hard-coded whisper commands on database entries as now directed to correct player(s) programmatically v5.9 06/04/2022 Adapted to use --display-ability command for chaining abilities v5.8 18/03/2022 Corrected sphere for Locate-Animals-or-Plants v5.7 23/02/2022 Corrected error in Create Food & Water spell v5.6 01/01/2022 Added all remaining Priest spells from the PHB v5.2 - 5.5 Skipped to even up version numbers v5.11 13/12/2021 Hid non-castable versions of spells v5.0 31/10/2021 Encoded using machine readable data to support API databases v4.3.1 01/06/2021 Removed ammo reset calls from long rest macros, as this is now handled by the MagicMaster API long rest function v4.3 25/02/2021 Eliminated ability macros that are no longer needed for spell use, replaced by MagicMaster API script v4.2.1 21/02/2021 fixed initial wave of bugs in MagicMaster, and added short & long rest functions. v4.2 18/02/2021 Integrated with the new MagicMaster API for casting, memorising and viewing spells. v4.1.2 21/01/2021 Added tip text to numbers of spells at each level explaining the maths v4.1 15/11/2020 Split macro library workings from spells database, and also added in sheet-flags attribute which, if 1, uses value of sheet-pr-spells-type to determine the size of the spellbook v4.0 29/10/2020 v4 has the cost of spells turned on, as introduced in v3.4. (v3 macros have them turned off) v3.5.3 29/10/2020 Fixed bug with initialising sheet variables v3.5.2 20/10/2020 Added a 1st level spell for Regenerate, which is actually a power that can me regained with a Short Rest. v3.5.1 12/10/2020 Updated Long Rests to set ammo maximums to ammo remaining, to reflect that any not recovered when you rest are lost v3.5 06/10/2020 Linked Long Rests with the Campaign Calendar, and prevented Long Rests until the DM does the "End of Day" procedure to charge daily costs. v3.4.1 29/09/2020 Bug fix to allow older character sheets to use Short & Long Rests without errors. v3.4 24/09/2020 Added costs of materials as \'max\' value of CT- spell entries, then deduct from gold when cast. v3.3 18/09/2020 Changed to normally cast at spell-casters level, and allow separate change to level if needed. Constructed so casting level and caster\'s name can be set separately 3.2.1 16/09/2020 Tweaked for Lost & Found campaign v3.2 05/09/2020 Updated all the marker effect names to cater for the new Effect functionality, and allow multiple overlapping spell effects to work properly v3.1 01/09/2020 Added the ability to [Review] spells from spells known/granted to the character before Memorising them. v3.0 25/08/2020 Vetted & updated ready for Roger\'s campaign. Also changed all calls to !tj to take \'--\' as the command introducer and allow multiple commands in one call and forcing execution in order, so as to overcome asynchronous processing issues. v2.8 23/08/2020 Added all 1st & 2nd level Priest Spells, and ensured all othre spells were internally consistent. v2.7 17/8/2020 Saving throw buttons were missing their \'!\', and so did not even appear! Fixed v2.6 8/8/2020 Changed whispers /w using Token_name to instead use Character_name, as if they were different, errors occurred. v2.5 6/8/2020 Coordinated and updated all effect markers across all MIs and Spell libraries. v2.4 3/8/2020 Added the PR-Spells-menu macro to provide a succinct menu to access PR-Spell functions. v2.3 31/7/2020 Added the ability for spells to mark tokens with markers to indicate spell effects and durations v2.2 16/7/2020 Added multiple spell use macros to cater for current spell knowledge in SB\'s Desecrated Temple party v2.1 12/7/2020 Updated and corrected bugs in the Cast-spell, Memorise-Ln-spells, Reset-spells and Blank-Spellbook macros v2.0 10/7/2020 Conversion of all spells to use default Roll Templates, with API Buttons for relevant dice rolls. Addition of the Spellbook macro, and the capability to have a list of known spells from which spells for the day can be memorised. v1.0 Initial release',
controlledby:'all',
root:'PR-Spells-DB',
api:'magic',
type:'spells',
avatar:'https://s3.amazonaws.com/files.d20.io/images/163483347/1CLiNzi4jlxXK1-lVr7MTQ/max.png?1599726214',
- version:6.03,
+ version:6.04,
db:[{name:'-',type:'',ct:'0',charge:'uncharged',cost:'0',body:'@{selected|token_name} thinks there are more spells he can learn...'},
{name:'Abjure',type:'PRspellL4',ct:'10',charge:'uncharged',cost:'100',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nAbjure\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 4 Priest}}{{school=Abjuration}}{{sphere=Summoning}}Specs=[Abjure,PRspellL4,1H,Abjuration]{{components=V,S,M}}{{time=[[10]]}}{{range=[10 yds](!rounds --aoe @{selected|token_id}|circle|yards|0|20||lightning|true)}}{{duration=Special}}{{aoe=1 creature}}{{save=Special see Abjuration spell specs}}{{reference=PHB p215}}SpellData=[w:Abjure,lv:4,sp:10,gp:100,cs:VSM,sph:Summoning]{{effects=Send an extraplanar creature back to its own plane of existence.}}{{materials=The priest\'s holy symbol, holy water, and some material inimical to the creature, worth at least 100gp.}}'},
{name:'Aerial-Servant',type:'PRspellL6',ct:'9',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nAerial Servant\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 6 Priest}}{{school=Conjuration-Summoning}}{{sphere=Summoning}}Specs=[Aerial Servant,PRspellL6,1H,Conjuration-Summoning]{{components=V,S}}{{time=[[9]]}}{{range=[[[10]] yards](!rounds --aoe @{selected|token_id}|circle|yards|0|20||magic|true)}}{{duration=[[@{selected|casting-level}]] days}}{{aoe=Special}}{{save=None}}{{reference=PHB p226}}SpellData=[w:Aerial Servant,lv:6,sp:9,gp:0,cs:VS,sph:Summoning]{{effects=Summons an invisible aerial servant to find and bring back an object or creature described to it by the priest.}}'},
@@ -2929,6 +3089,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Curse',type:'PRspellL1',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nCurse (Reverse Bless)\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 1 Priest}}{{school=Conjuration/Summoning}}{{sphere=All}}Specs=[Curse,PRspellL1,1H,Conjuration]{{components=V,S,M}}{{time=[[1]] round}}{{range=[[60]] yards}}{{duration=[[6]] rounds}}{{aoe=[50ft cube](!rounds --aoe @{selected|token_id}|square|feet|60|50||dark)}}{{save=None}}{{reference=PHB p198 (reverse Bless)}}{{damage=[Curse them!](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select first cursed one|token_id}|Curse|6|-1|Cursed, 1 penalty on morale \\amp attk|radioactive)}}SpellData=[w:,lv:1,sp:10,gp:0,cs:VSM,sph:All]{{effects=Only effects enemies not already in combat lowering their morale and attack roles by [[0-1]]. Selecting the *Curse them* button automatically changes their Thac0 for the correct duration}}{{materials=A sprinkling of Unholy Water (no cost).}}'},
{name:'Darkness',type:'PRspellL1',ct:'4',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nDarkness\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 1 Priest (reversable)}}{{school=Alteration}}{{sphere=Sun}}Specs=[Darkness,PRspellL1,1H,Alteration]{{components=V,S}}{{time=[[4]]}}{{range=[[120]] yards}}{{duration=1 hour + [[@{selected|Casting-Level}]] turns}}{{aoe=[20ft radius globe](!rounds --aoe @{selected|token_id}|circle|feet|360|40||black)}}{{save=Special}}{{reference=PHB p201 (reverse Light)}}{{damage=[Blind them](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Select who to brighten|token_id}|Light|[[60+(10*@{selected|Casting-Level})]]|-1|Blinded by the Darkness in eyes, 4 penalty on attk+AC|bleeding-eye)}}SpellData=[w:Darkness,lv:1,sp:4,gp:0,cs:VS,sph:Sun]{{effects=Equal to the darkest night. Immobile unless cast on a movable object or creature. If on a creature, magic resistance and save vs. spell applies.}}'},
{name:'Destroy-Water',type:'PRspellL1',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nDestroy Water\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 1 Priest (reversable)}}{{school=Alteration}}{{sphere=Elemental(Water)}}Specs=[Destroy-Water,PRspellL1,1H,Alteration]{{components=V,S,M}}{{time=[[1]]round}}{{range=[30 yds](!rounds --aoe @{selected|token_id}|circle|yards|0|60||magic|true)}}{{duration=Permanent}}{{aoe=Up to [[27]]cu.ft}}{{save=None}}{{reference=PHB p199}}SpellData=[w:Destroy Water,lv:1,sp:10,gp:0,cs:VSM,sph:Elemental-Water]{{effects=Obliterates without trace (no vapor, mist, fog, or steam) up to [[4*@{selected|casting-level}]] gallons of water.}}{{materials=At least a pinch of dust (no cost).}}'},
+ {name:'Destruction',type:'Innate-Melee|PRspellL7',ct:'1',charge:'uncharged',cost:'0.1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nDestruction\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Necromancy (Reversable)}}{{sphere=Necromantic}}Specs=[Destruction,Innate-Melee|PRspellL7,1H,Necromancy]{{components=V,S,M}}ToHitData=[w:Destruction,sb:0,r:5,ty:SPB,sp:1,touch:1,msg:A successful hit will require the victim to make a saving throw vs. death magic at a -4 penalty or be turned to dust. Successfully saving still does damage]{{range=Touch}}DmgData=[w:Destruction,sb:0,SM:8d6,L:8d6,msg:A successful hit will require the victim to make a saving throw vs. death magic at a -4 penalty or be turned to dust. Successfully saving still does damage]{{time=[[1]] turn}}{{duration=Permanent}}{{aoe=1 Creature}}{{save=vs. death magic at -4 penalty}}{{reference=PHB p235}}SpellData=[w:Destruction,lv:7,sp:1,gp:0.1,cs:VSM,sph:Necromantic]{{Use=Take the spell in-hand when cast using the *change weapon* dialog, then attack the target. On a successful hit, the target should make a saving throw vs. death magic with a -4 penalty or be utterly destroyed. Successfully saving still takes 8d6 damage}}{{effects=*Destruction* causes the victim of the spell to be instantly dead and turned to dust. A wish spell or equivalent is required for recovery. Destruction requires a touch, either in combat or otherwise, and does not age the caster. In addition, the victim is allowed a saving throw (with a -4 penalty). If the save is successful, the victim receives [8d6](!\\amp#13;\\amp#47;gr 8d6) points of damage instead.}}{{materials=A prayer device and unholy water}}'},
{name:'Detect-Charm',type:'PRspellL2',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nDetect Charm\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 2 Priest}}{{school=Divination}}{{sphere=Divination}}Specs=[Detect-Charm,PRspellL2,1H,Divination]{{components=V,S}}{{time=[[1]] round}}{{range=[30 yds](!rounds --aoe @{selected|token_id}|circle|yards|0|60||magic|true)}}{{duration=[[1]] turn}}{{aoe=[[@{selected|Casting-Level}]] creatures}}{{save=Negates}}{{reference=PHB p204}}SpellData=[w:Detect-Charm,lv:2,sp:10,gp:0,cs:VS,sph:Divination]{{effects=Detect if a person or monster is under the influence of a charm spell, or similar control such as hypnosis, suggestion, beguiling, possession, etc.}}'},
{name:'Detect-Evil',type:'PRspellL1',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nDetect-Evil\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 1 Priest (reversable)}}{{school=Divination}}{{sphere=All}}Specs=[Detect-Evil,PRspellL1,1H,Divination]{{components=V,S,M}}{{time=[[1]]round}}{{range=[[0]]}}{{duration=[[10+(5*@{selected|Casting-Level})]] rounds}}{{aoe=[10ft x 120yds path](!rounds --aoe @{selected|token_id}|bolt|feet|0|360|10|magic)}}{{save=None}}{{reference=PHB p199}}{{healing=[Evil radar on](!rounds --target caster|@{selected|token_id}|Detect-Evil|[[10+(5*@{selected|Casting-Level})]]|-1|Detecting Evil|aura)}}SpellData=[w:Detect-Evil,lv:1,sp:10,gp:0,cs:VS,sph:Divination]{{effects=This spell discovers emanations of evil from any creature, object, or area. Character alignment, however, is revealed only under unusual circumstances: characters who are strongly aligned, who do not stray from their faith, and who are of at least 9th level might radiate evil *if intent upon appropriate actions.*}}{{materials=The priest\'s holy symbol, with the priest holding it before him.}}'},
{name:'Detect-Good',type:'PRspellL1',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nDetect Good\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 1 Priest (reversable)}}{{school=Divination}}{{sphere=All}}Specs=[Detect-Good,PRspellL1,1H,Divination]{{components=V,S,M}}{{time=[[1]]round}}{{range=[[0]]}}{{duration=[[10+(5*@{selected|Casting-Level})]] rounds}}{{aoe=[10ft x 120yds path](!rounds --aoe @{selected|token_id}|bolt|feet|0|360|10|magic)}}{{save=None}}{{reference=PHB p199 (reverse Detect Evil)}}{{healing=[Good radar on](!rounds --target caster|@{selected|token_id}|Detect-Good|[[10+(5*@{selected|Casting-Level})]]|-1|Detecting Good|aura)}}SpellData=[w:Detect-Good,lv:1,sp:10,gp:0,cs:VS,sph:Divination]{{effects=Discovers emanations of good from any creature, object, or area. Character alignment, however, is revealed only under unusual circumstances: characters who are strongly aligned, who do not stray from their faith, and who are of at least 9th level might radiate good *if intent upon appropriate actions.*}}{{materials=The priest\'s un-holy symbol, with the priest holding it before him.}}'},
@@ -2947,6 +3108,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Earthquake',type:'PRspellL7',ct:'100',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nEarthquake\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Alteration}}{{sphere=Elemental (Earth)}}Specs=[Earthquake,PRspellL7,1H,Alteration]{{components=V,S,M}}{{range=[[120]] yards}}{{time=[[1]] turn}}{{duration=[[1]] round}}{{aoe=[[[5*@{selected|casting-level}]]ft diameter](!rounds --aoe @{selected|token_id}|circle|feet|360|[[5*@{selected|casting-level}]]||lightning)}}{{save=None}}{{reference=PHB p233}}SpellData=[w:Earthquake,lv:7,sp:100,gp:0,cs:VSM,sph:Elemental-Earth]{{effects=A local tremor of fairly high strength rips the ground. The shock is over in one round.}}{{materials=A pinch of dirt, a piece of rock, and a lump of clay (no cost)}}'},
{name:'Endure-Cold',type:'PRspellL1',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nEndure Cold\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 1 Priest}}{{school=Alteration}}{{sphere=Protection}}Specs=[Endure-Cold,PRspellL1,1H,Alteration]{{components=V,S}}{{time=[[1]] round}}{{range=Touch}}{{duration=[[3*@{selected|Casting-Level}/2]] hours}}{{aoe=Creature touched}}{{save=None}}{{reference=PHB p200}}{{healing=[Grant Endurance](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Select a beneficiary|token_id}|Endure-Cold|99|0|Can endure cold to -34C, absorb 10HP of magic cold|white-tower)}}SpellData=[w:Endure-Cold,lv:1,sp:10,gp:0,cs:VS,sph:Protection]{{effects=Can withstand normal extremes of cold down to [[0-30]]F ([[0-34]]C) and suffers [[1]]HP per hour per degree below this. Magical cold (or heat) will break spell but first [[10]]HP will be absorbed. Ends immediately if either type of Resist spell is cast on recipient}}'},
{name:'Endure-Heat',type:'PRspellL1',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nEndure Heat\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 1 Priest}}{{school=Alteration}}{{sphere=Protection}}Specs=[Endure-Heat,PRspellL1,1H,Alteration]{{components=V,S}}{{time=[[1]] round}}{{range=Touch}}{{duration=[[3*@{selected|Casting-Level}/2]] hours}}{{aoe=Creature touched}}{{save=None}}{{reference=PHB p200}}{{healing=[Grant Endurance](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Select a beneficiary|token_id}|Endure-Heat|99|0|Can endure heat to 54C, absorb 10HP of magic heat|white-tower)}}SpellData=[w:Endure-Heat,lv:1,sp:10,gp:0,cs:VS,sph:Protection]{{effects=Can withstand normal extremes of heat up to [[130]]F ([[54]]C) and suffers [[1]]HP per hour per degree above this. Magical fire will break spell but first [[10]]HP will be absorbed. Ends immediately if either type of Resist spell is cast on recipient}}'},
+ {name:'Energy-Drain',type:'Innate-Melee|PRspellL7',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nEnergy Drain\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Necromancy (Reversable)}}{{sphere=Necromantic}}Specs=[Energy Drain,Innate-Melee|PRspellL7,1H,Necromancy]{{components=V,S}}ToHitData=[w:Energy Drain,sb:0,r:5,ty:SPB,sp:1,touch:1,msg:A successful hit will \\lbrak;drain\\rbrak;\\lpar;!magic ~~level-change \\amp#64;{target\\vbar;Who will be Drained?\\vbar;token_id}\\vbar;-1\\rpar; the victim of 1 life energy level]{{range=Touch}}DmgData=[w:Energy Drain,sb:0,SM:0,L:0,msg:A successful hit will \\lbrak;drain\\rbrak;\\lpar;!magic ~~level-change \\amp#64;{target\\vbar;Who will be Drained?\\vbar;token_id}\\vbar;-1\\rpar; the victim of 1 life energy level]{{time=[[3]] rounds}}{{duration=Permanent}}{{aoe=1 Creature}}{{save=None}}{{reference=PHB p235}}SpellData=[w:Energy Drain,lv:7,sp:30,gp:0,cs:VS,sph:Necromantic]{{Use=Take the spell in-hand when cast using the *change weapon* dialog, then attack the target. On a successful hit, use the *drain* button displayed (if dual- or multi-classed will ask it\'s desired class to drain)}}{{effects=*Energy drain* draws away one life energy level (see such undead as spectre, wight, and vampire, in the Monstrous Manual). The energy drain requires the victim to be touched. Casting this form of the spell does not age the caster.}}'},
{name:'Entangle',type:'PRspellL1',ct:'4',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nEntangle\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 1 Priest}}{{school=Alteration}}{{sphere=Plant}}Specs=[Entangle,PRspellL1,1H,Alteration]{{components=V, S, M}}{{time=[[4]]}}{{range=[[80]] yards}}{{duration=[[1]] turn or [[10]] rounds}}{{aoe=[40 foot cube](!rounds --aoe @{selected|token_id}|square|feet|240|40||magic)}}{{save=Reduced movement}}{{reference=PHB p200}}{{damage=[Entangle them](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select first entangled creature|token_id}|Entangle|10|-1|Entangled, immobile|cobweb)}}SpellData=[w:Entangle,lv:1,sp:4,gp:0,cs:VSM,sph:Plant]{{effects=Causes grass, weeds, bushes and even trees to wrap, twist and entwine about creatures in the Area of Effect, which must then Save vs. Spell or be held fast.}}{{materials=The caster\'s holy symbol}}'},
{name:'Enthrall',type:'PRspellL2',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nEnthrall\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 2 Priest}}{{school=Enchantment/Charm}}{{sphere=Charm}}Specs=[Enthrall,PRspellL2,1H,Enchantment-Charm]{{components=V,S}}{{time=[[1]]round}}{{range=[[0]]}}{{duration=Special}}{{aoe=[90ft radius](!rounds --aoe @{selected|token_id}|circle|yards|0|60||magic|true)}}{{save=Negates}}{{reference=PHB p204}}{{healing=[Enthrall Them](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select first audience member|token_id}|Enthrall|99|0|Enthralled while caster speaks unless attacked|chained-heart)}}SpellData=[w:Enthrall,lv:2,sp:10,gp:0,cs:VS,sph:Charm]{{effects=Enthrall an audience that can fully understand his language, which must save vs. spell or give the caster their undivided attention, totally ignoring their surroundings.}}'},
{name:'Exaction',type:'PRspellL7',ct:'10',charge:'uncharged',cost:'1000',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nExaction\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Evocation, Alteration}}{{sphere=Charm, Summoning}}Specs=[Exaction,PRspellL7,1H,Evocation|Alteration]{{components=V,S,M}}{{range=[[10]] yards}}{{time=[[1]] round}}{{duration=Special}}{{aoe=1 creature}}{{save=None}}{{reference=PHB p233}}SpellData=[w:Exaction,lv:7,sp:10,gp:1000,cs:VSM,sph:Charm|Summoning]{{effects=Confront some powerful creature from another plane (including devas and other powerful minions, for instance, but not demigods or deities of any sort) and requires of it some duty or quest.}}{{materials=The priest\'s holy symbol, some matter or substance from the plane of the creature from whom an exaction is expected costing 1,000gp to source, and knowledge of the creature\'s nature or actions that is written out on a parchment that is burned to seal the pledge}}'},
@@ -3026,12 +3188,17 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Raise-Dead',type:'PRspellL5',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nRaise Dead\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 5 Priest}}{{school=Necromancy (Reversable)}}{{sphere=Necromantic}}Specs=[Raise Dead,PRspellL5,1H,Necromancy]{{components=V,S}}{{time=[[1]] round}}{{range=[[[30]] yards](!rounds --aoe @{selected|token_id}|circle|yards|0|60||magic|true)}}{{duration=Permanent}}{{aoe=1 creature}}{{save=Special}}{{reference=PHB p224}}SpellData=[w:Raise Dead,lv:5,sp:10,gp:0,cs:VS,sph:Necromantic]{{effects=Restore life to a dwarf, gnome, half-elf, halfling, or human (other creatures may be allowed, at the DM\'s option).}}{{materials=The priest\'s holy symbol}}'},
{name:'Raise-Water',type:'PRspellL4',ct:'100',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nRaise Water\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 4 Priest}}{{school=Alteration (reversable)}}{{sphere=Elemental(Water)}}Specs=[Raise-Water,PRspellL4,1H,Alteration]{{components=V,S,M}}{{time=[[1]]turn}}{{range=[[120]]yds}}{{duration=[[@{selected|casting-level}]]turns}}{{aoe=Special}}{{save=None}}{{reference=PHB p218 (reverse of *Lower Water*)}}SpellData=[w:Raise-Water,lv:4,sp:100,gp:0,cs:VSM,sph:Elemental-Water]{{effects=*Raise Water* causes water or similar fluids to return to their highest natural level: spring flood, high tide, etc. }}{{materials=The priest\'s holy (or unholy) symbol and a pinch of dust.}}'},
{name:'Reflecting-Pool',type:'PRspellL4',ct:'1200',charge:'uncharged',cost:'1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nReflecting Pool\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 4 Priest}}{{school=Divination}}{{sphere=Divination}}Specs=[Reflecting-Pool,PRspellL4,1H,Divination]{{components=V,S,M}}{{time=[[2]] hours}}{{range=[[10]] yds}}{{duration=[[@{selected|casting-level}]] rounds}}{{aoe=Special}}{{save=None}}{{reference=PHB p219}}SpellData=[w:,lv:4,sp:1200,gp:1,cs:VSM,sph:Divination]{{effects=Cause a pool of normal water found in a natural setting to act as a scrying device.}}{{materials=oil extracted from such nuts as the hickory and the walnut, costing 1gp to refine, and dropped in three measures upon the surface of the pool. (A measure need be no more than a single ounce of oil.)}}'},
+ {name:'Regenerate',type:'PRspellL7',ct:'30',charge:'uncharged',cost:'0.1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nRegenerate\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Necromancy (Reversable)}}{{sphere=Necromantic}}Specs=[Regenerate,PRspellL7,1H,Necromancy]{{components=V,S,M}}{{range=Touch}}{{time=[[3]] rounds}}{{duration=Permanent}}{{aoe=Creature Touched}}{{save=None}}{{reference=PHB p234}}SpellData=[w:Regenerate,lv:7,sp:30,gp:0.1,cs:VSM,sph:Necromantic]{{Use=Select the relevant button in the description and then select the token that is regenerating lost limbs}}{{effects=Body members (fingers, toes, hands, feet, arms, legs, tails, or even heads of multi-headed creatues), bones, and organs grow back. The process of regeneration requies but one round if the severed member(s) is (are) [present](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who will regenerate limbs?|token_id}|Regenerate|1|-1|Regenerating / reattaching severed parts|aura) and touching the creature, 2d4 turns [otherwise](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who will regenerate limbs?|token_id}|Regenerate|\\amp#91;[2d4]\\amp#93;|-1|Regenerating severed parts|aura). The creature must be lving to receive the benefits of this spell. If the severed member is not present, or if the injury is older than one day per caster level, the recipient must roll a successful system shock check to survive the spell.}}{{materials=A prayer device and holy water}}'},
+ {name:'Reincarnate',type:'PRspellL7',ct:'100',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nReincarnate\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Necromancy}}{{sphere=Necromantic}}Specs=[Reincarnate,PRspellL7,1H,Necromancy]{{components=V,S}}{{range=Touch}}{{time=[[1]] turn}}{{duration=Permanent}}{{aoe=1 person}}{{save=None}}{{reference=PHB p234}}SpellData=[w:Reincarnate,lv:7,sp:100,gp:0,cs:VS,sph:Necromantic]{{effects=Brings back a dead person in another body, if death occurred no more than one week before the casting of the spell. Reincarnation does not require any saving throw, system shock, or resurrection survival roll.\nThe new incarnation is determined on the following table or by DM choice. At the DM\'s option, certain special (expensive) incenses can be used that may increase the chance for a character to return as a specific race or species.\n\\amplt;table\\ampgt;\\amplt;tr\\ampgt;\\amplt;th scope="col"\\ampgt;D100 Roll\\amplt;/th\\ampgt;\\amplt;th scope="col"\\ampgt;Incarnation\\amplt;/th\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;01-03\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Badger\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;04-08\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Bear, Black\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;09-12\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Bear, Brown\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;13-16\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Boar, Wild\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;17-19\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Centaur\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;20-23\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Dryad\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;24-28\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Eagle\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;29-31\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Elf\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;32-34\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Faub/Satyr\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;35-36\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Fox\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;37-40\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Gnome\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;41-44\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Hawk\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;45-58\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Human\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;59-61\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Lynx\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;62-64\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Owl\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;65-68\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Pixie\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;69-70\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Raccoon\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;71-75\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Stag\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;76-80\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Wolf\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;81-85\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Wolverine\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;86-00\\amplt;/td\\ampgt;\\amplt;td\\ampgt;DM\'s choice\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;/table\\ampgt;\nSee PHB p234 for full details}}'},
{name:'Remove-Curse',type:'PRspellL3',ct:'6',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nRemove Curse\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 3 Priest (reversable)}}{{school=Abjuration}}{{sphere=Protection}}Specs=[Remove-Curse,PRspellL3,1H,Abjuration]{{components=V,S}}{{time=[[6]]}}{{range=Touch}}{{duration=Permanent}}{{aoe=Special}}{{save=Special}}{{reference=PHB p213}}SpellData=[w:Remove-Curse,lv:3,sp:6,gp:0,cs:VS,sph:Protection]{{effects=Usually able to remove a curse on an object, on a person, or in the form of some undesired sending or evil presence.}}'},
{name:'Remove-Fear',type:'PRspellL1',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nRemove Fear\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 1 Priest (reversable)}}{{school=Abjuration}}{{sphere=Charm}}Specs=[Remove-Fear,PRspellL1,1H,Abjuration]{{components=V,S}}{{time=[[1]]}}{{range=[10 yards](!rounds --aoe @{selected|token_id}|circle|yards|0|20||light|true)}}{{duration=[[1]]turn}}{{aoe=[[floor(@{selected|Casting-Level}/4)]] creatures}}{{save=Improves by +4}}{{reference=PHB p202}}{{healing=[Protect Them](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select who to make brave|token_id}|Protection|10|-1|Save vs. Fear at +4|white-tower)}}SpellData=[w:Remove-Fear,lv:1,sp:1,gp:0,cs:VS,sph:Charm]{{effects=Instills courage in the spell recipient, raising the creature\'s saving throw rolls against magical fear attacks by +4 for one turn, and grants another save vs. any previous failed save vs. fear, with a +4 bonus to the die roll.}}'},
{name:'Remove-Paralysis',type:'PRspellL3',ct:'6',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nRemove Paralysis\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 3 Priest}}{{school=Abjuration}}{{sphere=Protection}}Specs=[Remove-Paralysis,PRspellL3,1H,Abjuration]{{components=V,S}}{{time=[[6]]}}{{range=[[10*@{selected|Casting-Level}]]yds}}{{duration=Permanent}}{{aoe=[1d4](!\\amp#13;\\amp#47;r 1d4)creatures in a [20ft cube](!rounds --aoe @{selected|token_id}|square|feet|[[30*@{selected|Casting-Level}]]|20||light)}}{{save=Special}}{{reference=PHB p213}}SpellData=[w:Remove-Paralysis,lv:3,sp:6,gp:0,cs:VS,sph:Protection]{{effects=Free one or more creatures from any paralyzation or from related magic.}}'},
{name:'Repel-Insects',type:'PRspellL4',ct:'10',charge:'uncharged',cost:'0.01',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nRepel Insects\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 4 Priest}}{{school=Abjuration,Alteration}}{{sphere=Animal,Protection}}Specs=[Repel-Insects,PRspellL4,1H,Abjuration|Alteration]{{components=V,S,M}}{{time=[[1]] round}}{{range=[[0]]}}{{duration=[[@{selected|Casting-Level}]] turns}}{{aoe=[[10]]ft radius}}{{save=None}}{{reference=PHB p220}}{{healing=[Apply Repellant](!rounds --target caster|@{selected|token_id}|Repel-Insects|[[10*@{selected|Casting-Level}]]|-1|Repels all natural insects+others\\lt[[floor(@{selected|casting-level}/3)]]HD. Others save to pass with 1d6 dmg|white-tower)}}SpellData=[w:Repel-Insects,lv:4,sp:10,gp:0.01,cs:VSM,sph:Protection|Animal]{{effects=Creates an invisible barrier to all sorts of insects, and normal insects do not approach within 10 feet of the caster while the spell is in effect: giant insects with less than [[floor(@{selected|casting-level}/3)]] Hit Dice are also repelled but insects with more Hit Dice can enter the protected area if the insect is especially aggressive and saves vs. spell - if save, can pass but take [1d6](!\\amp#13;\\amp#47;r 1d6) damage.}}{{materials=any one of the following, each costing just 1cp: several crushed marigold flowers, a whole crushed leek, seven crushed stinging nettle leaves, or a small lump of resin from a camphor tree.}}'},
{name:'Resist-Cold',type:'PRspellL2',ct:'5',charge:'uncharged',cost:'1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nResist Cold\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 2 Priest}}{{school=Alteration}}{{sphere=Protection}}Specs=[Resist-Cold,PRspellL2,1H,Alteration]{{components=V,S,M}}{{time=[[5]]}}{{range=Touch}}{{duration=[[@{selected|Casting-Level}]] rounds}}{{aoe=Creature touched}}{{save=None}}{{reference=PHB p206}}{{healing=[Grant Resistance](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Select who to Protect|token_id}|Resist-Cold|[[@{selected|Casting-Level}]]|-1|Immune to normal cold, magic cold +3 save + 50 dmg|white-tower)}}SpellData=[w:Resist-Cold,lv:2,sp:5,gp:1,cs:VSM,sph:Protection]{{effects=Complete immunity to mild conditions. Can resist normal cold, and magical cold to gain +[[3]] on saves and [[50]]% damage ([[25]]% if save) from e.g. frostbrand swords, ice storms, wand of frost, or white dragon\'s breath}}{{materials=A drop of mercury, a rare \'magical\' liquid metal costing 1gp a drop}}'},
{name:'Resist-Fire',type:'PRspellL2',ct:'5',charge:'uncharged',cost:'1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nResist Fire\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 2 Priest}}{{school=Alteration}}{{sphere=Protection}}Specs=[Resist-Fire,PRspellL2,1H,Alteration]{{components=V,S,M}}{{time=[[5]]}}{{range=Touch}}{{duration=[[@{selected|Casting-Level}]] rounds}}{{aoe=Creature touched}}{{save=None}}{{reference=PHB p206}}{{healing=[Grant Resistance](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Select the fireman|token_id}|Resist-Fire|[[@{selected|Casting-Level}]]|-1|Immune to normal fire, magic fire +3 save + 50% dmg|white-tower)}}SpellData=[w:Resist-Fire,lv:2,sp:5,gp:1,cs:VSM,sph:Protection]{{effects=Complete immunity to mild conditions. Can resist normal fire, and magical fire to gain +[[3]] on saves and [[50]]% damage ([[25]]% if save) from e.g. burning oil or fireball or flaming swords or fire storm or meteors or red dragon breath.}}{{materials=A drop of mercury, a rare \'magical\' liquid metal costing 1gp a drop}}'},
+ {name:'Restoration',type:'PRspellL7',ct:'30',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nRestoration\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Necromancy (Reversable)}}{{sphere=Necromantic}}Specs=[Restoration,PRspellL7,1H,Necromancy]{{components=V,S}}{{range=Touch}}{{time=[[3]] rounds}}{{duration=Permanent}}{{aoe=[1 Creature](!magic --level-change \\amp#64;{target|Who will be Restored?|token_id}|+1)}}{{save=None}}{{reference=PHB p235}}SpellData=[w:Restoration,lv:7,sp:30,gp:0,cs:VS,sph:Necromantic]{{Use=Select the +area of effect* button above and then select the token of the creature to be restored to raise it by 1 level (if dual- or multi-classed will ask it\'s desired class)}}{{effects=The life energy level of the recipient creature is raised by one. This reverses any previous life energy level drain of the creature by a force or monster. Thus, if a 10th-level character had been struck by a wight and drained to 9th level, the *restoration* spell would bring the character up to exactly the number of experience points necessary to restore him to 10th level once again, restoring additional Hit Dice (or hit points) and level functions accordingly. Restoration is effective only if the spell is cast within one day of the recipient\'s loss of life energy, per experience level of the priest casting it. A *restoration* spell restores the intelligence of a creature affected by a *feeblemind* spell. It also negates all forms of insanity. Casting this spell ages both the caster and the recipient by two years.}}'},
+ {name:'Resurrection',type:'PRspellL7',ct:'100',charge:'uncharged',cost:'0.1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nResurrection\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Necromancy (Reversable)}}{{sphere=Necromantic}}Specs=[Resurrection,PRspellL7,1H,Necromancy]{{components=V,S,M}}{{range=Touch}}{{time=[[1]] turn}}{{duration=Permanent}}{{aoe=1 Creature}}{{save=None}}{{reference=PHB p235}}SpellData=[w:Resurrection,lv:7,sp:100,gp:0.1,cs:VSM,sph:Necromantic]{{effects=The priest is able to restore life and complete strength to any living creature, including elves, by bestowing the resurrection spell. The creature can have been dead up to 10 years per level of the priest casting the spell. Thus, a 19th-level priest can resurrect the bones of a creature dead up to 190 years. The creature, upon surviving a resurrection survival check, is immediately restored to full hit points and can perform strenuous activity. The spell cannot bring back a creature that has reached its allotted life span (i.e., died of natural causes). Casting this spell makes it impossible for the priest to cast further spells or engage in combat until he has had one day of bed rest for each experience level or Hit Die of the creature brought back to life. The caster ages three years upon casting this spell.}}{{materials=A prayer device and holy water}}'},
+ {name:'Reverse-Succor',type:'PRspellL7',ct:'10',charge:'uncharged',cost:'4000',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nSuccor (Reversed)\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Alteration / Enchantment (Reversable)}}{{sphere=Summoning}}Specs=[Reverse Succor,PRspellL7,1H,Alteration|Enchantment]{{components=V,S,M}}{{range=Touch}}{{time=[[1]] day}}{{duration=Special}}{{aoe=1 person}}{{save=None}}{{reference=PHB p235}}SpellData=[w:Reverse Succor,lv:7,sp:10,gp:4000,cs:VSM,sph:Summoning]{{effects=By casting this spell, the priest creates a powerful magic aura in some specially prepared object--a string of prayer beads, a small clay tablet, an ivory baton, etc. This object radiates magic, for it contains the power to instantaneously transport the priest who created it from their sanctuary to the immediate vicinity of the possessor of the item when it is broken and the command word said. The priest has a general idea of the location and situation of the item\'s possessor, and can choose not to be affected by this summons. This decision is made at the instant when the transportation is to take place. However, if he chooses not to go, the opportunity is gone forever and the spell is wasted.\nNote that the same factors that can prevent the operation of the plane shift and teleport spells can also prevent the use of this spell.}}{{materials=The cost of preparing the special item (for either version of the spell) varies from 2,000 to 5,000 gp. The more costly items can transport the subject from one plane of existence to another, if the DM allows.}}'},
{name:'Reverse-Tongues',type:'PRspellL4',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nReverse Tongues\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 4 Priest}}{{school=Alteration}}{{sphere=Divination}}Specs=[Reverse Tongues,PRspellL4,1H,Alteration]{{components=V,S}}{{time=[[7]]}}{{range=[[0]]}}{{duration=[[1]] turn}}{{aoe=[Hearing range - 60ft radius](!rounds --aoe @{selected|token_id}|circle|feet|0|120||magic|true)}}{{save=None}}{{damage=[Speak in Tongues](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Speak Gobbledegook|token_id}|PR-Reverse-Tongues|10|-1|Do not understand - reverse Tongues|Edge-crack)}}{{reference=PHB p220}}SpellData=[w:Tongues,lv:4,sp:7,gp:0,cs:VS,sph:Divination]{{effects=This spell cancels the effect of the *tongues* spell or confuses verbal communication of any sort within the area of effect.}}'},
{name:'Sanctuary',type:'PRspellL1',ct:'4',charge:'uncharged',cost:'0.1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nSanctuary\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 1 Priest}}{{school=Abjuration}}{{sphere=Protection}}Specs=[Sanctuary,PRspellL1,1H,Abjuration]{{components=V,S,M}}{{time=[[4]]}}{{range=Touch}}{{duration=[[2+@{selected|Casting-Level}]] rounds}}{{aoe=Creature touched}}{{save=None}}{{reference=PHB p202}}{{healing=[Grant Sanctuary](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Select who gets Sanctuary|token_id}|Sanctuary|[[2+@{selected|Casting-Level}]]|-1|Can\'t attk, foes save or can\'t hit|white-tower)}}SpellData=[w:Sanctuary,lv:1,sp:4,gp:0.1,cs:VSM,sph:Protection]{{effects=Any opponent attempting to strike or otherwise directly attack the protected creature must save vs. spell to attack normally and be unaffected, otherwise the opponent loses track of and totally ignores the warded creature for the duration of the spell.}}{{materials=The priest\'s holy symbol and a small silver mirror costing 1gp which can be used at least 10 times}}'},
{name:'Shillelagh',type:'PRspellL1',ct:'2',charge:'uncharged',cost:'0.01',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nShillelagh\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 1 Priest}}{{school=Alteration}}{{sphere=Combat,Plant}}Specs=[Shillelagh,PRspellL1,1H,Alteration]{{components=V,S,M}}{{time=[[2]]}}{{range=Touch}}{{duration=[[4+@{selected|Casting-Level}]] rounds}}{{aoe=[[1]]oak club or staff}}{{save=None}}{{reference=PHB p202}}{{healing=[Bless the Club](!rounds --target caster|@{selected|token_id}|Shillelagh|[[4+@{selected|Casting-Level}]]|-1|Club is +1 to-hit, does SM:2 d4 L:1 d4 +1 damage|angel-outfit)}}SpellData=[w:Shillelagh,lv:1,sp:2,gp:0.01,cs:VSM,sph:Combat|Plant]{{effects=Change the caster\'s own oak cudgel or unshod staff into a magical weapon that gains a +1 bonus to its attack roll and inflicts 2d4 points of damage on opponents up to man size, and 1d4+1 points of damage on larger opponents. The spell inflicts no damage to the staff or cudgel. The caster must wield the shillelagh, of course.}}{{materials=A shamrock leaf costing 1cp and the caster\'s holy symbol.}}'},
@@ -3057,9 +3224,13 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Stone-Shape',type:'PRspellL3',ct:'10',charge:'uncharged',cost:'0.01',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nStone Shape\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 3 Priest}}{{school=Alteration}}{{sphere=Elemental(Earth)}}Specs=[Stone-Shape,PRspellL3,1H,Alteration]{{components=V,S,M}}{{time=[[10]]}}{{range=Touch}}{{duration=Permanent}}{{aoe=[[9+@{selected|casting-level}]]sq.ft.}}{{save=None}}{{reference=PHB p214}}SpellData=[w:Stone-Shape,lv:3,sp:10,gp:0.01,cs:VSM,sph:Elemental-Earth]{{effects=Form an existing piece of stone into any shape that suits the caster\'s purposes.}}{{materials=Soft clay that must be worked into roughly the desired shape of the stone object, and then touched to the stone when the spell is uttered. 1cp of materials \\amp effort}}'},
{name:'Stone-Tell',type:'PRspellL6',ct:'100',charge:'uncharged',cost:'1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nStone Tell\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 6 Priest}}{{school=Divination}}{{sphere=Elemental (Earth), Divination}}Specs=[Stone Tell,PRspellL6,1H,Divination]{{components=V,S,M}}{{range=Touch}}{{time=[[1]] turn}}{{duration=[[[1]] turn](!rounds --target caster|@{selected|token_id}|Stone-tell|10|-1|Communing with a rock...|broken-skull)}}{{aoe=[1 cubic yard](!rounds --aoe @{selected|token_id}|square|yards|0|1|1|magic|true)}}{{save=None}}{{reference=PHB p229}}SpellData=[w:Stone Tell,lv:6,sp:100,gp:1,cs:VSM,sph:Elemental-Earth|Divination]{{effects=The very stones speak and relate to the caster who or what has touched them as well as revealing what is covered, concealed, or simply behind them.}}{{materials=A drop of mercury, a rare \'magical\' liquid metal costing 1gp a drop, and a bit of clay}}'},
{name:'Straighten-Wood',type:'PRspellL2',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nStraighten Wood\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 2 Priest (reversable)}}{{school=Alteration}}{{sphere=Plant}}Specs=[Straighten Wood,PRspellL2,1H,Alteration]{{components=V,S}}{{time=[[5]]}}{{range=[[[10*@{selected|Casting-Level}]] yards](!rounds --aoe @{selected|token_id}|circle|yards|0|[[20*@{selected|Casting-Level}]]||lightning)}}{{duration=Permanent}}{{aoe=[[15]]x[[1]]inch dia. x [[@{selected|Casting-Level}]] of wood}}{{save=Special}}{{reference=PHB p208 (reverse of *Warp Wood*)}}SpellData=[w:Straighten Wood,lv:2,sp:5,gp:0,cs:VS,sph:Plant]{{effects=Straightens bent or crooked wood, or reverses the effects of a *warp wood* spell.}}'},
+ {name:'Succor',type:'PRspellL7',ct:'10',charge:'uncharged',cost:'4000',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nSuccor\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Alteration / Enchantment (Reversable)}}{{sphere=Summoning}}Specs=[Succor,PRspellL7,1H,Alteration|Enchantment]{{components=V,S,M}}{{range=Touch}}{{time=[[1]] day}}{{duration=Special}}{{aoe=1 person}}{{save=None}}{{reference=PHB p235}}SpellData=[w:Succor,lv:7,sp:10,gp:4000,cs:VSM,sph:Summoning]{{effects=By casting this spell, the priest creates a powerful magic aura in some specially prepared object--a string of prayer beads, a small clay tablet, an ivory baton, etc. This object radiates magic, for it contains the power to instantaneously transport its possessor to the sanctuary of the priest who created its magic. Once the item is enchanted, the priest must give it willingly to an individual, at the same time informing him of a command word to be spoken when the item is to be used. To make use of the item, the recipient must speak the command word at the same time that he rends or breaks the item. When this is done, the individual and all that he is wearing and carrying (up to the maximum encumbrance limit for the character) are instantly transported to the sanctuary of the priest, just as if the individual were capable of speaking a *word of recall* spell. No other creatures can be affected.\nNote that the same factors that can prevent the operation of the plane shift and teleport spells can also prevent the use of this spell.}}{{materials=The cost of preparing the special item (for either version of the spell) varies from 2,000 to 5,000 gp. The more costly items can transport the subject from one plane of existence to another, if the DM allows.}}'},
{name:'Summon-Insects',type:'PRspellL3',ct:'10',charge:'uncharged',cost:'0.01',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nSummon Insects\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 3 Priest}}{{school=Conjuration/Summoning}}{{sphere=Animal}}Specs=[Summon-Insects,PRspellL3,1H,Conjuration-Summoning]{{components=V,S,M}}{{time=[[1]] round}}{{range=[30 yards](!rounds --aoe @{selected|token_id}|circle|yards|0|60||acid|true)}}{{duration=[[@{selected|Casting-Level}]] rounds}}{{aoe=[[1]] creature}}{{save=None}}{{reference=PHB p214}}{{damage=[[2]]HP/rd if flee or defend, [[4]]HP otherwise}}{{damagetype=\nBites or Stings}}SpellData=[w:Summon-Insects,lv:3,sp:10,gp:0.01,cs:VSM,sph:Animal]{{effects=Roll [1d100](!\\amp#13;\\amp#47;r 1d100) - 70% summons bees or biting flies or hornets or wasps. 30% summons biting ants or pinching beetles. 2pts per round if just flee \\amp fend off, 4pts otherwise and [[0-2]] on attack \\amp +[[2]] on AC. Can then go after 2nd target after 1 round.}}{{materials=The caster\'s holy symbol, a flower petal, and a bit of mud or wet clay. Total cost 1cp}}'},
+ {name:'Sunray',type:'PRspellL7',ct:'4',charge:'uncharged',cost:'1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nSunray\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Evocation / Alteration}}{{sphere=Sun}}Specs=[Sunray,PRspellL7,1H,Evocation|Alteration]{{components=V,S,M}}{{range=[[10*@{selected|pr-casting-level} yds.}}{{time=[[4]]}}{{duration=1+1d4 rounds}}{{aoe=[5 ft. radius](!rounds --aoe @{selected|token_id}|circle|feet|[[10*@{selected|pr-casting-level}]]|10|10|light) (special)}}{{save=Special}}{{reference=PHB p235}}SpellData=[w:Sunray,lv:7,sp:4,gp:1,cs:VSM,sph:Sun]{{Use=Select the *area of effect* button above and indicate where the beam will illuminate. Then apply the effects as described using the buttons to roll dice as relevant.}}{{effects=With this spell, the caster can evoke a dazzling beam of light each round in which they take no action other than movement. The sunray is like a ray of natural sunlight. All creatures in the 10-foot-diameter area of effect must roll successful saving throws vs. spell or be blinded for [1d3 rounds](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Which creatures with normal vision are blinded?|token_id}|blinded|\\amp#91;[10*1d3]\\amp#93;|-10|Blinded by intense sunray. Attack and AC at -4 penalty|bleeding-eye), those using infravision at the time for [2d4 rounds](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Which creatures using infravision are blinded?|token_id}|blinded|\\amp#91;[10*2d4]\\amp#93;|-10|Blinded by intense sunray. Attack and AC at -4 penalty|bleeding-eye). Creatures to whom sunlight is harmful or unnatural suffer [permanent blindness](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Which creatures that failed their save are permanently blinded?|token_id}|blinded|99|0|Blinded by intense sunray. Attack and AC at -4 penalty|bleeding-eye) if the saving throw is failed, and are blinded for [2d6 rounds](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Which creatures to whom sunlight is unnatural are blinded?|token_id}|blinded|\\amp#91;[10*2d6]\\amp#93;|-10|Blinded by intense sunray. Attack and AC at -4 penalty|bleeding-eye) if the saving throw is successful. Those within its area of effect, as well as creatures within 20 feet of its perimeter, lose any infravision capabilities for [1d4+1 rounds](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Which creatures with infravision cannot now use it?|token_id}|Sunray|\\amp#91;[10*(1d4+1)]\\amp#93;|-10|Blinded by intense sunray. Cannot use infravision again yet|interdiction).\nUndead caught within the sunray\'s area of effect receive [8d6 points](!\\amp#13;\\amp#47;gr 8d6) of damage, one half if a saving throw vs. spell is successful. Those undead 20 feet to either side of the sunray\'s area of effect receive [3d6 points](!\\amp#13;\\amp#47;gr 3d6) of damage, no damage if a save is successful. In addition, the ray may result in the total destruction of those undead specifically affected by sunlight, if their saving throws are failed. \nThe ultraviolet light generated by the spell inflicts damage on fungoid creatures and subterranean fungi just as if they were undead, but no saving throw is allowed.}}{{materials=A prayer device and holy water}}'},
+ {name:'Symbol',type:'PRspellL7',ct:'3',charge:'uncharged',cost:'10',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nSymbol\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Conjuration Summoning}}{{sphere=Guardian}}Specs=[Symbol,PRspellL7,1H,Conjuration-Summoning]{{components=V,S,M}}{{range=Touch}}{{time=[[3]]}}{{duration=[[@{selected|pr-casting-level}]] turns}}{{aoe=60ft radius}}{{save=Negates}}{{reference=PHB p236}}SpellData=[w:Symbol,lv:7,sp:3,gp:10,cs:VSM,sph:Guardian]{{GM info=Cast this spell then\n1. Create a new Character Sheet and name it after the selected Symbol\n2. Drag the Symbol character sheet onto the map to drop a token where you want the symbol to be\n3. Use the Race/Class/Creature dialog, creature dropdown to make the token a creature: Symbol of Hopelessness, of Pain, or of Pursuasion\n4. [Mark the symbol](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Which is the symbol of Hopelessness?|token_id}|Symbol|@{selected|pr-casting-level}|-1|This is the symbol of hopelessness|lightning-helix) with it\'s duration by pressing this button and selecting the newly dropped symbol.\n5. When creatures view this token from less than 60ft away, use the powers on the symbol token to affect the viewing creature}}{{Use=Ask the GM to drop a symbol token onto the map for you by following the GM info instructions}}{{effects=The priest casting this spell inscribes a glowing symbol in the air upon any surface, according to his desire. Any creature looking at the completed symbol within 60 feet must roll a successful saving throw vs. spell or suffer the effect. The symbol glows for one turn for each experience level of the caster. The particular symbol used is selected by the caster at the time of casting. The caster will not be affected by his own symbol. One of the following effects is chosen by the caster:\n**Hopelessness:** Creatures seeing it must turn back in dejection or surrender to capture or attack unless they roll successful saving throws vs. spell. Its effects last for 3d4 turns.\n**Pain:** Creatures affected suffer -4 penalties to their attack rolls and -2 penalties to their Dexterity ability scores due to wracking pains. The effects last for 2d10 turns.\n**Persuasion:** Creatures seeing the symbol become of the same alignment as and friendly to the priest who scribed the symbol for 1d20 turns unless a saving throw vs. spell is successful.}}{{materials=The material components of this spell are mercury and phosphorous (see 8th-level wizard spell, *symbol*).}}'},
{name:'Tongues',type:'PRspellL4',ct:'7',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nTongues\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 4 Priest}}{{school=Alteration}}{{sphere=Divination}}Specs=[Tongues,PRspellL4,1H,Alteration]{{components=V,S}}{{time=[[7]]}}{{range=[[0]]}}{{duration=[[1]] turn}}{{aoe=The caster}}{{save=None}}{{reference=PHB p220}}{{healing=[Universal Translator](!rounds --target caster|@{selected|token_id}|PR-Tongues-Translate|10|-1|Speaks your language|flying-flag)}}SpellData=[w:Tongues,lv:4,sp:7,gp:0,cs:VS,sph:Divination]{{effects=Speak and understand additional specified languages, whether they are racial tongues or regional dialects, but not communications of animals or mindless creatures.}}'},
{name:'Transmute-Dust-to-Water',type:'PRspellL6',ct:'8',charge:'uncharged',cost:'500',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nTransmute Dust to Water\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 6 Priest}}{{school=Alteration (Reversable)}}{{sphere=Elemental (Water, Earth)}}Specs=[Transmute Water to Dust,PRspellL6,1H,Alteration]{{components=V,S,M}}{{range=[[60]] yards}}{{time=[[8]]}}{{duration=Permanent}}{{aoe=[@{selected|casting-level} cubic yards](!rounds --aoe @{selected|token_id}|rectangle|yards|60|||magic)}}{{save=None}}{{reference=PHB p229}}SpellData=[w:Transmute Water to Dust,lv:6,sp:8,gp:500,cs:VSM,sph:Elemental-Water|Elemental-Earth]{{effects=Simply a very high-powered create water spell.}}{{materials=Diamond dust of at least 500 gp value, a bit of sea shell, and the caster\'s holy symbol}}'},
+ {name:'Transmute-Metal-to-Wood',type:'PRspellL7',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nTransmute Metal to Wood\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Alteration}}{{sphere=Elemental (Earth)}}Specs=[Transmute Metal to Wood,PRspellL7,1H,Alteration]{{components=V,S,M}}{{range=80 yds.}}{{time=[[1]] round}}{{duration=Permanent}}{{aoe=1 metal object of up to [[10*@{selected|pr-casting-level}]]lbs.}}{{save=Special}}{{reference=PHB p236}}SpellData=[w:Transmute Metal to Wood,lv:7,sp:10,gp:0,cs:VSM,sph:Elemental-Earth]{{effects=The *transmute metal to wood* spell enables the caster to change an object from metal to wood. The volume of metal cannot exceed a maximum weight of 10 pounds per experience level of the priest. Magical objects made of metal are 90% resistant to the spell, and those on the person of a creature receive the creature\'s saving throw as well. Artifacts and relics cannot be transmuted. Note that only a *wish* spell or similar magic can restore a transmuted object to its metallic state. Otherwise, for example, a metal door changed to wood would be forevermore a wooden door.}}{{materials=A metal object to transmute}}'},
{name:'Transmute-Mud-to-Rock',type:'PRspellL5',ct:'8',charge:'uncharged',cost:'00.2',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nTransmute Mud to Rock\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 5 Priest}}{{school=Alteration (Reversable)}}{{sphere=Elemental (Earth, Water)}}Specs=[Transmute Mud to Rock,PRspellL5,1H,Alteration]{{components=V,S,M}}{{time=[[8]]}}{{range=[[160]] yards}}{{duration=Special}}{{aoe=[@{selected|casting-level} x 20ft.cube](!rounds --aoe @{selected|token_id}|rectangle|feet|480|||magic)}}{{save=None}}{{reference=PHB p225}}SpellData=[w:Transmute Mud to Rock,lv:5,sp:8,gp:00.2,cs:VSM,sph:Elemental-Earth-Water]{{effects=Hardens normal mud or quicksand into soft stone (sandstone or similar mineral) permanently unless magically changed. Creatures in the mud are allowed a saving throw to escape before the area is hardened to stone. Dry sand is unaffected}}{{materials=Sand, lime (costing 2cp), and water}}'},
{name:'Transmute-Rock-to-Mud',type:'PRspellL5',ct:'8',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nTransmute Rock to Mud\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 5 Priest}}{{school=Alteration (Reversable)}}{{sphere=Elemental (Earth, Water)}}Specs=[Transmute Rock to Mud,PRspellL5,1H,Alteration]{{components=V,S,M}}{{time=[[8]]}}{{range=[[160]] yards}}{{duration=Special}}{{aoe=[@{selected|casting-level} x 20ft.cube](!rounds --aoe @{selected|token_id}|rectangle|feet|480|||magic)}}{{save=None}}{{reference=PHB p225}}SpellData=[w:Transmute Rock to Mud,lv:5,sp:8,gp:0,cs:VSM,sph:Elemental-Earth-Water]{{effects=Turns natural rock of any sort into an equal volume of mud.}}{{materials=Clay and water (free)}}'},
{name:'Transmute-Water-to-Dust',type:'PRspellL6',ct:'8',charge:'uncharged',cost:'500',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nTransmute Water to Dust\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 6 Priest}}{{school=Alteration (Reversable)}}{{sphere=Elemental (Water, Earth)}}Specs=[Transmute Water to Dust,PRspellL6,1H,Alteration]{{components=V,S,M}}{{range=[[60]] yards}}{{time=[[8]]}}{{duration=Permanent}}{{aoe=[@{selected|casting-level} cubic yards](!rounds --aoe @{selected|token_id}|rectangle|yards|60|||magic)}}{{save=Special}}{{reference=PHB p229}}SpellData=[w:Transmute Water to Dust,lv:6,sp:8,gp:500,cs:VSM,sph:Elemental-Water|Elemental-Earth]{{effects=The subject area instantly undergoes a change from liquid to powdery dust.}}{{materials=Diamond dust of at least 500 gp value, a bit of sea shell, and the caster\'s holy symbol}}'},
@@ -3075,33 +3246,22 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Wall-of-Thorns',type:'PRspellL6',ct:'9',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nWall of Thorns\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 6 Priest}}{{school=Conjuration-Summoning}}{{sphere=Plant, Creation}}Specs=[Wall of Thorns,PRspellL6,1H,Conjuration-Summoning]{{components=V,S}}{{range=[[80]] yards}}{{time=[[9]]}}{{duration=[@{selected|casting-level} turns](!rounds --target caster|@{selected|token_id}|Wall-of-Thorns|[[10@{selected|casting-level}]]|-1|A wall of spikey growth exists|interdiction)}}{{aoe=[[[@{selected|casting-level}]] x 10ft cubes](!rounds --aoe @{selected|token_id}|wall|feet|240|||acid)}}{{save=None}}{{reference=PHB p230}}SpellData=[w:Wall of Thorns,lv:6,sp:9,gp:0,cs:VS,sph:Plant|Creation]{{effects=Creates a barrier of very tough, pliable, tangled brush bearing needle-sharp thorns as long as a person\'s finger. Any creature breaking through (or crashing into) the wall of thorns suffers 8 points of damage, plus an additional amount of damage equal to the creature\'s AC.}}'},
{name:'Warp-Wood',type:'PRspellL2',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nWarp Wood\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 2 Priest (reversable)}}{{school=Alteration}}{{sphere=Plant}}Specs=[Warp-Wood,PRspellL2,1H,Alteration]{{components=V,S}}{{time=[[5]]}}{{range=[[[10*@{selected|Casting-Level}]] yards](!rounds --aoe @{selected|token_id}|circle|yards|0|[[20*@{selected|Casting-Level}]]||lightning)}}{{duration=Permanent}}{{aoe=[[15]]x[[1]]inch dia. x [[@{selected|Casting-Level}]] of wood}}{{save=Special}}{{reference=PHB p208}}SpellData=[w:Warp-Wood,lv:2,sp:5,gp:0,cs:VS,sph:Plant]{{effects=Causes a volume of wood to bend and warp, permanently destroying its straightness, form, and strength.}}'},
{name:'Water-Breathing',type:'PRspellL3',ct:'6',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nWater Breathing\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 3 Priest}}{{school=Alteration}}{{sphere=Elemental(Water)}}Specs=[Water-Breathing,PRspellL3,1H,Alteration]{{components=V,S}}{{time=[[6]]}}{{range=Touch}}{{duration=[[?{How many water breathers?|1}]] creatures for [[floor(@{selected|casting-level}/?{How many water breathers?|1})]]hours [[floor((60*@{selected|casting-level}/?{How many water breathers?|1})%60)]] minutes}}{{aoe=Special}}{{save=None}}{{reference=PHB p215}}{{healing=[Grant gills](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Give aqualung to who?|token_id}|Water-Breathing|[[60*@{selected|casting-level}/([[?{How many water breathers?|1}]])]]|-1|Breath water like a fish|ninja-mask)}}SpellData=[w:Water-Breathing,lv:3,sp:6,gp:0,cs:VS,sph:Elemental-Water]{{effects=The recipient is able to breathe under water freely for the duration of the spell--i.e., one hour for each experience level of the caster. The priest can divide the base duration between multiple characters.\nNote that the spell does not prevent the recipient creature from breathing in its natural element.}}'},
- {name:'Water-Summoning',type:'PRspellL6',ct:'100',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nWater Summoning\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 6 Priest}}{{school=Conjuration-Summoning}}{{sphere=Weather}}Specs=[Water Summoning,PRspellL6,1H,Conjuration-Summoning]{{components=V,S}}{{range=[[0]]}}{{time=[[1]] turn}}{{duration=Special}}{{aoe=Special}}{{save=None}}{{reference=PHB p230}}SpellData=[w:Water Summoning,lv:6,sp:100,gp:0,cs:VS,sph:Weather]{{effects=Calls forth weather appropriate to the climate and season of the area he is in, which is not under the control of the caster.}}'},
{name:'Water-Walk',type:'PRspellL3',ct:'6',charge:'uncharged',cost:'0.01',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nWater Walk\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 3 Priest}}{{school=Alteration}}{{sphere=Elemental(Water)}}Specs=[Water-Walk,PRspellL3,1H,Alteration]{{components=V,S,M}}{{time=[[6]]}}{{range=Touch}}{{duration=[[1+@{selected|casting-level}]]Turns}}{{aoe=[[@{selected|casting-level}-4]] creatures}}{{save=None}}{{reference=PHB p215}}{{healing=[Splash don\'t drown](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Give wellies to who?|token_id}|Water-Breathing|[[10+(10*@{selected|casting-level})]]|-1|Walk on water|tread)}}SpellData=[w:Water-Walk,lv:3,sp:6,gp:0.01,cs:VSM,sph:Elemental-Water]{{effects=Empower one or more creatures to tread upon any liquid as if it were firm ground; this includes mud, quicksand, oil, running water, and snow.}}{{materials=A piece of cork costing 1cp and the priest\'s holy symbol.}}'},
+ {name:'Weather-Summoning',type:'PRspellL6',ct:'100',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nWeather Summoning\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 6 Priest}}{{school=Conjuration-Summoning}}{{sphere=Weather}}Specs=[Weather Summoning,PRspellL6,1H,Conjuration-Summoning]{{components=V,S}}{{range=[[0]]}}{{time=[[1]] turn}}{{duration=Special}}{{aoe=Special}}{{save=None}}{{reference=PHB p230}}SpellData=[w:Weather Summoning,lv:6,sp:100,gp:0,cs:VS,sph:Weather]{{effects=Calls forth weather appropriate to the climate and season of the area he is in, which is not under the control of the caster.}}'},
+ {name:'Wind-Walk',type:'PRspellL7',ct:'10',charge:'uncharged',cost:'0.1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nWind Walk\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Alteration}}{{sphere=Elemental (Air)}}Specs=[Wind Walk,PRspellL7,1H,Alteration]{{components=V,S,M}}{{range=Touch}}{{time=[[1]] round}}{{duration=[1 hour/level](!rounds --target caster|@{selected|token_id}|Wind-Walk|99|0|Wind walking - only hit by magic or magical weaponry|fluffy-wing --target area|@{selected|token_id}|\\amp#64;{target|Who is Wind Walking with the caster?|token_id}|Wind-Walk|99|0|Wind walking - only hit by magic or magical weaponry|fluffy-wing)}}{{aoe=Caster + 1 person/8 levels}}{{save=None}}{{reference=PHB p236}}SpellData=[w:Wind Walk,lv:7,sp:10,gp:0.1,cs:VSM,sph:Elemental-Air]{{effects=This spell enables the priest (and possibly one or two other persons) to alter the substance of his body to a cloudlike vapor. A magical wind then wafts the priest along at a movement rate of 60, or as slow as 6, as the spellcaster wills. The wind walk spell lasts as long as the priest desires, up to a maximum duration of six turns (one hour) per experience level of the caster. For every eight levels of experience the priest has attained, up to 24, he is able to touch another person and carry that person, or those persons, along on the wind walk. Persons wind walking are not invisible, but rather appear misty and translucent. If fully clothed in white, they are 80% likely to be mistaken for clouds, fog, vapors, etc. The priest can regain his physical form as desired, each change to and from vaporous form requiring five rounds. While in vaporous form, the priest and companions are hit only by magic or magical weaponry, though they may be subject to high winds at the DM\'s discretion. No spellcasting is possible in vaporous form.}}{{materials=Fire and holy water.}}'},
{name:'Withdraw',type:'PRspellL2',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nWithdraw\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 2 Priest}}{{school=Alteration}}{{sphere=Protection}}Specs=[Withdraw,PRspellL2,1H,Alteration]{{components=V,S}}{{time=[[5]]}}{{range=[[0]]}}{{duration=Special}}{{aoe=The caster}}{{save=None}}{{reference=PHB p208}}SpellData=[w:Withdraw,lv:2,sp:5,gp:0,cs:VS,sph:Protection]{{effects=In effect alters the flow of time with regard to the caster. While but one round of time passes for those not affected by the spell, the priest is able to spend two rounds, plus one round per level = [[2+@{selected|Casting-Level}]], in contemplation.}}'},
+ {name:'Wither',type:'Innate-Melee|PRspellL7',ct:'1',charge:'uncharged',cost:'0.1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nWither\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Necromancy (Reversable)}}{{sphere=Necromantic}}Specs=[Wither,Innate-Melee|PRspellL7,1H,Necromancy]{{components=V,S,M}}{{range=Touch attack}}{{time=[[1]] round}}{{duration=Permanent}}{{aoe=Creature Touched}}ToHitData=[w:Wither,sp:1,sb:0,ty:SPB,r:5,touch:1,msg:A successful hit withers the member or organ touched ceasing to function in 1 round and dropping off into dust in \\lbrak;2d4 turns\\rbrak;\\lpar;!rounds ~~target single\\vbar;\\at;{selected\\vbar;token_id}\\vbar;\\amp#64;{target\\vbar;Who\'s member will wither?\\vbar;token_id}\\vbar;Wither\\vbar;\\amp#91;\\lbrak;10*2d4\\rbrak;\\amp#93;\\vbar;-1\\vbar;Touched limb / member / organ is withering and turning to dust\\vbar;back-pain\\rpar;]{{save=None}}DmgData=[w:Wither,sb:0,SM:0,L:0,msg:A successful hit withers the member or organ touched ceasing to function in 1 round and dropping off into dust in \\lbrak;2d4 turns\\rbrak;\\lpar;!rounds ~~target single\\vbar;\\at;{selected\\vbar;token_id}\\vbar;\\amp#64;{target\\vbar;Who\'s member will wither?\\vbar;token_id}\\vbar;Wither\\vbar;\\amp#91;\\lbrak;10*2d4\\rbrak;\\amp#93;\\vbar;-1\\vbar;Touched limb / member / organ is withering and turning to dust\\vbar;back-pain\\rpar;]{{reference=PHB p234}}SpellData=[w:Wither,lv:7,sp:1,gp:0.1,cs:VSM,sph:Necromantic]{{Use=Take the spell in-hand when casting, and attack with it. Called shots attract penalties to hit.}}{{effects=Causes the member or organ touched to cease functioning in one round, dropping off into dust in 2d4 turns. Creatures must be touched for the harmful effect to occur.}}{{materials=A prayer device and unholy water}}'},
{name:'Word-of-Recall',type:'PRspellL6',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nWord of Recall\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 6 Priest}}{{school=Alteration}}{{sphere=Summoning}}Specs=[Word of Recall,PRspellL6,0H,Alteration]{{components=V}}{{range=[[0]]}}{{time=[[1]]}}{{duration=Special}}{{aoe=The caster}}{{save=None}}{{reference=PHB p230}}SpellData=[w:Word of Recall,lv:6,sp:1,gp:0,cs:V,sph:Summoning]{{effects=Takes the priest instantly back to his sanctuary when the word is uttered.}}'},
{name:'Wyvern-Watch',type:'PRspellL2',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nWyvern Watch\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 2 Priest}}{{school=Evocation}}{{sphere=Guardian}}Specs=[Wyvern-Watch,PRspellL2,1H,Evocation]{{components=V,S,M}}{{time=[[5]]}}{{range=[[30]] yards}}{{duration=[[8]] hours or until strike}}{{aoe=[10ft radius sphere](!rounds --aoe @{selected|token_id}|circle|feet|90|20||magic)}}{{save=Negates}}{{reference=PHB p208}}SpellData=[w:Wyvern-Watch,lv:2,sp:5,gp:0,cs:VSM,sph:Guardian]{{effects=Creates an insubstantial haze. Used to guard an area. Any creature approaching within [[10]]ft of area must make a save vs spell or be paralysed for [[@{selected|Casting-Level}]] rounds.}}{{materials=Requires the Priest\'s holy symbol.}}'},
- {name:'Destruction',type:'Innate-Melee|PRspellL7',ct:'1',charge:'uncharged',cost:'0.1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nDestruction\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Necromancy (Reversable)}}{{sphere=Necromantic}}Specs=[Destruction,Innate-Melee|PRspellL7,1H,Necromancy]{{components=V,S,M}}ToHitData=[w:Destruction,sb:0,r:5,ty:SPB,sp:1,touch:1,msg:A successful hit will require the victim to make a saving throw vs. death magic at a -4 penalty or be turned to dust. Successfully saving still does damage]{{range=Touch}}DmgData=[w:Destruction,sb:0,SM:8d6,L:8d6,msg:A successful hit will require the victim to make a saving throw vs. death magic at a -4 penalty or be turned to dust. Successfully saving still does damage]{{time=[[1]] turn}}{{duration=Permanent}}{{aoe=1 Creature}}{{save=vs. death magic at -4 penalty}}{{reference=PHB p235}}SpellData=[w:Destruction,lv:7,sp:1,gp:0.1,cs:VSM,sph:Necromantic]{{Use=Take the spell in-hand when cast using the *change weapon* dialog, then attack the target. On a successful hit, the target should make a saving throw vs. death magic with a -4 penalty or be utterly destroyed. Successfully saving still takes 8d6 damage}}{{effects=*Destruction* causes the victim of the spell to be instantly dead and turned to dust. A wish spell or equivalent is required for recovery. Destruction requires a touch, either in combat or otherwise, and does not age the caster. In addition, the victim is allowed a saving throw (with a -4 penalty). If the save is successful, the victim receives [8d6](!\\amp#13;\\amp#47;gr 8d6) points of damage instead.}}{{materials=A prayer device and unholy water}}'},
- {name:'Energy-Drain',type:'Innate-Melee|PRspellL7',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nEnergy Drain\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Necromancy (Reversable)}}{{sphere=Necromantic}}Specs=[Energy Drain,Innate-Melee|PRspellL7,1H,Necromancy]{{components=V,S}}ToHitData=[w:Energy Drain,sb:0,r:5,ty:SPB,sp:1,touch:1,msg:A successful hit will \\lbrak;drain\\rbrak;\\lpar;!magic ~~level-change \\amp#64;{target\\vbar;Who will be Drained?\\vbar;token_id}\\vbar;-1\\rpar; the victim of 1 life energy level]{{range=Touch}}DmgData=[w:Energy Drain,sb:0,SM:0,L:0,msg:A successful hit will \\lbrak;drain\\rbrak;\\lpar;!magic ~~level-change \\amp#64;{target\\vbar;Who will be Drained?\\vbar;token_id}\\vbar;-1\\rpar; the victim of 1 life energy level]{{time=[[3]] rounds}}{{duration=Permanent}}{{aoe=1 Creature}}{{save=None}}{{reference=PHB p235}}SpellData=[w:Energy Drain,lv:7,sp:30,gp:0,cs:VS,sph:Necromantic]{{Use=Take the spell in-hand when cast using the *change weapon* dialog, then attack the target. On a successful hit, use the *drain* button displayed (if dual- or multi-classed will ask it\'s desired class to drain)}}{{effects=*Energy drain* draws away one life energy level (see such undead as spectre, wight, and vampire, in the Monstrous Manual). The energy drain requires the victim to be touched. Casting this form of the spell does not age the caster.}}'},
- {name:'Regenerate',type:'PRspellL7',ct:'30',charge:'uncharged',cost:'0.1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nRegenerate\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Necromancy (Reversable)}}{{sphere=Necromantic}}Specs=[Regenerate,PRspellL7,1H,Necromancy]{{components=V,S,M}}{{range=Touch}}{{time=[[3]] rounds}}{{duration=Permanent}}{{aoe=Creature Touched}}{{save=None}}{{reference=PHB p234}}SpellData=[w:Regenerate,lv:7,sp:30,gp:0.1,cs:VSM,sph:Necromantic]{{Use=Select the relevant button in the description and then select the token that is regenerating lost limbs}}{{effects=Body members (fingers, toes, hands, feet, arms, legs, tails, or even heads of multi-headed creatues), bones, and organs grow back. The process of regeneration requies but one round if the severed member(s) is (are) [present](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who will regenerate limbs?|token_id}|Regenerate|1|-1|Regenerating / reattaching severed parts|aura) and touching the creature, 2d4 turns [otherwise](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who will regenerate limbs?|token_id}|Regenerate|\\amp#91;[2d4]\\amp#93;|-1|Regenerating severed parts|aura). The creature must be lving to receive the benefits of this spell. If the severed member is not present, or if the injury is older than one day per caster level, the recipient must roll a successful system shock check to survive the spell.}}{{materials=A prayer device and holy water}}'},
- {name:'Reincarnate',type:'PRspellL7',ct:'100',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nReincarnate\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Necromancy}}{{sphere=Necromantic}}Specs=[Reincarnate,PRspellL7,1H,Necromancy]{{components=V,S}}{{range=Touch}}{{time=[[1]] turn}}{{duration=Permanent}}{{aoe=1 person}}{{save=None}}{{reference=PHB p234}}SpellData=[w:Reincarnate,lv:7,sp:100,gp:0,cs:VS,sph:Necromantic]{{effects=Brings back a dead person in another body, if death occurred no more than one week before the casting of the spell. Reincarnation does not require any saving throw, system shock, or resurrection survival roll.\nThe new incarnation is determined on the following table or by DM choice. At the DM\'s option, certain special (expensive) incenses can be used that may increase the chance for a character to return as a specific race or species.\n\\amplt;table\\ampgt;\\amplt;tr\\ampgt;\\amplt;th scope="col"\\ampgt;D100 Roll\\amplt;/th\\ampgt;\\amplt;th scope="col"\\ampgt;Incarnation\\amplt;/th\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;01-03\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Badger\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;04-08\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Bear, Black\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;09-12\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Bear, Brown\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;13-16\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Boar, Wild\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;17-19\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Centaur\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;20-23\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Dryad\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;24-28\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Eagle\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;29-31\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Elf\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;32-34\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Faub/Satyr\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;35-36\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Fox\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;37-40\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Gnome\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;41-44\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Hawk\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;45-58\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Human\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;59-61\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Lynx\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;62-64\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Owl\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;65-68\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Pixie\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;69-70\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Raccoon\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;71-75\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Stag\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;76-80\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Wolf\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;81-85\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Wolverine\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;86-00\\amplt;/td\\ampgt;\\amplt;td\\ampgt;DM\'s choice\\amplt;/td\\ampgt;\\amplt;/tr\\ampgt;\\amplt;/table\\ampgt;\nSee PHB p234 for full details}}'},
- {name:'Restoration',type:'PRspellL7',ct:'30',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nRestoration\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Necromancy (Reversable)}}{{sphere=Necromantic}}Specs=[Restoration,PRspellL7,1H,Necromancy]{{components=V,S}}{{range=Touch}}{{time=[[3]] rounds}}{{duration=Permanent}}{{aoe=[1 Creature](!magic --level-change \\amp#64;{target|Who will be Restored?|token_id}|+1)}}{{save=None}}{{reference=PHB p235}}SpellData=[w:Restoration,lv:7,sp:30,gp:0,cs:VS,sph:Necromantic]{{Use=Select the +area of effect* button above and then select the token of the creature to be restored to raise it by 1 level (if dual- or multi-classed will ask it\'s desired class)}}{{effects=The life energy level of the recipient creature is raised by one. This reverses any previous life energy level drain of the creature by a force or monster. Thus, if a 10th-level character had been struck by a wight and drained to 9th level, the *restoration* spell would bring the character up to exactly the number of experience points necessary to restore him to 10th level once again, restoring additional Hit Dice (or hit points) and level functions accordingly. Restoration is effective only if the spell is cast within one day of the recipient\'s loss of life energy, per experience level of the priest casting it. A *restoration* spell restores the intelligence of a creature affected by a *feeblemind* spell. It also negates all forms of insanity. Casting this spell ages both the caster and the recipient by two years.}}'},
- {name:'Resurrection',type:'PRspellL7',ct:'100',charge:'uncharged',cost:'0.1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nResurrection\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Necromancy (Reversable)}}{{sphere=Necromantic}}Specs=[Resurrection,PRspellL7,1H,Necromancy]{{components=V,S,M}}{{range=Touch}}{{time=[[1]] turn}}{{duration=Permanent}}{{aoe=1 Creature}}{{save=None}}{{reference=PHB p235}}SpellData=[w:Resurrection,lv:7,sp:100,gp:0.1,cs:VSM,sph:Necromantic]{{effects=The priest is able to restore life and complete strength to any living creature, including elves, by bestowing the resurrection spell. The creature can have been dead up to 10 years per level of the priest casting the spell. Thus, a 19th-level priest can resurrect the bones of a creature dead up to 190 years. The creature, upon surviving a resurrection survival check, is immediately restored to full hit points and can perform strenuous activity. The spell cannot bring back a creature that has reached its allotted life span (i.e., died of natural causes). Casting this spell makes it impossible for the priest to cast further spells or engage in combat until he has had one day of bed rest for each experience level or Hit Die of the creature brought back to life. The caster ages three years upon casting this spell.}}{{materials=A prayer device and holy water}}'},
- {name:'Reverse-Succor',type:'PRspellL7',ct:'10',charge:'uncharged',cost:'4000',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nSuccor (Reversed)\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Alteration / Enchantment (Reversable)}}{{sphere=Summoning}}Specs=[Reverse Succor,PRspellL7,1H,Alteration|Enchantment]{{components=V,S,M}}{{range=Touch}}{{time=[[1]] day}}{{duration=Special}}{{aoe=1 person}}{{save=None}}{{reference=PHB p235}}SpellData=[w:Reverse Succor,lv:7,sp:10,gp:4000,cs:VSM,sph:Summoning]{{effects=By casting this spell, the priest creates a powerful magic aura in some specially prepared object--a string of prayer beads, a small clay tablet, an ivory baton, etc. This object radiates magic, for it contains the power to instantaneously transport the priest who created it from their sanctuary to the immediate vicinity of the possessor of the item when it is broken and the command word said. The priest has a general idea of the location and situation of the item\'s possessor, and can choose not to be affected by this summons. This decision is made at the instant when the transportation is to take place. However, if he chooses not to go, the opportunity is gone forever and the spell is wasted.\nNote that the same factors that can prevent the operation of the plane shift and teleport spells can also prevent the use of this spell.}}{{materials=The cost of preparing the special item (for either version of the spell) varies from 2,000 to 5,000 gp. The more costly items can transport the subject from one plane of existence to another, if the DM allows.}}'},
- {name:'Succor',type:'PRspellL7',ct:'10',charge:'uncharged',cost:'4000',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nSuccor\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Alteration / Enchantment (Reversable)}}{{sphere=Summoning}}Specs=[Succor,PRspellL7,1H,Alteration|Enchantment]{{components=V,S,M}}{{range=Touch}}{{time=[[1]] day}}{{duration=Special}}{{aoe=1 person}}{{save=None}}{{reference=PHB p235}}SpellData=[w:Succor,lv:7,sp:10,gp:4000,cs:VSM,sph:Summoning]{{effects=By casting this spell, the priest creates a powerful magic aura in some specially prepared object--a string of prayer beads, a small clay tablet, an ivory baton, etc. This object radiates magic, for it contains the power to instantaneously transport its possessor to the sanctuary of the priest who created its magic. Once the item is enchanted, the priest must give it willingly to an individual, at the same time informing him of a command word to be spoken when the item is to be used. To make use of the item, the recipient must speak the command word at the same time that he rends or breaks the item. When this is done, the individual and all that he is wearing and carrying (up to the maximum encumbrance limit for the character) are instantly transported to the sanctuary of the priest, just as if the individual were capable of speaking a *word of recall* spell. No other creatures can be affected.\nNote that the same factors that can prevent the operation of the plane shift and teleport spells can also prevent the use of this spell.}}{{materials=The cost of preparing the special item (for either version of the spell) varies from 2,000 to 5,000 gp. The more costly items can transport the subject from one plane of existence to another, if the DM allows.}}'},
- {name:'Sunray',type:'PRspellL7',ct:'4',charge:'uncharged',cost:'1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nSunray\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Evocation / Alteration}}{{sphere=Sun}}Specs=[Sunray,PRspellL7,1H,Evocation|Alteration]{{components=V,S,M}}{{range=[[10*@{selected|pr-casting-level} yds.}}{{time=[[4]]}}{{duration=1+1d4 rounds}}{{aoe=[5 ft. radius](!rounds --aoe @{selected|token_id}|circle|feet|[[10*@{selected|pr-casting-level}]]|10|10|light) (special)}}{{save=Special}}{{reference=PHB p235}}SpellData=[w:Sunray,lv:7,sp:4,gp:1,cs:VSM,sph:Sun]{{Use=Select the *area of effect* button above and indicate where the beam will illuminate. Then apply the effects as described using the buttons to roll dice as relevant.}}{{effects=With this spell, the caster can evoke a dazzling beam of light each round in which they take no action other than movement. The sunray is like a ray of natural sunlight. All creatures in the 10-foot-diameter area of effect must roll successful saving throws vs. spell or be blinded for [1d3 rounds](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Which creatures with normal vision are blinded?|token_id}|blinded|\\amp#91;[10*1d3]\\amp#93;|-10|Blinded by intense sunray. Attack and AC at -4 penalty|bleeding-eye), those using infravision at the time for [2d4 rounds](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Which creatures using infravision are blinded?|token_id}|blinded|\\amp#91;[10*2d4]\\amp#93;|-10|Blinded by intense sunray. Attack and AC at -4 penalty|bleeding-eye). Creatures to whom sunlight is harmful or unnatural suffer [permanent blindness](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Which creatures that failed their save are permanently blinded?|token_id}|blinded|99|0|Blinded by intense sunray. Attack and AC at -4 penalty|bleeding-eye) if the saving throw is failed, and are blinded for [2d6 rounds](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Which creatures to whom sunlight is unnatural are blinded?|token_id}|blinded|\\amp#91;[10*2d6]\\amp#93;|-10|Blinded by intense sunray. Attack and AC at -4 penalty|bleeding-eye) if the saving throw is successful. Those within its area of effect, as well as creatures within 20 feet of its perimeter, lose any infravision capabilities for [1d4+1 rounds](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Which creatures with infravision cannot now use it?|token_id}|Sunray|\\amp#91;[10*(1d4+1)]\\amp#93;|-10|Blinded by intense sunray. Cannot use infravision again yet|interdiction).\nUndead caught within the sunray\'s area of effect receive [8d6 points](!\\amp#13;\\amp#47;gr 8d6) of damage, one half if a saving throw vs. spell is successful. Those undead 20 feet to either side of the sunray\'s area of effect receive [3d6 points](!\\amp#13;\\amp#47;gr 3d6) of damage, no damage if a save is successful. In addition, the ray may result in the total destruction of those undead specifically affected by sunlight, if their saving throws are failed. \nThe ultraviolet light generated by the spell inflicts damage on fungoid creatures and subterranean fungi just as if they were undead, but no saving throw is allowed.}}{{materials=A prayer device and holy water}}'},
- {name:'Symbol',type:'PRspellL7',ct:'3',charge:'uncharged',cost:'10',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nSymbol\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Conjuration Summoning}}{{sphere=Guardian}}Specs=[Symbol,PRspellL7,1H,Conjuration-Summoning]{{components=V,S,M}}{{range=Touch}}{{time=[[3]]}}{{duration=[[@{selected|pr-casting-level}]] turns}}{{aoe=60ft radius}}{{save=Negates}}{{reference=PHB p236}}SpellData=[w:Symbol,lv:7,sp:3,gp:10,cs:VSM,sph:Guardian]{{GM info=Cast this spell then\n1. Create a new Character Sheet and name it after the selected Symbol\n2. Drag the Symbol character sheet onto the map to drop a token where you want the symbol to be\n3. Use the Race/Class/Creature dialog, creature dropdown to make the token a creature: Symbol of Hopelessness, of Pain, or of Pursuasion\n4. [Mark the symbol](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Which is the symbol of Hopelessness?|token_id}|Symbol|@{selected|pr-casting-level}|-1|This is the symbol of hopelessness|lightning-helix) with it\'s duration by pressing this button and selecting the newly dropped symbol.\n5. When creatures view this token from less than 60ft away, use the powers on the symbol token to affect the viewing creature}}{{Use=Ask the GM to drop a symbol token onto the map for you by following the GM info instructions}}{{effects=The priest casting this spell inscribes a glowing symbol in the air upon any surface, according to his desire. Any creature looking at the completed symbol within 60 feet must roll a successful saving throw vs. spell or suffer the effect. The symbol glows for one turn for each experience level of the caster. The particular symbol used is selected by the caster at the time of casting. The caster will not be affected by his own symbol. One of the following effects is chosen by the caster:\n**Hopelessness:** Creatures seeing it must turn back in dejection or surrender to capture or attack unless they roll successful saving throws vs. spell. Its effects last for 3d4 turns.\n**Pain:** Creatures affected suffer -4 penalties to their attack rolls and -2 penalties to their Dexterity ability scores due to wracking pains. The effects last for 2d10 turns.\n**Persuasion:** Creatures seeing the symbol become of the same alignment as and friendly to the priest who scribed the symbol for 1d20 turns unless a saving throw vs. spell is successful.}}{{materials=The material components of this spell are mercury and phosphorous (see 8th-level wizard spell, *symbol*).}}'},
- {name:'Transmute-Metal-to-Wood',type:'PRspellL7',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nTransmute Metal to Wood\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Alteration}}{{sphere=Elemental (Earth)}}Specs=[Transmute Metal to Wood,PRspellL7,1H,Alteration]{{components=V,S,M}}{{range=80 yds.}}{{time=[[1]] round}}{{duration=Permanent}}{{aoe=1 metal object of up to [[10*@{selected|pr-casting-level}]]lbs.}}{{save=Special}}{{reference=PHB p236}}SpellData=[w:Transmute Metal to Wood,lv:7,sp:10,gp:0,cs:VSM,sph:Elemental-Earth]{{effects=The *transmute metal to wood* spell enables the caster to change an object from metal to wood. The volume of metal cannot exceed a maximum weight of 10 pounds per experience level of the priest. Magical objects made of metal are 90% resistant to the spell, and those on the person of a creature receive the creature\'s saving throw as well. Artifacts and relics cannot be transmuted. Note that only a *wish* spell or similar magic can restore a transmuted object to its metallic state. Otherwise, for example, a metal door changed to wood would be forevermore a wooden door.}}{{materials=A metal object to transmute}}'},
- {name:'Wind-Walk',type:'PRspellL7',ct:'10',charge:'uncharged',cost:'0.1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nWind Walk\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Alteration}}{{sphere=Elemental (Air)}}Specs=[Wind Walk,PRspellL7,1H,Alteration]{{components=V,S,M}}{{range=Touch}}{{time=[[1]] round}}{{duration=[1 hour/level](!rounds --target caster|@{selected|token_id}|Wind-Walk|99|0|Wind walking - only hit by magic or magical weaponry|fluffy-wing --target area|@{selected|token_id}|\\amp#64;{target|Who is Wind Walking with the caster?|token_id}|Wind-Walk|99|0|Wind walking - only hit by magic or magical weaponry|fluffy-wing)}}{{aoe=Caster + 1 person/8 levels}}{{save=None}}{{reference=PHB p236}}SpellData=[w:Wind Walk,lv:7,sp:10,gp:0.1,cs:VSM,sph:Elemental-Air]{{effects=This spell enables the priest (and possibly one or two other persons) to alter the substance of his body to a cloudlike vapor. A magical wind then wafts the priest along at a movement rate of 60, or as slow as 6, as the spellcaster wills. The wind walk spell lasts as long as the priest desires, up to a maximum duration of six turns (one hour) per experience level of the caster. For every eight levels of experience the priest has attained, up to 24, he is able to touch another person and carry that person, or those persons, along on the wind walk. Persons wind walking are not invisible, but rather appear misty and translucent. If fully clothed in white, they are 80% likely to be mistaken for clouds, fog, vapors, etc. The priest can regain his physical form as desired, each change to and from vaporous form requiring five rounds. While in vaporous form, the priest and companions are hit only by magic or magical weaponry, though they may be subject to high winds at the DM\'s discretion. No spellcasting is possible in vaporous form.}}{{materials=Fire and holy water.}}'},
- {name:'Wither',type:'Innate-Melee|PRspellL7',ct:'1',charge:'uncharged',cost:'0.1',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nWither\nas a level @{selected|Casting-Level} caster}}{{splevel=Level 7 Priest}}{{school=Necromancy (Reversable)}}{{sphere=Necromantic}}Specs=[Wither,Innate-Melee|PRspellL7,1H,Necromancy]{{components=V,S,M}}{{range=Touch attack}}{{time=[[1]] round}}{{duration=Permanent}}{{aoe=Creature Touched}}ToHitData=[w:Wither,sp:1,sb:0,ty:SPB,r:5,touch:1,msg:A successful hit withers the member or organ touched ceasing to function in 1 round and dropping off into dust in \\lbrak;2d4 turns\\rbrak;\\lpar;!rounds ~~target single\\vbar;\\at;{selected\\vbar;token_id}\\vbar;\\amp#64;{target\\vbar;Who\'s member will wither?\\vbar;token_id}\\vbar;Wither\\vbar;\\amp#91;\\lbrak;10*2d4\\rbrak;\\amp#93;\\vbar;-1\\vbar;Touched limb / member / organ is withering and turning to dust\\vbar;back-pain\\rpar;]{{save=None}}DmgData=[w:Wither,sb:0,SM:0,L:0,msg:A successful hit withers the member or organ touched ceasing to function in 1 round and dropping off into dust in \\lbrak;2d4 turns\\rbrak;\\lpar;!rounds ~~target single\\vbar;\\at;{selected\\vbar;token_id}\\vbar;\\amp#64;{target\\vbar;Who\'s member will wither?\\vbar;token_id}\\vbar;Wither\\vbar;\\amp#91;\\lbrak;10*2d4\\rbrak;\\amp#93;\\vbar;-1\\vbar;Touched limb / member / organ is withering and turning to dust\\vbar;back-pain\\rpar;]{{reference=PHB p234}}SpellData=[w:Wither,lv:7,sp:1,gp:0.1,cs:VSM,sph:Necromantic]{{Use=Take the spell in-hand when casting, and attack with it. Called shots attract penalties to hit.}}{{effects=Causes the member or organ touched to cease functioning in one round, dropping off into dust in 2d4 turns. Creatures must be touched for the harmful effect to occur.}}{{materials=A prayer device and unholy water}}'},
]},
- Powers_DB: {bio:'Powers Database v6.29 20/07/2023
This database holds the definitions and API calls to enact Character, NPC & Monster Powers. Powers can be memorised and, unlike spells, can be specified for use more than once a day or even at will. If all daily uses are used, they can be refreshed on a long rest (short rests have no effect). Characters, NPCs and Monsters can learn, memorise and use these spells via the abilities, menus and commands of the MagicMaster API
Important Note: most of the spell macros require a Roll20 Pro membership, and the installation of the ChatSetAttr, TokenMod, MagicMaster and RoundMaster API Scripts, to allow parameter passing between macros, update of character sheet variables, and marking spell effects on tokens. If you do not have this level of subscription, I highly recommend you get it as a DM, as you get lots of other goodies as well. If you want to know how to load the API Scripts to your game, the RoLL20 API help here gives guidance, or Richard can help you.
Instructions
In order to understand the format of spell macros in this database and how to change or add to them, please refer to the MagicMaster API documentation.',
- gmnotes:'Change Log: v6.29 20/07/2023 Added powers for Jewels and Necklaces v6.28 07/07/2023 Added powers for Djinn & Rakshasa, and the Symbol spell v6.27 08/06/2023 Corrected Staff of Curing: Cure Blindness as a power v6.26 21/05/2023 One new power associated with the Helm of Teleportation v6.25 30/04/2023 Added powers to support added miscellaneous items v6.24 31/01/2023 Added powers to support new magic items v6.17-22 16/12/2022 Additional powers to support Creatures database v6.16 25/11/2022 Added powers to support the Creatures database v6.15 14/11/2022 Added Race powers in support of the Race Database. v6.11 12/10/2022 Added Detect Illusions v6.10 25/09/2022 Moved to RPGM Library and updated templates v6.03 14/07/2022 Removed hard-coded whisper commands on database entries as now directed to correct player(s) programmatically v6.02 23/06/2022 Added powers for Shaman v6.01 11/05/2022 Added powers for the Priest-of-the-Sea standard Priest class v5.9 06/04/2022 Adapted to use --display-ability command for chaining abilities v5.8 23/02/2022 Added a number of Powers from *The Complete Priest\'s Handbook v5.7 04/02/2022 Added "End Effect" buttons to "Rage" power v5.6 01/01/2022 Updated to common release version v5.4 - 5.5 Skipped to even up version numbers v5.3 07/12/2021 Added turning dice roll to *Turn Undead* power v5.2 29/11/2021 Swapped PR-Light to Light-PR for more intuitive listing, and did same for similar powers v5.1 31/10/2021 Added Powers for monsters from "The Undiscovered Caverns" v5.0 31/10/2021 Encoded using machine readable data to support API databases v4.6.5 04/09/2021 Added powers for WPM Undiscovered Caverns v4.6.4 15/07/2021 Expanded Manticore Tail Spikes to not need character sheet macros v4.6.3 11/06/2021 Added powers for Ghosts of Saltmarsh v4.6.2 01/05/2021 Extensive bug checking & fixing v4.6.1 14/04/2021 Added Spiritual Hammer and Prayer as powers for a Priest of War v4.6 28/03/2021 Edited all macros to use the MagicMaster API for targeting and charges v4.5.3 26/03/2021 Added regeneration every turn capability to Regenerate power (in addition to ability for each use of the power). v4.5.2 14/03/2021 Changed cost for using Command power to 0GP v4.5.1 09/03/2021 Added the missing \'ct--\' required for removing Powers to set the speed & cost for a \'-\' v4.5 27/02/2021 Changed calls to @{Powers|Use-Another-Charge} to use the MagicMaster API call instead v4.4.4 14/02/2021 Changed all !setattr --sel parameters to be --charid instead, so they can work more easily with the MagicMaster API. v4.4.3 04/02/2021 Added fear power for mummies, and corrected some targeting bugs v4.4.2 19/01/2021 Added Priest of Life class spells as powers. v4.4.1 17/12/2020 Added in missing Spectral Hand power v4.4 22/11/2020 Separated out mu-casting-level and pr-casting-level (casting-level also retained for backwards compatibility). This is needed as casters with dual MU/PR class may cast some powers at different levels. v4.3 17/11/2020 Split off the mechanics of the Powers execution into the Powers library. leaving the Power description macros here. v4.2 09/11/2020 Added special menus for adding and managing Magic Item powers v4.1 01/11/2020 Added NWP Healing as a power: requires the new feature of multiple use decrementing the power uses. v4.0 29/10/2020 Same as v3.4.1 just aligning version numbers with v4 macro library release v3.4.1 29/10/2020 Fixed bug with initialising sheet variables v3.4 20/10/2020 Updated to support Lost & Found campaign v3.3.1 12/10/2020 Updated Long Rests to set ammo maximums to ammo remaining, to reflect that any not recovered when you rest are lost v3.3 06/10/2020 Added thieving abilities as powers (mainly to add markers), linked Long Rests to the DMs "End of Day" routine, and added a rest selection for non-spell users that restores Powers & recharging MIs v3.2 22/09/2020 Updated to use new lag detection and selection control mechanisms v3.1 03/09/2020 Added all powers for Arc and Hubert v3.0 01/09/2020 Initial Release v1-v2 Skipped these versions to bring in line with release numbers for other macro libraries v0.1 26/08/2020 Initial Creation',
+ Powers_DB: {bio:'Powers Database v6.30 29/09/2023
This database holds the definitions and API calls to enact Character, NPC & Monster Powers. Powers can be memorised and, unlike spells, can be specified for use more than once a day or even at will. If all daily uses are used, they can be refreshed on a long rest (short rests have no effect). Characters, NPCs and Monsters can learn, memorise and use these spells via the abilities, menus and commands of the MagicMaster API
Important Note: most of the spell macros require a Roll20 Pro membership, and the installation of the ChatSetAttr, TokenMod, MagicMaster and RoundMaster API Scripts, to allow parameter passing between macros, update of character sheet variables, and marking spell effects on tokens. If you do not have this level of subscription, I highly recommend you get it as a DM, as you get lots of other goodies as well. If you want to know how to load the API Scripts to your game, the RoLL20 API help here gives guidance, or Richard can help you.
Instructions
In order to understand the format of spell macros in this database and how to change or add to them, please refer to the MagicMaster API documentation.',
+ gmnotes:'Change Log: v6.30 29/09/2023 Added powers for Chromatic & Metalic Dragons, & Hell Hound breath v6.29 20/07/2023 Added powers for Jewels and Necklaces v6.28 07/07/2023 Added powers for Djinn & Rakshasa, and the Symbol spell v6.27 08/06/2023 Corrected Staff of Curing: Cure Blindness as a power v6.26 21/05/2023 One new power associated with the Helm of Teleportation v6.25 30/04/2023 Added powers to support added miscellaneous items v6.24 31/01/2023 Added powers to support new magic items v6.17-22 16/12/2022 Additional powers to support Creatures database v6.16 25/11/2022 Added powers to support the Creatures database v6.15 14/11/2022 Added Race powers in support of the Race Database. v6.11 12/10/2022 Added Detect Illusions v6.10 25/09/2022 Moved to RPGM Library and updated templates v6.03 14/07/2022 Removed hard-coded whisper commands on database entries as now directed to correct player(s) programmatically v6.02 23/06/2022 Added powers for Shaman v6.01 11/05/2022 Added powers for the Priest-of-the-Sea standard Priest class v5.9 06/04/2022 Adapted to use --display-ability command for chaining abilities v5.8 23/02/2022 Added a number of Powers from *The Complete Priest\'s Handbook v5.7 04/02/2022 Added "End Effect" buttons to "Rage" power v5.6 01/01/2022 Updated to common release version v5.4 - 5.5 Skipped to even up version numbers v5.3 07/12/2021 Added turning dice roll to *Turn Undead* power v5.2 29/11/2021 Swapped PR-Light to Light-PR for more intuitive listing, and did same for similar powers v5.1 31/10/2021 Added Powers for monsters from "The Undiscovered Caverns" v5.0 31/10/2021 Encoded using machine readable data to support API databases v4.6.5 04/09/2021 Added powers for WPM Undiscovered Caverns v4.6.4 15/07/2021 Expanded Manticore Tail Spikes to not need character sheet macros v4.6.3 11/06/2021 Added powers for Ghosts of Saltmarsh v4.6.2 01/05/2021 Extensive bug checking & fixing v4.6.1 14/04/2021 Added Spiritual Hammer and Prayer as powers for a Priest of War v4.6 28/03/2021 Edited all macros to use the MagicMaster API for targeting and charges v4.5.3 26/03/2021 Added regeneration every turn capability to Regenerate power (in addition to ability for each use of the power). v4.5.2 14/03/2021 Changed cost for using Command power to 0GP v4.5.1 09/03/2021 Added the missing \'ct--\' required for removing Powers to set the speed & cost for a \'-\' v4.5 27/02/2021 Changed calls to @{Powers|Use-Another-Charge} to use the MagicMaster API call instead v4.4.4 14/02/2021 Changed all !setattr --sel parameters to be --charid instead, so they can work more easily with the MagicMaster API. v4.4.3 04/02/2021 Added fear power for mummies, and corrected some targeting bugs v4.4.2 19/01/2021 Added Priest of Life class spells as powers. v4.4.1 17/12/2020 Added in missing Spectral Hand power v4.4 22/11/2020 Separated out mu-casting-level and pr-casting-level (casting-level also retained for backwards compatibility). This is needed as casters with dual MU/PR class may cast some powers at different levels. v4.3 17/11/2020 Split off the mechanics of the Powers execution into the Powers library. leaving the Power description macros here. v4.2 09/11/2020 Added special menus for adding and managing Magic Item powers v4.1 01/11/2020 Added NWP Healing as a power: requires the new feature of multiple use decrementing the power uses. v4.0 29/10/2020 Same as v3.4.1 just aligning version numbers with v4 macro library release v3.4.1 29/10/2020 Fixed bug with initialising sheet variables v3.4 20/10/2020 Updated to support Lost & Found campaign v3.3.1 12/10/2020 Updated Long Rests to set ammo maximums to ammo remaining, to reflect that any not recovered when you rest are lost v3.3 06/10/2020 Added thieving abilities as powers (mainly to add markers), linked Long Rests to the DMs "End of Day" routine, and added a rest selection for non-spell users that restores Powers & recharging MIs v3.2 22/09/2020 Updated to use new lag detection and selection control mechanisms v3.1 03/09/2020 Added all powers for Arc and Hubert v3.0 01/09/2020 Initial Release v1-v2 Skipped these versions to bring in line with release numbers for other macro libraries v0.1 26/08/2020 Initial Creation',
root:'Powers-DB',
api:'magic',
type:'spells',
controlledby:'all',
avatar:'https://s3.amazonaws.com/files.d20.io/images/3077760/Vg6r8vmy8ANNrCZHGtul2w/thumb.png?1392175066',
- version:6.29,
+ version:6.30,
db:[{name:'-',type:'',ct:'0',charge:'uncharged',cost:'0',body:'@{selected|token_name} suddenly realises he is powerless! Choose another power instead.'},
{name:'AE-Aerial-Combat',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Air Elemental Aerial Combat}}Specs=[AE Aerial Combat,Power,0H,Innate Ability]{{Speed=[[0]]}}{{save=None}}{{Flying=[Start](!rounds --target caster|@{selected|token_id}|AE-Aerial-Combat|99|0|Gained +1 to hit and +4 damage bonus|fluffy-wing) or [Stop](!rounds --removetargetstatus @{selected|token_id}|AE-Aerial-Combat) Aerial Combat}}SpellData=[w:AE Aerial Combat,sp:0,cs:S,pd:-1]{{desc=Air elementals can be conjured in any area of open air where gusts of wind are present. The common air elemental appears as an amorphous, shifting cloud when it answers its summons to the Prime Material plane.}}{{desc1=**Combat:** While air elementals are not readily tangible to the inhabitants of planes other than its own, they can strike an opponent with a strong, focused blast of air that, like a giant, invisible fist, does 2-20 points of damage. The extremely rapid rate at which these creatures can move make them very useful on vast battlefields or in extended aerial combat. In fact, the air elemental\'s mastery of its natural element gives it a strong advantage in combat above the ground. In aerial battles, they gain a +1 to hit and a +4 to the damage they inflict.}}{{desc2=**Use:** Select the *Start Aerial Combat* button to change to aerial combat and get bonuses. When finished, *view* the Power again and use the *Stop Aerial Combat* button, or the DM can edit the status and remove it.}}'},
{name:'Analysis-Detection-Identification',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Analysis, Detection \\amp Identification}}Specs=[Analyse-Detect-Identify,Power,0H,Divination]{{Speed=[[10]]}}{{save=None}}{{Reference=*The Complete Priest\'s Handbook*, Designing Faiths}}SpellData=[w:Analyse-Detect-Identify,sp:10,pd:2]{{desc=Identify a category of persons, places, or things. The priest must be within 10\' of the object in order to identify it correctly; he does not have to see it, and the object can be hidden. In some cases, it could even be buried.\nIf the DM designs it as part of the ability, the priest can also analyze the object and get additional details about it. The type of information brought about by this analysis varies from object to object}}'},
@@ -3109,15 +3269,28 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Aquatic-Shapechange',type:'Power',ct:'9',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} uses\nAquatic Shape Change\nas a Power}}{{splevel=Power}}{{school=Alteration}}Specs=[Aquatic Shapechange,Power,1H,Alteration]{{components=V,S}}{{time=[[9]]}}{{range=[[0]]}}{{duration=[[[@{selected|casting-level}]] turns](!rounds --target caster|@{selected|token_id}|Shapechange-Power|[[10*@{selected|casting-level}]]|-1|Masqurading as a different natural aquatic creature|aura)}}{{aoe=The caster}}{{save=None}}{{reference=PHB p37}}SpellData=[w:Aquatic Shapechange,sp:9,cs:VS]{{effects=A Priest of the Sea (or other priest) gains the ability to shapechange into an aquatic animal up to one or three times per day (DMs discression) after they reach 8th level. Each animal form can be used only once per day. The type of marine animal is at the DMs discression (an option is to leave to player\'s choice). Upon assuming a new form, the priest heals 10-60% (1d6 x 10%) of all damage he has suffered (round fractions down). The priest can only assume the form of a normal (real world) animal in its normal proportions, but by doing so he takes on all of that creature\'s characteristics -- its movement rate and abilities, its Armor Class, number of attacks, and damage per attack.\nThe priest\'s clothing and one item held in each hand also become part of the new body; these reappear when the priest resumes his normal shape. The items cannot be used while the priest is in animal form.}}'},
{name:'Astral-Travel-5',type:'Power',ct:'9',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} is using\nAstral Travel (five)\nas a power as a level @{selected|casting-level} caster}}{{splevel=Level 9 Wizard}}{{school=Evocation}}Specs=[Astral Travel 5,Power,1H,Evocation]{{components=V,M}}{{time=9}}{{range=Caster}}{{duration=Special}}{{aoe=Self}}{{save=None}}{{reference=DMG p153}}SpellData=[w:Astral Travel 5,sp:9,cs:VM]{{effects=Unlike the spell *Astral Spell*, transfers five creatures\' including the caster\'s, *material body* into the Astral Plane, meaning they can travel materially through the Astral Plane and emerge elsewhere on the Material Plane. Of course, as the creatures material body actually becomes Astral, no silver thread remains joining the two as the two are one.}}'},
{name:'Astral-Travel-self',type:'Power',ct:'9',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} is using\nAstral Travel (self)\nas a power as a level @{selected|casting-level} caster}}{{splevel=Level 9 Wizard}}{{school=Evocation}}Specs=[Astral Travel self,Power,1H,Evocation]{{components=V,M}}{{time=9}}{{range=Caster}}{{duration=Special}}{{aoe=Self}}{{save=None}}{{reference=DMG p153}}SpellData=[w:Astral Travel self,sp:9,cs:VM]{{effects=Unlike the spell *Astral Spell*, transfers the caster\'s *material body* into the Astral Plane, meaning they can travel materially through the Astral Plane and emerge elsewhere on the Material Plane. Of course, as the caster\'s material body actually becomes Astral, no silver thread remains joining the two as the two are one.}}'},
+ {name:'Bead-of-Curing',type:'Power',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Bead of Curing**\non their *Necklace of Prayer Beads*}}Specs=[Bead of Curing,Power,1H,Necromancy]{{splevel=Necromancy}}{{School=Healing}}{{Speed=[[3]]}}{{Range=Touch}}{{Duration=Permanent}}{{Area of Effect=1 creature}}{{save=None}}{{reference=DMG p175}}SpellData=[w:Bead of Curing,sp:3,cs:M]{{desc=Once per day, cure [blindness](!magic --display-ability @{selected|token_id}|PR-Spells-DB|Cure-Blindness-or-Deafness), [disease](!magic --display-ability @{selected|token_id}|PR-Spells-DB|Cure-Disease), or [serious wounds](!magic --display-ability @{selected|token_id}|PR-Spells-DB|Cure-Serious-Wounds) (as the appropriate spells)}}'},
+ {name:'Bead-of-Karma',type:'Power',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Bead of Karma**\non their *Necklace of Prayer Beads*}}Specs=[Bead of Karma,Power,1H,Alteration]{{splevel=Alteration}}{{Sphere=All}}{{Speed=[[3]]}}{{Range=0}}{{Duration=1 spell}}{{Area of Effect=Caster}}{{save=None}}{{reference=DMG p175}}SpellData=[w:Bead of Karma,sp:3,cs:M]{{Use=In order to cast a spell 4 levels higher with respect to range, duration etc., the button in the description below must be used}}{{desc=Once per day, allows the priest to [cast a spell](!magic --cast-spell PR|@{selected|token_id}|[[@{selected|pr-casting-level}+4]]) as if they were four levels higher (with respect to range, duration, etc. - but not any spells of a higher level than the priest can normally cast)}}'},
+ {name:'Bead-of-Summons',type:'Power',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Bead of Summons**\non their *Necklace of Prayer Beads*}}Specs=[Bead of Summons,Power,1H,Summoning]{{splevel=Power}}{{Sphere=Summoning}}{{Speed=[[3]]}}{{Range=0}}{{Duration=Special}}{{Area of Effect=1 deity}}{{save=None}}{{reference=DMG p175}}SpellData=[w:Bead of Summoning,sp:3,cs:M]{{GM info=If the priest summons his deity frivolously, the deity will, at the very least, take the necklace as punishment.}}{{desc=Once per day, calls the priest\'s deity ([90% probability](!\\amp#13;\\amp#47;r 1d100)) to come to him in material form (but it had better be for a good reason!).}}'},
{name:'Beastmaster-Animal-Telepathy',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Beastmaster\nAnimal Telepathy}}{{splevel=Class Ability}}{{school=Enchantment-Charm}}Specs=[Beastmaster-Animal-Telepathy,Power,1H,Enchantment-Charm]{{components=None}}{{time=[[10]]}}{{range=[30 feet](!rounds --aoe @{selected|token_id}|circle|feet|0|60||magic|true)}}{{duration=Special}}{{aoe=Special}}{{save=[Recruit](!\\amp#13;\\amp#47;gmroll 1d20 minus [[ceil(@{selected|casting-level}/3)]] save vs Rod) save vs Rod for animal to save vs being recruited}}SpellData=[w:Beastmaster Animal Telepathy,sp:10,cs:None]{{effects=The Beastmaster can establish telepathic communication with any normal or giant animal within 30\', if he does nothing else in the round. The animal must have a minimum Intelligence of 1. This has the following benefits:\n• The Beastmaster can communicate to the creature that he desires its friendship. If the offer is sincere (and the animal will be able to sense if it isn\'t), the creature can be calmed and will not attack or flee unless it is attacked.\n• The Beastmaster can recruit an animal he has befriended as a henchman if he is not at his limit and if the creature fails a saving throw vs. rods. The saving throw is penalized by -1 for every three levels of experience the Beastmaster has earned.\n*Animal Bonding:* The Beastmaster forms a mental bond with any animal he recruits as a henchman. There is no distance limit, but this ability does not cross planar boundaries. This bond has the following effects:\n•The Beastmaster can communicate directly with any animal henchman to which he has a bond.\n• He can see through the eyes of the animal by concentrating on the mental link. He can see through the eyes of only one creature in a round (himself included).\n• He has the animal lore proficiency with respect to the bonded animal. Furthermore, if he is mentally linked to the animal, success with the proficiency is automatic.}}'},
{name:'Beholder-Anti-Magic-Ray',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Anti-Magic Ray}}{{splevel=Creature Power}}{{school=Power}}Specs=[Beholder-Anti-Magic-Ray,Power,0H,Innate Ability]{{components=None}}{{time=[[0]]}}{{range=[[0]]}}{{duration=Instantaneous}}{{aoe=[140yds 90-degree cone](!rounds --aoe @{selected|token_id}|cone|yds|0|140|140|magic|true)}}{{save=None}}SpellData=[w:Beholder Anti Magic Ray,sp:0,pd:-1]{{effects=140-yard range, which covers a 90 degree arc before the creature. No magic (including the effects of the other eyes) will function within that area. Spells cast in or passing through that zone cease to function. The beholder may activate the magical powers of its eyes at will}}{{Use=Point the beholder in the direction to cast before selecting the Area of Effect button to see the area of effect}}'},
{name:'Birdcharmer-Charm',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Mesmerize a Victim}}{{splevel=Power}}{{school=Enchantment/Charm}}Specs=[Birdcharmer Charm,Power,0H,Enchantment-Charm]{{components=S}}{{time=[[10]]}}{{range=Line of sight}}{{duration=[While concentrate](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who\'s the Victim?}|token_id}|Mesmerized|99|0|Mesmerised while watching the snake sway to and fro|chained-heart) and [2d6 rounds](!rounds --removetargetstatus \\amp#64;{target|Who\'s the Victim?|token_id}|Mesmerized --target single|@{selected|token_id}|\\amp#64;{target|Who\'s the Victim?|token_id}|Mesmerised still|\\amp#91;[2d6]\\amp#93;|-1|Still mesmerized even though the snake has looked elsewhere|chained-heart) thereafter}}{{aoe=[[1]] creature}}{{save=vs. paralysation negates}}SpellData=[w:Birdcharmer Charm,sp:10,cs:S]{{effects=Some constrictor snakes are known as birdcharmers; these innately magical snakes can mesmerize their prey by swaying slowly and steadily while staring down their victims. Creatures of animal intelligence or less must make a saving throw against paralyzation or be effectively paralyzed for as long as the snake continues to sway, and for 2d6 rounds thereafter.}}'},
+ {name:'Black-Dragon-Breath',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=Black }}{{title=Dragon Breath}}{{use=Show the [60ft x 5ft blast](!rounds --aoe @{selected|token_id}|bolt|feet|0|60|5|Acid --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) of acid which also sets the recovery counter. Then do [[(@{selected|age|max}*2)d4+@{selected|age|max}]] HP damage (save. vs breath to halve}}{{desc=A black dragon\'s breath weapon is an acidic bolt 60\' long and 5\' wide. Creatures struck by the acid must save versus breath weapon for half damage. The damage done increases with the dragon\'s age: from 2d4+1 to 24d4+12. The damage shown above includes this age-related dice roll}}'},
+ {name:'Black-Dragon-Darkness',type:'Power',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casts\nBlack Dragon Darkness\nas a Power}}{{splevel=Power}}{{school=Alteration}}Specs=[Black Dragon Darkness,Power,1H,Alteration]{{components=V}}{{time=[[1]]}}{{range=[[@{selected|casting-level}*10]] yds}}{{duration=[[@{selected|casting-level}+10]] rounds}}{{aoe=[ [[10*@{selected|age|max}]]ft. radius (or as cast)](!rounds --aoe @{selected|token_id}|circle|feet|[[@{selected|casting-level}*30]]||[[10*@{selected|age|max}]]|black)}}{{save=None}}{{reference=PHB p140}}SpellData=[w:Black-Dragon-Darkness,sp:1,cs:V]{{effects=This spell causes total, impenetrable darkness in the area of effect}}'},
{name:'Blackrazor-Haste',type:'ItemPower',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Blackrazor casts\nHaste\nas a level 12 caster}}{{splevel=Power}}{{school=Alteration}}Specs=[Blackrazor-Haste,ItemPower,1H,Alteration]{{components=V, S}}{{time=[[3]]}}{{range=[[60]]yds}}{{duration=[[36]] rounds}}{{aoe=[[12]]creatures in a [40ft. cube](!rounds --aoe @{selected|token_id}|square|feet|180|40||magic)}}{{save=None}}{{healing=[Super-Speed](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select who to hurry up|token_id}|Haste|15|-1|Hasted, double attacks, move etc|Strong)}}SpellData=[w:Blackrazor Haste,sp:3,cs:VS]{{effects=When this spell is cast, each affected creature functions at double its normal movement and attack rates. A hasted creature gains a -2 initiative bonus. Thus, a creature moving at 6 and attacking once per round would move at 12 and attack twice per round. Spellcasting and spell effects are not sped up. The number of creatures that can be affected is equal to the caster\'s experience level; those creatures closest to the centre of effect are affected first. All affected by haste must be in the designated area of effect. Note that this spell negates the effects of a slow spell. Additionally, this spell ages the recipient by one year, because of sped-up metabolic processes. This spell is not cumulative with itself or with other similar magic.}}{{materials=A shaving of liquorice root.}}'},
+ {name:'Blue-Dragon-Breath',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=Blue }}{{title=Dragon Breath}}{{use=Show the [100ft x 5ft bolt](!rounds --aoe @{selected|token_id}|bolt|feet|0|100|5|Lightning --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) of electricity which also sets the recovery counter. Then do [[(@{selected|age|max}*2)d8+@{selected|age|max}]] HP damage (save. vs breath to halve}}{{desc=A blue dragon\'s breath weapon is a bolt of electricity 100\' long and 5\' wide. Creatures struck by the lightning must save versus breath weapon for half damage. The damage done increases with the dragon\'s age: from 2d8+1 to 24d8+12. The damage shown above includes this age-related dice roll}}'},
+ {name:'Brass-Dragon-Breath',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=Brass}}{{title=Dragon Breath}}{{use=**Searing Hot Air:** Show the [50ft x 40ft cloud](!rounds --aoe @{selected|token_id}|rectangle|feet|0|50|40|fire --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) which also sets the recovery counter. Then do [[(@{selected|age|max}*2)d4+@{selected|age|max}]] HP damage (save. vs breath to halve).\n**Sleeping Gas:** Show a [70ft x 20ft cone](!rounds --aoe @{selected|token_id}|cone|feet|0|70|20|magic --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) of gas, save vs. breath weapon or [Sleep](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select the first creature falling asleep|token_id}|Sleep|[[5*@{selected|casting-level}]]|-1|Fallen asleep for a while|sleepy) regardless of Hit Dice or level}}{{desc=A brass dragon has two breath weapons: a cone of sleep gas 70\' long, 5\' wide at the dragon\'s mouth, and 20\' wide at its end; or a cloud of blistering desert heat 50\' long, 40\' wide, and 20\' high. Creatures caught in the gas, regardless of Hit Dice or level, must save vs. breath weapon for half.}}'},
{name:'Bright-Sunlight-1-tohit-penalty',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} is suffering\nBright Sunlight}}{{splevel=Penalty}}{{school=Power}}Specs=[Bright Sunlight,Power,0H,Innate Ability]{{components=None}}{{time=[[0]]}}{{range=Self}}{{duration=While in bright sunlight}}{{aoe=The creature}}{{save=None}}SpellData=[w:Bright Sunlight,sp:0,pd:-1]{{effects=If fighting in bright sunlight, this creature suffers a -1 penalty to attack roles}}{{Use=Press [In Bright Sunlight](!rounds --target caster|@{selected|token_id}|Sunlight -1 tohit penalty|99|0|Suffering -1 to hit due to being in bright sunlight|bleeding-eye) to apply penalty, and [In Shade](!rounds --removetargetstatus @{selected|token_id}|Sunlight -1 tohit penalty) to end it}}'},
+ {name:'Bronze-Dragon-Airy-Water',type:'Power',ct:'5',charge:'uncharged',cost:'0.5',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casting\n**Airy Water**\nas a Power}}{{splevel=Power}}{{school=Alteration}}Specs=[Airy Water,Power,1H,Alteration]{{components=V}}{{time=[[1]]}}{{range=[[0]]}}{{duration=[[@{selected|casting-level}]] turns}}{{aoe=[ [[10*@{selected|age|max}]]ft radius sphere](!rounds --aoe @{selected|token_id}|circle|feet|0|[[10*@{selected|age|max}]]||light|true --target caster|@{selected|token_id}|Airy-water-10|[[10*@{selected|casting-level}]]|-1|Ah, room to breathe|aura)}}{{save=None}}{{reference=PHB p165}}SpellData=[w:Airy Water,lv:5,sp:5,gp:0.5,cs:VSM]{{effects=Turns normal liquid, such as water or water-based solutions, into a less dense, breathable substance.}}'},
+ {name:'Bronze-Dragon-Breath',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=Bronze}}{{title=Dragon Breath}}{{use=**Lightning Bolt:** Show the [100ft x 5ft bolt](!rounds --aoe @{selected|token_id}|bolt|feet|0|100|5|lightning --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) which also sets the recovery counter. Then do [[(@{selected|age|max}*2)d8+@{selected|age|max}]] HP damage (save. vs breath to halve).\n**Repulsion Gas:** Show a [20ft x 30ft](!rounds --aoe @{selected|token_id}|rectangle|feet|0|20|30|acid --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) x 30ft high cloud of gas, save vs. breath weapon or [flee](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select the first creature fleeing|token_id}|Flee|[[2*@{selected|age|max}+1d6]]|-1|Fleeing away from the dragon|screaming) away from the bronze dragon for the duration}}{{desc=A bronze dragon has two breath weapons: a stroke of lightning 100\' long and 5\' side or a cloud of repulsion gas 20\' long, 30\' wide, and 30\' high. Creatures caught in the gas must save vs. breath weapon or move away from the dragon for two minutes per age level of the dragon, plus 1-6 minutes. Creature caught in the lightning take damage, save vs. breath weapon for half.}}'},
{name:'Chariot-of-Sustarre',type:'Power',ct:'100',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} uses\nChariot of Sustarre\nas a Power}}{{splevel=Power}}{{school=Evocation}}{{sphere=Elemental (Fire), Creation}}Specs=[Chariot of Sustarre,Power,1H,Evocation]{{components=V,S}}{{range=[[10]] yards}}{{time=[[1]] turn}}{{duration=[12 hours](!rounds --target caster|@{selected|token_id}|Chariot of Sustarre|720|-1|You have a flaming flying chariot, move 24, FL 48|overdrive)}}{{aoe=Special}}{{save=Special vs. Petrification}}{{reference=PHB p231}}SpellData=[w:Chariot of Sustarre,sp:100,cs:VS,sph:Elemental-Fire|Creation]{{effects=Brings forth a large, flaming chariot pulled by two fiery horses from the elemental plane of Fire in a clap of thunder amid a cloud of smoke.}}'},
{name:'Charm-Fascination',type:'Power',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} uses\nCharm/Fascination\nas a Power}}{{splevel=Power}}{{school=Enchantment/Charm}}Specs=[Charm-Fascination,Power,0H,Enchantment-Charm]{{components=V}}{{time=[[3]]}}{{range=[30 yards](!rounds --aoe @{selected|token_id}|circle|yards|0|60||magic|true)}}{{duration=[[1+@{selected|casting-level}]] hours}}{{aoe=[[1]] creature}}{{save=Negates}}{{reference=*The Complete Priest\'s Handbook*, Powers}}{{healing=[Make a Suggestion](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Select suggestable target|token_id}|Suggestion|[[60+(60*@{selected|casting-level})]]|-1|Agrees with the Wizard\'s Suggestion and getting on with it|chained-heart)}}SpellData=[w:Charm-Fascination,sp:3,cs:V]{{effects=Works just like the third-level Wizard spell suggestion, except that the priest does not have to use material components to the spell.\nThe DM may define this Power as working one of two ways. Either it can be used in combat (in which case it can be used against only one target at a time), or it cannot be used in combat (in which it can be used against a number of targets equal in HD to two times the Priest\'s experience level).\nIn either case, the Priest can use the ability three times per day. If the target makes his saving throw, he may choose to reject the suggestion, but will not recognize that priestly magic was being used against him.\nThis power is most appropriate to priests of the gods of love, mischief and trickery, music, and peace, but can be given to any priesthood which has an influential position in the society.}}'},
+ {name:'Charm-Reptiles',type:'Power',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} uses \n**Charm Reptile**\nas a Power}}{{splevel=Power}}{{school=Enchantment/Charm}}{{sphere=Animal}}Specs=[Charm-Reptile,Power,1H,Enchantment-Charm]{{components=V}}{{time=[[1]]}}{{range=[80 yards](!rounds --aoe @{selected|token_id}|circle|yards|0|160||magic)}}{{duration=Special - at least 1 day}}{{aoe=[Charms](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Select new friend|token_id}|Charm-P-or-M|99|0|Charmed|chained-heart)[[1]] reptile or reptilian creature}}{{save=Negates}}{{reference=PHB p203}}SpellData=[w:Charm-Reptile,sp:1,cs:V,sph:Animal]{{effects=Charm one reptile or reptilian creature. Save vs. spell or believes caster is trusted friend and ally to be protected.}}'},
+ {name:'Cloud-Walk',type:'Power',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Cloud Walk**\nas a Power}}Specs=[Cloud-Walk,Power,1H,Alteration]{{Speed=[[1]]}}{{Range=0}}SpellData=[w:Cloud Walk,sp:1,cs:S]{{Use=Just specify use of the power during initiative, and then use it during the round to display its description}}{{desc=This allows the caster to tread on clouds or fog as though they were solid ground. The ability functions continuously, but can be negated or resumed at will.}}'},
{name:'Contaminate-Water',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} casts\nContaminate Water\nas a level @{selected|Casting-Level} caster}}{{splevel=Power}}{{school=Alteration}}{{sphere=All}}Specs=[Contaminate-Water,Power,1H,Alteration]{{components=V,S}}{{time=[[1]] round}}{{range=[[30]] yds}}{{duration=Permanent}}{{aoe=[[@{selected|Casting-Level}]] cu.ft.}}{{save=None}}SpellData=[w:Contaminate Water,sp:10,cs:VS,sph:All]{{effects=When cast, this spell makes pure food and water into spoiled, rotten, poisonous, or otherwise contaminated food and water totally unsuitable for eating and drinking. Up to 1 cubic foot of food and drink per level can be thus contaminated. This spoils even holy water; however, it has no effect upon creatures or potions}}'},
{name:'Control-undead',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} attempts to\nControl Undead\nas a level @{selected|pr-casting-level} @{selected|class3}}}{{splevel=Power}}{{school=Necromancy}}Specs=[Control-Undead,Power,1H,Necromancy]{{components=V,S,M}}{{time=[[10]]}}{{range=0}}{{duration=Until broken}}{{aoe=Up to [[12]] Undead within line of sight}}{{save=See turning table}}{{reference=PHB p103}}{{damage=[Control It](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select first undead|token_id}|Controlled|99|0|Controlled-undead, subservient to @{selected|character_name}|chained-heart)}}SpellData=[w:Control-Undead,sp:10,cs:VSM]{{effects=An ability of Evil Clerics, and Shamen of all persuasions. Attempting to control counts as an action, requiring one round and occurring during the character\'s turn in the initiative order (thus, the undead may get to act before the character can control them). The mere presence of the character is not enough--a touch of drama from the character is important. Speech and gestures are important, so the character must have his hands free and be in a position to speak. However, controlling is not like spellcasting and is not interrupted if the character is attacked during the attempt.\nTo resolve a attempt, look on Table 61. Cross-index the Hit Dice or type of the undead with the level of the character. If there is a number listed, roll 1d20. If the number rolled is equal to or greater than that listed, the attempt is successful. If the letter "T" appears, the attempt is automatically successful without a die roll, and the undead will follow orders if they can. If the letter "D" is given, the controlling makes the undead utterly subservient. A dash (--) means that a priest of that level cannot control that type of undead. A successful controlling affects 2d6 undead. If the undead are a mixed group, the lowest Hit Dice creatures are controlled first.\nOnly one die is rolled regardless of the number of undead the character is attempting to control in a given round. The result is read individually for each type of undead.}}{{material=The Priest\'s holy symbol}}'},
+ {name:'Copper-Dragon-Breath',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=Copper}}{{title=Dragon Breath}}{{use=**Spurt of Acid:** Show the [70ft x 5ft spurt](!rounds --aoe @{selected|token_id}|bolt|feet|0|70|5|acid --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) which also sets the recovery counter. Then do [[(@{selected|age|max}*2)d6+@{selected|age|max}]] HP damage (save. vs breath to halve).\n**Slow Gas:** Show a [20ft x 30ft](!rounds --aoe @{selected|token_id}|rectangle|feet|0|30|20|magic --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) x 30ft high cloud of gas, save vs. breath weapon or [be slowed](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Which creature is slowed?|token_id}|slow|[[3@{selected|age|max}]]|-1|Slowed by the breath of a *Copper Dragon*|snail).}}{{desc=Copper dragon\'s breath is either a cloud of *slow* gas 30\' long, 20\' wide, and 20\' high or a spurt of *acid* 70\' long and 5\' wide. Creatures caught in the gas must save vs. breath weapon or be *slowed* for three minutes per age level of the dragon. Creatures caught in the *acid* take damage, save vs. breath weapon for half.}}'},
+ {name:'Corrupt-Water',type:'Power',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Corrupt Water**\nas a Power}}Specs=[Corrupt Water,Power,1H,Alteration]{{Speed=[[1]]}}{{Range=0}}SpellData=[w:Corrupt Water,sp:1,cs:V]{{Use=Just specify use of the power during initiative, and then use it during the round to display its description}}{{desc=For every age category a dragon attains, it can stagnate 10 cubic feet of water (in this case 10 x @{selected|age|max} cu.ft.), making it become still, foul, inert, and unable to support animal life. When this ability is used against potions and elixirs, they become useless if they roll a 15 or better on 1d20.}}'},
{name:'Create-Food-and-Water',type:'Power',ct:'100',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} uses\nCreate Food and Water\nas a Power}}{{splevel=Power}}{{school=Alteration}}{{sphere=Creation}}Specs=[Create-Food-and-Water,Power,1H,Alteration]{{components=V,S}}{{time=[[1]]turn}}{{range=[[10]] yards}}{{duration=Special}}{{aoe=[[@{selected|casting-level}]]cu.ft.}}{{save=None}}{{reference=*The Complete Priest\'s Handbook*, Powers}}SpellData=[w:Create-Food-and-Water,lv:3,sp:100,gp:0,cs:VS,sph:Creation]{{effects=Causes food and water to appear.}}'},
{name:'Cure-Blindness',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Staff of Curing\nCure Blindness}}{{splevel=Magic Item Power}}{{school=Necromancy}}{{sphere=Healing}}Specs=[Cure Blindness,Power,1H,Necromancy]{{components=V,M}}{{time=[[10]]}}{{range=Touch}}{{duration=Permanent}}{{aoe=1 Creature}}{{save=None}}{{reference=DMG p154}}SpellData=[w:Cure Blindness,sp:10,cs:VM]{{effects=By touching the creature afflicted, the priest employing the spell can permanently cure some forms of blindness. This spell does not restore or repair visual organs damaged by injury or disease. Only once per creature per day, and only twice a day in total}}'},
{name:'Cure-Insanity',type:'Power',ct:'4',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Staff of Curing\nCure Insanity}}{{splevel=Magic Item Power}}{{school=Necromancy}}{{sphere=Healing}}Specs=[Cure Insanity,Power,1H,Necromancy]{{components=V,M}}{{time=[[4]]}}{{range=Touch}}{{duration=Permanent}}{{aoe=1 Creature}}{{save=None}}{{reference=DMG p154}}SpellData=[w:Cure Insanity,sp:4,cs:VM]{{effects=*Cure Insanity* reverses the effects of *Feablemind* or *Confusion*, and any similar spells or powers}}'},
@@ -3127,6 +3300,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Defence-Stance',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} starts\nDefence Stance\nas a level @{selected|level-class1} Dwarven Defender}}{{splevel=Power}}{{school=Dwarven Defender}}Specs=[Defence-Stance,Power,1H,Innate Ability]{{components=S}}{{time=[[0]]}}{{range=[[0]]}}{{duration=[[10]] Rounds}}{{aoe=Self}}{{save=None}}{{healing=[Adopt the Position!](!rounds --target caster|@{selected|token_id}|Defence-stance|10|-1|Defence Stance, 1/2 damage, +2 on saves, 50% move|overdrive)}}SpellData=[w:Defence Stance,sp:0,cs:S]{{effects=This Dwarven Defender gets [[{ceil(@{selected|level-class1}/4),3}kl1]] Defensive Stances a Day. This lasts for [[10]] rounds and can be invoked instantly. While they have Defensive staff active, they suffer only **half damage** from all forms of physical damage, a +[[2]] on **saving throws** and a [[50]]% **penalty to their move**}}'},
{name:'Defiance',type:'Power',ct:'9',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} uses\nDefiance of Restriction or Obstacle\nas a Power}}{{splevel=Power}}{{school=Alteration}}Specs=[Defiance,Power,0H,Alteration]{{components=V}}{{time=[[1]]}}{{range=[[0]]}}{{duration=[Unlimited](!rounds --target caster|@{selected|token_id}|Defiance-Power|99|0|Defying a natural Restriction or Obstacle|aura)}}{{aoe=The caster}}{{save=None}}{{reference=*The Complete Priest\'s Handbook*, Powers}}SpellData=[w:Defiance,sp:9,cs:V]{{effects=The priest can simply ignore some aspect of the physical world which normally slows, impedes, or prevents passage. This is similar to the Druidic power, *Pass Without Trace*. The Obstacle or restriction that can be defied varies with the Priesthood.}}'},
{name:'Detect-Flawed-Stonework',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}}{{title=@{selected|casting-name} uses\nDetect Unsafe Walls, Ceilings \\amp Floors\nas a Power}}{{splevel=Power}}{{school=Power}}Specs=[Detect Flawed Stonework,Power,1H,Divination]{{components=S}}{{time=1 round}}{{range=[10 feet](!rounds --aoe @{selected|token_id}|circle|feet|0|10|10|light|true)}}{{duration=1 round}}{{aoe=Caster}}{{save=None}}{{reference=PHB Chapter 2}}SpellData=[w:Detect Flawed Stonework,lv:0,sp:10,cs:S]{{effects=Tunnelers of great skill can detect unsafe construction of walls, ceilings and floors on a [1-7 on d10](!\\amp#13;\\amp#47;r 1d10\\lt7) when within 10 feet of the location.}}'},
+ {name:'Detect-Gems-Kind+Number',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Detect Gems, Kind \\amp Number**\nas a Power}}Specs=[Detect-Gems,Power,1H,Divination]{{Speed=[[0]]}}{{Range=0}}SpellData=[w:Detect-Gems,sp:0,cs:S]{{Use=Just specify use of the power during initiative, and then use it during the round to display its description}}{{desc=Some creatures, especially some types of dragon, can detect gems at a distance, even if hidden. Some magic items and special weapons can also convey this power to those wielding them. Quite often this includes the kind and number of gems detected. The area of effect of the detection varies by creature and device - see descriptions of these to determine the full nature of each specific use.}}'},
{name:'Detect-Illusions',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Detect Illusions}}{{splevel=Power}}{{school=Divination}}Specs=[Detect Illusions,Power,0H,Divination]{{components=None}}{{time=[[0]]}}{{range=[[0]]}}{{duration=Special}}{{aoe=Line of Sight}}{{save=None}}SpellData=[w:Detect Illusions,sp:0]{{desc=Those with a high Intelligence score, with granted powers, or with magic items that grant the ability, can detect illusions up to a certain level. The DM will determine the circumstances based on the source of the power used and the type of illusion (if such exists at all!)}}'},
{name:'Detect-New-Construction',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}}{{title=@{selected|casting-name} uses\nDetect New Passage/Tunnel Construction\nas a Power}}{{splevel=Power}}{{school=Power}}Specs=[Detect New Construction,Power,1H,Divination]{{components=S}}{{time=[[0]]}}{{range=[10 feet](!rounds --aoe @{selected|token_id}|circle|feet|0|10|10|light|true)}}{{duration=1 round}}{{aoe=Caster}}{{save=None}}{{reference=PHB Chapter 2}}SpellData=[w:Detect New Construction,lv:0,sp:0,cs:S]{{effects=Miners of great skill, while underground, can detect the new construction of a tunnel or passage when within 10 feet of the location (and they can determine their approximate depth below the surface at any time).\nHobgoblins: on a [1-4 on d10](!\\amp#13;\\amp#47;r 1d10\\lt4) \nOthers: on a [1-5 on d6](!\\amp#13;\\amp#47;r 1d6\\lt5) }}'},
{name:'Detect-Shifting-Walls',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}}{{title=@{selected|casting-name} uses\nDetect Sliding/Shifting Walls or Rooms\nas a Power}}{{splevel=Power}}{{school=Power}}Specs=[Detect Shifting Walls,Power,1H,Divination]{{components=S}}{{time=[[0]]}}{{range=[10 feet](!rounds --aoe @{selected|token_id}|circle|feet|0|10|10|light|true)}}{{duration=1 round}}{{aoe=Caster}}{{save=None}}{{reference=PHB Chapter 2}}SpellData=[w:Detect Shifting Walls,lv:0,sp:0,cs:S]{{effects=Miners of great skill, while underground, can detect sliding or shifting walls or rooms when within 10 feet of the location (and they can determine their approximate depth below the surface at any time).\nHobgoblins: on a [1-4 on d10](!\\amp#13;\\amp#47;r 1d10\\lt4) \nOthers: on a [1-4 on d6](!\\amp#13;\\amp#47;r 1d6\\lt4) }}'},
@@ -3135,12 +3309,19 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Determine-Depth-Underground',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}}{{title=@{selected|casting-name} uses\nDetect Approximate Depth Underground\nas a Power}}{{splevel=Power}}{{school=Power}}Specs=[Determine Depth Underground,Power,1H,Divination]{{components=S}}{{time=1 round}}{{range=[10 feet](!rounds --aoe @{selected|token_id}|circle|feet|0|10|10|light|true)}}{{duration=1 round}}{{aoe=Caster}}{{save=None}}{{reference=PHB Chapter 2}}SpellData=[w:Determine Depth Underground,lv:0,sp:10,cs:S]{{effects=Miners of great skill, while underground, can determine their approximate depth underground.\nDwarves on a [1-3 on d6](!\\amp#13;\\amp#47;r 1d6\\lt3).\nGnomes on a [1-4 on d6](!\\amp#13;\\amp#47;r 1d6\\lt4).}}'},
{name:'Determine-Direction-Underground',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}}{{title=@{selected|casting-name} uses\nDetect Approximate Direction Underground\nas a Power}}{{splevel=Power}}{{school=Power}}Specs=[Determine Direction Underground,Power,1H,Divination]{{components=S}}{{time=1 round}}{{range=[10 feet](!rounds --aoe @{selected|token_id}|circle|feet|0|10|10|light|true)}}{{duration=1 round}}{{aoe=Caster}}{{save=None}}{{reference=PHB Chapter 2}}SpellData=[w:Determine Direction Underground,lv:0,sp:10,cs:S]{{effects=Tunnelers of great skill, while underground, can determine their approximate direction of travel underground on a [1-3 on d6](!\\amp#13;\\amp#47;r 1d6\\lt3).}}'},
{name:'Divine-Favour',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Divine Favour}}Specs=[Divine-Favour,Power,1H,Alteration]{{Range=[[30]]ft}}{{Speed=0}}SpellData=[w:Divine Favour,sp:0,cs:None]{{desc=@{selected|casting-name} calls on a [Divine Favour](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Select Beneficiary|token_id}|Divine-favour|6|-1|In Divine Favour +[[4]] to hit if within [[30]]ft of @{selected|casting-name}|fist) for someone giving +[[4]] to hit for [[6]] rounds as long as they are within [[30]]ft of @{selected|token_name}}}'},
+ {name:'Djinni-Create-Illusion',type:'Power',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Create Illusion}}{{splevel=Djinn Power}}{{school=Illusion/Phantasm}}Specs=[Create Illusion,Power,0H,Alteration]{{components=None}}{{time=[[2]]}}{{range=260 yards}}{{duration=Special}}{{aoe=[Up to 1200 sq. ft.](!rounds --aoe @{selected|token_id}||feet|260|||magic)}}{{save=to disbelieve}}{{reference=AD\\ampD2e Monstrous Manual Djinni}}SpellData=[w:Create Illusion,sp:2,pd:1]{{effects=A standard Djinn power is to create an illusion with both visible and audible components, once per day. It is the equivalent of *Improved Phantasmal Force* cast at 20th level, but does not require any concentration and persists until touched or magically dispelled.}}'},
+ {name:'Djinni-Create-Metal',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Create Metal}}{{splevel=Djinn Power}}{{school=Alteration}}Specs=[Create Metal,Power,0H,Alteration]{{components=None}}{{time=[[10]]}}{{range=Special}}{{duration=Special}}{{aoe=Up to 100 lbs weight}}{{save=None}}{{reference=AD\\ampD2e Monstrous Manual Djinni}}SpellData=[w:Create Metal,sp:10,pd:1]{{effects=A standard Djinn power is to create up to 100 lbs weight of metal, once per day. However, this metal only has a short lifespan, which depends on the metal\'s hardness. Gold has about a 24 hour life, whereas steel lasts only one hour}}'},
+ {name:'Djinni-Create-Nutritious-Food',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Create Nutritious Food}}{{splevel=Djinn Power}}{{school=Alteration}}Specs=[Create Nutritious Food,Power,0H,Alteration]{{components=None}}{{time=[[10]]}}{{range=Special}}{{duration=Permanent}}{{aoe=[2d6 Persons](!\\amp#13;\\amp#47;gr 2d6 persons of nutritious food created)}}{{save=None}}{{reference=AD\\ampD2e Monstrous Manual Djinni}}SpellData=[w:Create Nutritious Food,sp:10,pd:1]{{effects=A standard Djinn power is to *Create Nutritious Food* for 2d6 persons, once per day}}'},
+ {name:'Djinni-Create-Soft-Goods',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Create Soft Goods}}{{splevel=Djinn Power}}{{school=Alteration}}Specs=[Create Soft Goods,Power,0H,Alteration]{{components=None}}{{time=[[10]]}}{{range=Special}}{{duration=Permanent}}{{aoe=Up to 16 cu ft}}{{save=None}}{{reference=AD\\ampD2e Monstrous Manual Djinni}}SpellData=[w:Create Soft Goods,sp:10,pd:1]{{effects=A standard Djinn power is to create up to 16 cu ft of soft goods (cushions, mats, blankets, tents, etc), once per day}}'},
+ {name:'Djinni-Create-Wine-or-Water',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Create Wine or Water}}{{splevel=Djinn Power}}{{school=Alteration}}Specs=[Create Wine or Water,Power,0H,Alteration]{{components=None}}{{time=[[10]]}}{{range=Special}}{{duration=Permanent}}{{aoe=[2d6 Persons](!\\amp#13;\\amp#47;gr 2d6 persons of either wine or water created)}}{{save=None}}{{reference=AD\\ampD2e Monstrous Manual Djinni}}SpellData=[w:Create Wine or Water,sp:10,pd:1]{{effects=A standard Djinn power is to *Create Wine or Water* for 2d6 persons, once per day}}'},
+ {name:'Djinni-Create-Wooden-Items',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=CreateWooden Items}}{{splevel=Djinn Power}}{{school=Alteration}}Specs=[Create Wooden Items,Power,0H,Alteration]{{components=None}}{{time=[[10]]}}{{range=Special}}{{duration=Permanent}}{{aoe=Up to 9 cu ft}}{{save=None}}{{reference=AD\\ampD2e Monstrous Manual Djinni}}SpellData=[w:Create Wooden Items,sp:10,pd:1]{{effects=A standard Djinn power is to create up to 9 cu ft of wooden Items (chairs, bed frames, wooden shields, 10ft poles etc), once per day}}'},
{name:'Djinni-Whirlwind',type:'Power',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Whirlwind}}Specs=[Djinni-Whirlwind,Power,0H,Innate Ability]{{Speed=[[1]]}}{{save=Vs Breath Weapon to halve}}{{Recharge=[Start recharging](!rounds --target caster|@{selected|token_id}|AE-Whirlwind|\\amp#91;[3+1d3]\\amp#93;|-1|Whirlwind building|stopwatch)}}SpellData=[w:Djinni-Whirlwind,sp:1,cs:S]{{desc=A genie can [Create a Whirlwind](!rounds --target caster|@{selected|token_id}|Djinni-Whirlwind-building|10|-1|Whirlwind building, cannot do damage yet|stopwatch), which it can ride or even direct at will from a distance. The whirlwind is a cone-shaped spiral, measuring up to 10 feet across at its base, 40 feet across at the top, and up to 70 feet in height (the djinni chooses the dimensions). Its maximum speed is 18, with maneuverability class A. The whirlwind\'s base must touch water or a solid surface, or it will dissolve. It takes a full turn for the whirlwind to form or dissolve. During that time, the whirlwind inflicts no damage and has no other effect. The whirlwind lasts as long as the djinni concentrates on it, moving at the creature\'s whim.\nIf the whirlwind strikes a non-aerial creature with fewer than 2 Hit Dice, the creature must make a saving throw vs. breath weapon for each round of contact with the whirlwind, or be swept off its feet, battered, and killed. Hardier beings, as well as aerial or airborne creatures, take 2d6 points of damage per round of contact with the whirlwind.\nA djinni can ride its whirlwind and even take along passengers, who (like the djinni) suffer no damage from the buffeting winds. The whirlwind can carry the genie and up to six man-sized or three genie-sized companions.}}'},
{name:'Do-1HP-care',type:'',ct:'0',charge:'uncharged',cost:'0',body:'!setattr --silent --charid @{selected|character_id} --spell-cast|Do-day-care\n!token-mod --ignore-selected --ids @{target|Tend to which creature?|token_id} --set bar3_value|+1! --report control|"{name} is healed by 1 from {bar3_value:change}HP"\n!magic --cast-again power|@{selected|token_id}|Do-1HP-care'},
{name:'Do-1st-aid',type:'',ct:'0',charge:'uncharged',cost:'0',body:'!setattr --silent --charid @{selected|character_id} --spell-cast|Do-1st-aid\n!token-mod --ignore-selected --ids @{target|Tend to which creature?|token_id} --set bar3_value|+[[?{How much First Aid?|1d3}]]! --report control|"{name} is healed from {bar3_value:change}HP"\n!magic --cast-again power|@{selected|token_id}|Do-1st-aid'},
{name:'Do-2HP-care',type:'',ct:'0',charge:'uncharged',cost:'0',body:'!setattr --silent --charid @{selected|character_id} --spell-cast|Do-2HP-care\n!token-mod --ignore-selected --ids @{target|Tend to which creature?|token_id} --set bar3_value|+2! --report control|"{name} is healed by 2 from {bar3_value:change}HP"\n!magic --cast-again power|@{selected|token_id}|Do-2HP-care'},
{name:'Do-3HP-care',type:'',ct:'0',charge:'uncharged',cost:'0',body:'!setattr --silent --charid @{selected|character_id} --spell-cast|Do-3HP-care\n!token-mod --ignore-selected --ids @{target|Tend to which creature?|token_id} --set bar3_value|+3! --report control|"{name} is healed by 3 from {bar3_value:change}HP"\n!magic --cast-again power|@{selected|token_id}|Do-3HP-care'},
{name:'Dracolisk-Breath',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Dracolisk Spits Acid}}{{splevel=Breath Weapon}}{{school=Power}}Specs=[Dracolisk-Breath,Power,0H,Innate Ability]{{components=None}}{{time=[[0]]}}{{range=[[0]]}}{{duration=Instantaneous}}{{aoe=[30ft strem, 5ftwide](!rounds --aoe @{selected|token_id}|bolt|feet|0|30|5|acid|true)}}{{save=vs. Breath Weapon for half damage}}{{damage=[4d6 HP acid damage](!\\amp#13;\\amp#47;gmroll 4d6 acid damage from Dracolisk Breath)}}SpellData=[w:Dracolisk Breath,sp:0,pd:3]{{effects=A dracolisk can spit a stream of acid 5 feet wide and up to 30 feet away. The acid causes 4d6 points of damage, half-damage if a successful saving throw vs. breath weapon is rolled. The dracolisk can spit up to three times per day.}}{{Use=Select the Area of Effect button to see the area of effect and then roll damage for each creature in the area}}'},
+ {name:'Dragon-Fear',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} exudes \n**Dragon Fear**}}Specs=[Dragon Fear,Power,1H,Combat]{{Speed=[[0]]}}{{Range=[[0}]]}SpellData=[w:Dragon Fear,sp:0,cs:S]{{Use=[Show the area](!rounds --aoe @{selected|token_id}|circle|yards|0|[[({ { { {(@{selected|age|max}-4)},{0} }kh1},{1} }kl1)*(@{selected|age|max}-3)*5]]||lightning|true) affected. For those paniced (less than 1HD) [Flee](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select those who are paniced and fleeing|token_id}|Fleeing|\\amp#91;[4d6]\\amp#93;|-1|Its a dragon! Flee in panic!|screaming) with no saving throw for 4d6 rounds., Others in the area of effect must save vs. petrification at ([[8-@{selected|age|max}]] or [be afraid](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select those who are afraid|token_id}|Dragon-Fear|99|0|Struck with fear while in the area of effect. If leave get GM to remove fear|half-heart) (those outside that are of less than 1HD and can see the dragon are also automatically afraid)}}{{desc=Dragons can inspire panic or fear. The mere sight of a young adult or older dragon causes creatures with fewer than 1 Hit Die (as well as all noncarnivorous, nonaggressive creatures with fewer Hit Dice than the dragon) to automatically flee in panic for 4d6 rounds.\nTrained war mounts, organized military units, and single creatures with 1 Hit Die or more, but with fewer Hit Dice than the dragon are not panicked, but they may be stricken with fear if they are within the dragon\'s fear aura. The aura surrounds attacking or charging dragons in the specified radius and in a path along the ground directly beneath a flying dragon whose altitude is 250 feet or less. Creatures not automatically panicked are entitled to saving throws vs. petrification. Creatures failing their saving throws are stricken with fear and fight with a -2 penalty to their attack and damage rolls. The aura increases in size and power based on the age category of the dragon; creatures subjected to the aura receive a saving throw bonus or a penalty as specified on the Dragon Table. All creatures with Hit Dice equal to or greater than those of the dragon are immune to the fear effect.)}}{{desc1=Gem dragons are not as inherently fearsome as other dragons, so saving throws against their fear auras receive bonuses (in this case [[12-@{selected|age|max}]]); the bonuses appear in parenthesis in the Dragon Table.}}'},
{name:'Druids-Identify',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Identify Plants, Animals \\amp Pure Water as a Druid}}Specs=[Druids-Identify,Power,0H,Divination]{{Speed=[[10]]}}{{save=None}}SpellData=[w:Druids-Identify,sp:10,cs:S]{{desc=Identify all plants, animals and pure water with 100% accuracy.}}'},
{name:'Dryad-Charm-Person',type:'Power',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{splevel=Level 1 Wizard}}%{MU-Spells-DB|Charm-Person}{{title=The Dryad uses\nCharm Person\nas a Power}}Specs=[Dryad Charm Person,Power,0H,Enchantment-Charm]{{save=vs. spell at a penalty of -3 (special for Dryad power) Negates}}SpellData=[w:Charm-Person,lv:1,sp:1,gp:0,cs:VS]{{components=None}}'},
{name:'Duergar-Enlarge',type:'Power',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}}{{title=@{selected|casting-name} uses\nEnlarge\nas a Power at level [[2*@{selected|casting-level}]]}}{{splevel=Power}}{{school=Alteration}}Specs=[Duergar Enlarge,Power,1H,Alteration]{{components=V, S}}{{time=[[1]]}}{{range=Caster}}{{duration=[ @{selected|casting-level}0 Rounds](!rounds --target caster|@{selected|token_id}|Enlarge|[[10*@{selected|casting-level}]]|-1|Enlarged, Damage x [[1+(@{selected|casting-level}/5)]]|overdrive)}}{{aoe=Caster}}{{save=None}}{{reference=Complete Dwarves Handbook}}SpellData=[w:Duergar Enlarge,lv:1,sp:1,gp:0,cs:VS]{{effects=Causes instant growth of a Duergar (Gray Elf) casting it, increasing both size and weight. The Power works at double the casting level of the caster, but can only affect the caster and what they are wearing or using}}'},
@@ -3151,19 +3332,25 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Fire-Resistance',type:'Power',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} has\nFire Resistance\nas a Power cast at @{selected|Casting-Level} level}}{{splevel=Power}}{{school=Alteration/Protection}}Specs=[Fire-Resistance,Power,1H,Alteration-Protection]{{components=None}}{{time=[[5]]}}{{range=0}}{{duration=Continuous}}{{aoe=Creature with Power}}{{save=None}}SpellData=[w:Fire-Resistance,lv:1,sp:5,gp:0]{{effects=Those with this power are totally immune to the effects of normal fires—torches, flaming oil, bonfires, etc. Very large and hot fires, molten lava, hell-hound breath, or a wall of fire spell will cause 10 hit points of damage per round if the wearer is directly within the conflagration.\nExceptionally hot fires such as red-dragon breath, pyrohydra breath, fireballs, flame strike, fire storm, etc., are saved against with a +4 bonus to the die roll, and all damage dice are calculated at -2 per die, but each die is never less than 1 in any event. As a rule of thumb, consider very hot fires as those that have a maximum initial exposure of up to 24 hit points, those of exceptional heat (25 or more hit points)}}'},
{name:'Firedrake-Breath',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Firedrake uses\nFire Breath}}{{splevel=Breath Weapon}}{{school=Power}}Specs=[Firedrake-Breath,Power,0H,Innate Ability]{{components=S}}{{time=[[0]]}}{{range=[[0]]}}{{duration=Instantaneous}}{{aoe=[60ft cone, 10ft dia. at end](!rounds --aoe @{selected|token_id}|cone|feet|0|60|10|fire|true)}}{{save=Halves vs. Breath Weapon}}SpellData=[w:Firedrake Breath,sp:0,cs:S]{{effects=The firedrake\'s primary attack is its breath weapon (fire), which it can use up to five times daily. The fire forms a cone from the snout of the dragonet to a 10\' diameter circle at the extreme end of its 60\' range, and causes 2-16 points on all affected (save vs. breath weapon for half damage).\nThe dragonet\'s blood burns fiercely in air, as there is a high phosphorous content to the blood. In fact, the fire-breathing of these creatures is actually the voluntary expelling of a jet of its pyrophoric blood. Because of the flammability of the dragon\'s blood, blunt weapons such as staves or clubs are less dangerous than those which cause blood loss. Any creature making a successful slashing or piercing attack on a firedrake must save vs. breath weapon, or take 1-2 points of fire damage.}}'},
{name:'Follow-the-Standard',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} uses\nFollow the Standard}}{{splevel=Power}}{{school=Combat}}Specs=[Follow the Standard,Power,1H,Combat]{{components=None}}{{time=[[0]]}}{{range=[[0]]}}{{duration=[While alive](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Who is Fortified?|token_id}|Follow the Standard|99|0|Motivated by the Standard - +1 to attack \\amp morale|flying-flag)}}{{aoe=[60 yards radius](!rounds --aoe @{selected|token_id}|circle|yards|0|120|120|light|true)}}{{save=None}}SpellData=[w:Follow the Standard,sp:0,pd:-1]{{effects=If a subchief is present, there is a 40% chance the creatures will be fighting around a standard. The presence of this standard increases attack rolls and morale by +1 for all of those creatures within 60 yards.}}{{Use=Use the Area of Effect button to display the radius. Then use the Duration button to apply the *Flying Flag* status marker to those who benefit from the bonus.}}'},
+ {name:'Freezing-Fog',type:'Power',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Freezing Fog**\nas a Power}}Specs=[Freezing-Fog,Power,1H,Evocation]{{Speed=[[1]]}}{{Range=Undefined}}SpellData=[w:Freezing Fog,sp:1,cs:S]{{Use=On using the power, select the button to show the area of *freezing fog*}}{{desc=This [obscures vision](!rounds --aoe @{selected|token_id}|circle|feet|0|200|200|cold) in a 100\' radius and causes frost to form, creating a thin layer of glare ice on the ground and on all surfaces within the radius.}}'},
{name:'Gaseous-Form',type:'Power',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casts\nGaseous Form\nas a level @{selected|casting-level} caster}}{{splevel=Power}}{{school=Alteration}}Specs=[Gaseous-Form,Power,1H,Alteration]{{components=S}}{{time=[[1]]}}{{range=[[0]]}}{{duration=4+1d4 turns}}{{aoe=The caster}}{{save=None}}{{healing=[Go Gaseous](!rounds --target caster|@{selected|token_id}|Gaseous-Form|\\amp#91;[4+1d4]\\amp#93;|-1|In gaseous form, drift at 3, dmg by magic fire/lightning only|half-haze)}}SpellData=[w:Gaseous Form,sp:1,cs:S]{{effects=This power grants the same effect as consuming a Potion of Gaseous Form.\nThe individual causes his body, as well as anything he\'s carrying or wearing, to become gaseous. The gaseous form is able to flow at a base speed of 3/round. (A gust of wind spell, or even normal strong air currents, will blow the gaseous form at air speed.)\nThe gaseous form is transparent and insubstantial. It wavers and shifts, and can\'t be harmed except by magical fire or lightning, which do normal damage. A whirlwind inflicts double damage upon a creature in gaseous form. When in such condition the individual is able to enter any space that is not airtight-even a small crack or hole that allows air to penetrate also allows entry by a creature in gaseous form. The effects last the entire duration (4+1d4turns).}}'},
{name:'Gate-Mephit',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Mephit *gates* another Mephit}}{{splevel=Power}}{{school=Conjuration/Summoning}}Specs=[Gate-Mephit,Power,0H,Conjuration-Summoning]{{components=None}}{{time=[[0]]}}{{range=[[0]]}}{{duration=Instantaneous}}{{aoe=1 creature}}{{save=None}}SpellData=[w:Gate Mephit,sp:0,cs:None]{{effects=Mephits of different types can *gate* another Mephit to join them, once per hour. Different types of Mephit can *gate* specific other types, at varying rates of success:\n**Fire Mephit:**\n25% 1 Fire/Lava/Smoke/Steam\n**Ice Mephit:**\n25% 1 Ice/Mist\n**Lava Mephit:**\n25% 1-2 Fire/Lava/Smoke/Steam\n**Mist Mephit:**\n20% 1-2 Ice/Mist\n**Smoke Mephit:**\n20% 1-2 Fire/Lava/Smoke/Steam\n**Steam Mephit:**\n30% 1-2 Fire/Lava/Smoke/Steam}}'},
{name:'Ghast-Stench',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} uses\nGhast Stench}}{{splevel=Power}}{{school=Innate Power}}Specs=[Ghast Stench,Power,1H,Innate]{{components=None}}{{time=[[0]]}}{{range=[[0]]}}{{duration=[Nausious](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Who is Nauseous?|token_id}|Nauseous-2|99|0|Made nauseous by Ghast stink, 2 penalty to attacks|half-haze) while within area of effect}}{{aoe=[10ft radius](!rounds --aoe @{selected|token_id}|circle|feet|0|20|20|acid|true)}}{{save=vs. poison negates}}SpellData=[w:Ghast Stench,sp:0,pd:-1]{{effects=A Ghast has a ghastly stench that causes those within 10ft to save vs. poison or start retching and being nauseous, causing them to attack at a penalty of 2}}{{Use=Use the Area of Effect button to display the circle. Then use the Duration button to apply the *Nauseous* status marker to those who fail their saving throw. The resulting effect will alter the to-hit probability for the duration}}'},
{name:'Ghost-Fear',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Fear of the Ghost}}{{splevel=Innate Ability}}{{school=Necromancy}}Specs=[Ghost-Fear,Power,1H,Innate Ability]{{components=S}}{{time=[[0]]}}{{range=[60yds, Line of Sight](!rounds --aoe @{selected|token_id}|circle|yards|0|120|120|dark|true)}}{{duration=[2d6 turns](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Who sees the Ghost?|token_id}|Ghost Fear|\\amp#91;[10\\amp42;2d6]\\amp#93;|-1|Fleeing at maximum move away from the Ghost!|screaming\\amp#13;!modattr --charid \\amp#64;{target|Who sees the Ghost?|character_id} --age|10 --fb-header _CHARNAME_ grows older --fb-content _CHARNAME_ has aged by _TCUR0_ and is now _CUR0_ years old) \\amp age permanently}}{{aoe=Line of Sight}}{{save=Negates}}SpellData=[w:Ghost Fear,sp:0,pd:-1]{{effects=The mere sight of a Ghost within 60yds causes any humanoid being to age 10 years and flee in panic for 2-12 (2d6) turns unless a saving throw versus spell is made.}}{{Use=Select the Range button to identify those tokens in range of the effect. Then select the Duration button and select each character that fails to save, using the button that appears in the chat window to prompt for you to select each in turn.}}'},
{name:'Giant-Skeleton-Fireball',type:'Power',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casts\nFireball\nas a level 8 caster}}{{splevel=Power}}{{school=Evocation}}Specs=[Fireball,Power,0H,Evocation]{{components=None}}{{time=[[3]]}}{{range=[[10+(10*{10,@{selected|casting-level}}kl1)]]yds}}{{duration=Instantaneous}}{{aoe=[20ft. radius](!rounds --aoe @{selected|token_id}|circle|feet|270|40||fire)}}{{save=vs. spell (add situational dex mods) for half damage}}{{reference=PHB p149}}{{damage=[8d6](!\\amp#13;\\amp#47;r 8d6) (halved if save)}}{{damagetype=Fire}}SpellData=[w:Giant Skeleton Fireball,lv:3,sp:3]{{effects=The giant skeleton reaches into its chest and pulls forth flame, which it hurls.It blossoms into a fireball. Creatures failing their saving throws each suffer full damage from the blast. Those who roll successful saving throws manage to dodge, fall flat, or roll aside, each receiving half damage.}}'},
+ {name:'Gold-Dragon-Breath',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=Copper}}{{title=Dragon Breath}}{{use=**Cone of fire:** Show the [90ft x 30ft cone](!rounds --aoe @{selected|token_id}|cone|feet|0|90|20|fire --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) which also sets the recovery counter.\n**Chlorine Gas cloud:** Show a [50ft x 40ft](!rounds --aoe @{selected|token_id}|rectangle|feet|0|50|40|acid --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) x 30ft high cloud of gas.\nEither breath weapon does [[(@{selected|age|max}*2)d12+@{selected|age|max}]] HP damage (save. vs breath to halve).}}{{desc=A gold dragon has two breath weapons: a cone of fire 90\' long, 5\' wide at the dragon\'s mouth, and 30\' wide at the end or a cloud of potent chlorine gas 50\' long, 40\' wide and 30\' high. Creatures caught in either effect are entitled to a save versus breath weapon for half damage.}}'},
{name:'Gorgon-Breath',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Gorgon uses\nParalysis Breath}}{{splevel=Breath Weapon}}{{school=Power}}Specs=[Gorgon-Breath,Power,0H,Innate Ability]{{components=S}}{{time=[[0]]}}{{range=[[0]]}}{{duration=Instantaneous}}{{aoe=[60ft cone, 5ft at mouth,20ft dia. at end](!rounds --aoe @{selected|token_id}|cone|feet|0|60|20|acid|true)}}{{save=Negates vs. Petrification}}{{damage=[Petrify Them](!rounds --addtargetstatus \\amp#64;{target|Who is petrified?|token_id}|Petrified|99|0|Petrified by Gorgon Breath|sleepy)}}SpellData=[w:Gorgon Breath,sp:0,pd:4]{{effects=Four times per day gorgons can make a breath weapon attack (their preferred means of attack). Their breath shoots forth in a truncated cone, five feet wide at the base and 20 feet wide at its end, with a maximum range of 60 feet. Any creature caught in this cone must roll a saving throw vs. petrification. Those who fail are turned to stone immediately!}}'},
+ {name:'Green-Dragon-Breath',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=Green }}{{title=Dragon Breath}}{{use=Show the [50ft x 40ft cloud](!rounds --aoe @{selected|token_id}|rectangle|feet|0|50|40|acid --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) of chlorine gas which also sets the recovery counter. Then do [[(@{selected|age|max}*2)d6+@{selected|age|max}]] HP damage (save. vs breath to halve}}{{desc=A green dragon\'s breath weapon is a cloud of poisonous chlorine gas that is 50\' long, 40\' wide, and 30 feet high. Creatures within the cloud may save versus breath weapon for half damage. The damage done increases with the dragon\'s age: from 2d6+1 to 24d6+12. The damage shown above includes this age-related dice roll}}'},
{name:'Gully-Dwarf-Grovel',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} attempts to\nGrovel\n}}{{splevel=Skill}}{{school=Power}}Specs=[Gully-Dwarf-Grovely,Power,0H,Innate Ability]{{components=S}}{{time=[[0]]}}{{range=Self}}{{duration=Indefinate}}{{aoe=The character}}{{save=None}}SpellData=[w:Gully Dwarf Grovel,sp:0,cs:S]{{effects=If attacked (or at any other time that it might seem beneficial) a Gully Dwarf will grovel and whine in an attempt to avoid injury (probably only to later lie, steal and cheat their way out of the situation). The effectiveness of the grovel will be determined by the DM based on the player\'s role-playing, circumstances, and/or the roll of the dice.}}'},
{name:'Hairy-Spider-Poison',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Hairy Spider Poison}}{{splevel=Innate Ability}}{{school=Poison}}Specs=[Hairy-Spider-Poison,Power,0H,Innate Ability]{{components=S}}{{time=[[0]]}}{{range=Bite}}{{duration=1d4+1 rounds}}{{aoe=Bitten creature}}{{save=None}}{{damage=[Bite](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who has been poisoned?|token_id}|Hairy-Spider-Poison|\\amp#91;[1d4+1]\\amp#93;|-1|Poisoned, Thac0 \\amp AC 1 worse, DX -3|death-zone)}}SpellData=[w:Hairy Spider Poison,sp:0,cs:S]{{effects=This creature can use Hairy Spider poison. Victims receive a +2 bonus to saving throws vs. the hairy spiders\' weak poison. If the saving throw fails, the victim\'s AC and attack rolls are penalized by 1, and Dexterity is penalized by -3 with respect to Dexterity checks. These effects begin one round after the bite and last for 1d4+1 rounds.}}'},
+ {name:'Hell-Hound-Breath',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=Hell Hound Breath}}{{use=**Fire Breath:** Show the [10yrd bolt of fire](!rounds --aoe @{selected|token_id}|bolt|yards|0|10|1|fire) aimed at one creature up to 10 yards away. Then do [[@{selected|hitdice]] HP damage (save. vs breath to halve).}}{{desc=Hell hounds attack first by breathing fire at an opponent up to 10 yards away. The fire causes 1 point of damage for each of the hell hound\'s Hit Dice. A successful saving throw vs. breath weapon cuts the damage in half. The hell hound then attacks with its teeth. The hell hound can continue to exhale flame while biting: if the hell hound rolls a natural 20 on its attack roll, it grabs a victim in its jaws and breathes fire on the victim in the same round.}}'},
{name:'Hide-in-Shadows',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} attempts to\nHide in Shadows\nas a level @{selected|level-class4} @{selected|class4}}}{{splevel=Skill}}{{school=Thieving}}Specs=[Hide-in-Shadows,Power,1H,Innate Ability]{{components=S}}{{time=[[0]]}}{{range=Self}}{{duration=Until attack}}{{aoe=The character}}{{save=None}}{{healing=[Hide in Shadows](!rounds --target caster|@{selected|token_id}|Hide-in-Shadow|99|0|Hiding in Shadows, DM determine success, chance @{selected|hst}pct.|ninja-mask)}}SpellData=[w:Hide in Shadows,sp:0,cs:S]{{effects=The character attempts to move into the shadows and move unseen. This may or may not be successful, and depends on their skill. The DM determines success or otherwise but does not tell the player until it becomes relevant to the character.}}'},
{name:'Hide-in-Woods',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}}{{title=@{selected|casting-name} uses\nHide in Woods\nas a Power}}{{splevel=Power}}{{school=Power}}Specs=[Hide in Woods,Power,1H,Abjuration]{{components=S}}{{time=1 round}}{{range=0}}{{duration=As long as actively hiding}}{{aoe=Caster}}{{save=None}}{{reference=Complete Book of Gnomes \\amp Halflings}}SpellData=[w:Hide in Woods,lv:0,sp:10,cs:S]{{effects=The ability to hide in woods with a chance equal to a thief of the same level’s hide in shadows ability (as per 1e rules, as 2e does not have fixed chances per level).\nThese are:}}'},
{name:'Hold-Breath',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Hold Breath}}{{splevel=Innate Ability}}{{school=Innate Ability}}Specs=[Hold-Breath,Power,1H,Innate Ability]{{components=S}}{{time=[[0]]}}{{range=[[0]]}}{{duration=Special}}{{aoe=Self}}{{save=None}}{{healing=[Hold Breath](!rounds --target caster|@{selected|token_id}|Hold-Breath|\\amp#63;{How many minutes can breath be held?}|-1|Holding Breath|sleepy)}}SpellData=[w:Hold Breat,sp:0,cs:S]{{effects=This creature is able to hold its breath for an unusually long time. For normal rules on holding breath, see the PHB.}}'},
{name:'Hypnosis',type:'Power',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Hypnosis}}{{splevel=Power}}{{school=Enchantment/Charm}}Specs=[Hypnosis,Power,0H,Enchantment-Charm]{{components=S}}{{time=[[1]]}}{{range=Line of sight}}{{duration=[Until Caster Breaks](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who\'s the Victim?|token_id}|Hypnotised|99|0|Hypnotised, do whatever they want|chained-heart) or [1d6 turns](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who\'s the Victim?|token_id}|Hypnotised|\\amp#91;[10*1d6]\\amp#93;|-1|Hypnotised, do whatever they want|chained-heart)}}{{aoe=[[1]] creature}}{{save=vs. paralysation negates}}SpellData=[w:Hypnosis,sp:1,cs:S]{{effects=Many humans and animals attack heways on sight, but it can defend itself with its hypnotic stare, which has a powerful effect; any creature failing a saving throw vs. paralyzation will follow the heway to its lair and allow itself to be devoured. The heway sometimes uses this stare simply to immobilize a menacing creature. It then leaves the area while the hypnotized creature remains stationary for 1d6 turns.}}'},
{name:'Ice-Mephit-Volley',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Ice Mephit uses\nIce Shard Volley}}{{splevel=Breath Weapon}}{{school=Power}}Specs=[Ice-Mephit-Volley,Power,0H,Innate Ability]{{components=S}}{{time=[[0]]}}{{range=[[0]]}}{{duration=Instantaneous}}{{aoe=[15ft cone](!rounds --aoe @{selected|token_id}|cone|feet|0|15|5|cold|true), 1 creature only}}{{save=Halves vs. Breath Weapon}}{{damage=[1d6](!\\amp#13;\\amp#47;gmroll 1d6) save to half}}SpellData=[w:Ice Mephit Volley,sp:0,cs:S]{{effects=Ice mephits may breathe a volley of ice shards three times per day. This volley automatically hits a single victim within 15 feet of the mephit. Damage is 1d6, halved if the victim rolls a successful saving throw.}}'},
+ {name:'Ice-Walking',type:'Power',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Ice Walking**\nas a Power}}Specs=[Ice-Walking,Power,1H,Alteration]{{Speed=[[1]]}}{{Range=0}}SpellData=[w:Ice Walking,sp:1,cs:S]{{Use=Just specify use of the power during initiative, and then use it during the round to display its description}}{{desc=Allows the creature to walk across ice as easily as easily as creatures walk across flat, dry ground.}}'},
+ {name:'Improve-Gem',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} attempts to\n**Improve a Gem**\nusing a *Jewel of Flawlessness*}}Specs=[Improve Gem,Power,1H,Alteration]{{Speed=[[10]]}}{{Range=0}}{{Duration=Permanent}}{{Area of Effect=Jewels in same container with *Jewel of Flawlessness*}}{{save=None}}{{reference=DMG p173}}SpellData=[w:Improve Gem,sp:10,cs:M]{{desc=When a jewel of flawlessness is placed with other gems, it doubles the likelihood of their being more valuable (i.e., the chance for each stone going up in value increases from 10% to 20%). The jewel has from 10-100 facets, and whenever a gem increases in value because of the magic of the jewel of flawlessness (a roll of 2 on d10), one of these facets disappears. When all are gone, the jewel is a spherical stone that has no value.\nValue 1 = $[[1]]}}{{Need to Roll=2}}{{Improvement Roll=[[1d10]]}}{{Result=Need to Roll\\gt=Improvement Roll}}{{successcmd=!magic ~~mi-charges @{selected|token_id}¦-[[$[[1]]-1]]¦Jewel-of-Flawlessness¦¦charged}}'},
{name:'Incite-Rage',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} uses\nIncite Berserker Rage\nas a Power}}{{splevel=Power}}{{school=Enchantment/Charm}}Specs=[Incite-Rage,Power,1H,Enchantment-Charm]{{components=VS}}{{time=[[10]]}}{{range=[[0]]}}{{duration=[6 turns](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who to Incite to Rage?|token_id}|Incite-Rage|60|-1|Raging with +2 on attacks and damage|aura)}}{{aoe=Creature touched}}{{save=None}}{{reference=*The Complete Priest\'s Handbook*, Powers}}SpellData=[w:Incite-Rage,sp:10,cs:VS]{{effects=allows a priest to inspire a fighter (anyone belonging to the warrior class) to a state like berserker rage. The warrior must be willing to have this war-blessing bestowed upon him.\nIt takes one round for a priest to incite a single warrior to berserker rage; the rage last six turns. A priest can use this power on any number of warriors per day, one at a time. A warrior may only be incited to berserker rage once per day; even if a different priest tries it on him, it cannot incite a warrior to a second rage in the same day.\nThe rage isn\'t identical to the abilities of the true berserker (see the description for the berserker in The Complete Fighter\'s Handbook). However, it does give the warrior a +2 to hit and damage for the duration of the rage. While enraged, the warrior cannot flee from a fight; he cannot leave the field of battle until no enemies face him. Once he does leave the field of battle, he can choose whether or not he will emerge from the rage or sustain it; a warrior would sustain it if he felt that another fight was likely to take place soon. When he emerges from the rage, the warrior takes no extra damage or ill effects.\nThis power is most appropriate to priests of the god of war.}}'},
{name:'Indomitable',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Indomitable\n@{selected|token_name} can Save Again}}{{splevel=Innate Power}}{{school=Alteration}}Specs=[Indomitable,Power,1H,Alteration]{{components=S}}{{time=[[0]] and in parallel with other activity}}{{range=[[0]]}}{{duration=Instantanious}}{{aoe=The creature}}{{save=None)}}SpellData=[w:Indomitable,sp:0,cs:S]{{effects=This creature can choose to re-roll a failed saving throw due to his Indomitable nature}}'},
{name:'Inspire-Fear',type:'Power',ct:'4',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} uses\nInspire Fear\nas a Power}}{{splevel=Power}}{{school=Illusion/Phantasm}}Specs=[Inspire-Fear,Power,1H,Illusion-Phantasm]{{components=V, S}}{{time=[[4]]}}{{range=[[0]]}}{{duration=[[@{selected|casting-level}]] rounds}}{{aoe=[60ft. cone, 30ft. at end, 5ft. at base](!rounds --aoe @{selected|token_id}|cone|yards|0|20|10|magic)}}{{save=Negates}}{{damage=[Frighten them](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select first target|token_id}|Inspire-Fear|[[@{selected|casting-level}]]|-1|Frightened, flee at fastest rate from @{selected|Casting-name}|screaming)}}{{reference=*The Complete Priest\'s Handbook*, Powers}}SpellData=[w:Inspire-Fear,sp:4,cs:VS]{{effects=A priest with this power can use it twice per day, and is most appropriate to priests of gods with dark or fearsome aspects: Death, for example.\nSends forth invisible cone of terror. Creatures within area of effect to turn away from the caster and flee.}}'},
@@ -3180,6 +3367,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Leadership',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Leadership}}{{splevel=Power}}{{school=Alteration}}Specs=[Leadership,Power,0H,Alteration]{{components=V}}{{time=[[0]]}}{{range=[30 foot](!rounds --aoe @{selected|token_id}|circle|feet|0|60||light|true)}}{{duration=[[1]] turn}}{{aoe=[[1]] creature or object}}{{save=None}}{{healing=Shout a [Warning](!rounds --target caster|@{selected|token_id}|Leadership|10|-1|Leading, can command ally to add d4 to to-hit or save rolls|fist)}}SpellData=[w:Leadership,sp:0,cs:V]{{desc=For the duration, @{selected|token_name} can shout warnings to any nonhostile creature that it can see within [[30]]ft. of it that makes an attack roll or a saving throw. The creature can add a d4 to its roll provided it can hear and understand the knight. A creature can benefit from only one Leadership die at a time. This effect ends if the knight is incapacitated.}}'},
{name:'Lich-Fear',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Fear of the Lich}}{{splevel=Innate Ability}}{{school=Necromancy}}Specs=[Lich-Fear,Power,1H,Innate Ability]{{components=S}}{{time=[[0]]}}{{range=Line of Sight, no limit}}{{duration=Fleeing for [5d4 rounds](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Who sees the Lich?|token_id}|Lich Fear|\\amp#91;[5d4]\\amp#93;|-1|Fleeing at maximum move away from the Lich!|screaming)}}{{aoe=Line of Sight}}{{save=Negates}}SpellData=[w:Lich Fear,sp:0,pd:-1]{{effects=The mere sight of a Lich at any distance causes any creature with less than 5HD to save vs. spell or flee in panic for 2-20 (5d4) rounds unless a saving throw versus spell is made.}}{{Use=Select the Duration button then select each character that fails to save, using the button that appears in the chat window to prompt for you to select each in turn.}}'},
{name:'Lightning-Stroke',type:'Power',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Lightning Stroke}}{{splevel=Power}}{{school=Alteration}}Specs=[Lightning Stroke,Power,0H,Alteration]{{components=V,M}}{{time=[[2]]}}{{range=[[0]]}}{{duration=Instantanious}}{{aoe=[Lightning Bolt](!rounds --aoe @{selected|token_id}|bolt|feet|0|80|5|lightning)\nor [Lightning Fork](!rounds --aoe @{selected|token_id}|bolt|feet|0|40|10|lightning)\nall creatures within area}}{{save=vs. Staves, for half damage)}}{{damage=[Roll 8d6, 1s as 2s](!\\amp#13;\\amp#47;gr \\amp#91;[{ 1d6, {3} }k1+ { 1d6, {3} }k1+ { 1d6, {3} }k1+ { 1d6, {3} }k1+ { 1d6, {3} }k1+ { 1d6, {3} }k1+ { 1d6, {3} }k1+ { 1d6, {3} }k1]\\amp#93;HP damage)}}SpellData=[w:Lightning Stroke,sp:2,cs:VM]{{effects=A bolt similar to that from a wand of lightning is generated, but it is of 8d6 strength, causing 16-48 points of damage (rolls of 1 are counted as 2) to those who fail a saving throw. The stroke can be single or forked.}}'},
+ {name:'Luck-Bonus',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses\n**Luck Bonus**\nas a Power}}Specs=[Luck Bonus,Power,1H,Abjuration]{{Speed=[[1]]}}{{Range=[[0}]]}SpellData=[w:Luck Bonus,sp:1,cs:S]{{Use=Select the relevant button below, depending on who holds the luck gem}}{{desc=The dragon can cast the *luck bonus* on a gem it holds itself, or on one given to another.}}{{desc1=[Held by dragon](!rounds --movable-aoe @{selected|token_id}|Circle|feet|0|[[10*@{selected|age|max}]]||light|true|@{selected|token_id}|area|luck-bonus|[[60*((3*@{selected|age|max})+1d3)]]|-1|Gets +1 on all saving throws and attribute checks etc|strong) luck for *good* creatures of +1 on saves \\amp similar rolls extends to 10ft radius per age category of the dragon}}{{desc2=[Held by another](!rounds --target single|@{selected|token_id}|@#64;{target|Who becomes lucky?|token_id}|luck-bonus|[[60*((3*@{selected|age|max})+1d3)]]|-1|Gets +1 on all saving throws and attribute checks etc|strong) only applies a *luck bonus* to that individual if they are of a *good* alignment}}'},
{name:'Mist-Mephit-Mist-Ball',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Mist Mephit breathes out \nPutrid Gas Ball}}{{splevel=Breath Weapon}}{{school=Power}}Specs=[Mist Mephit Ball,Power,0H,Breath Weapon]{{components=None}}{{time=1 every 2 rounds}}{{range=[10 ft](!rounds --aoe @{selected|token_id}|circle|feet|0|20|0|acid|true --target caster|@{selected|token_id}|timer|1|-1|Counting down until Mist Ball can be breathed again|stopwatch)}}{{duration=Instantaneous}}{{aoe=1 creature}}{{save=vs. poison negates}}{{damage=Automatic hit [1d4+1](!\\amp#13;\\amp#47;gmroll 1d4+1 choking damage, save negates)HP, and [blinded](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who\'s the victim?|token_id}|blindness|\\amp#91;[1d4]\\amp#93;|-1|Blinded by poison gas, -4 penalty to AC and Attack|bleeding-eye) for 1d4 rounds}}SpellData=[w:Mist Mephit Ball,sp:0,cs:None,pd:3]{{effects=A sickly, green ball of mist, every other round, up to three times an hour. This ball automatically envelopes one victim within 10 feet of the breathing mephit. The victim must roll a successful saving throw vs. poison or suffer 1d4+1 points of choking damage and be blinded for 1d4 rounds.}}{{Use=Display the area of effect using the Range button (also sets timer to count down 1 round to next breath available). Once a victim has failed a save vs. poison, roll damage using the dice roll button, and add the blinding effect using the blinded button and selecting the victim\'s token}}'},
{name:'Move-Silently',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} attempts to\nMove Silently\nas a level @{selected|level-class4} @{selected|class4}}}{{splevel=Skill}}{{school=Thieving}}Specs=[Move-Silently,Power,0H,Innate Ability]{{components=S}}{{time=[[0]]}}{{range=Self}}{{duration=Until attack}}{{aoe=The character}}{{save=None}}{{healing=[Move Silently](!rounds --target caster|@{selected|token_id}|Move-Silently|99|0|Moving Silently, DM determines success, chance @{selected|mst}pct.|ninja-mask)}}SpellData=[w:Move Silently,sp:0,cs:S]{{effects=The character attempts to move totally silently so as not to attract attention. This may or may not be successful, and depends on their skill. The DM determines success or otherwise but does not tell the player until it becomes relevant to the character.}}'},
{name:'Mummy-fear',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Fear of the Mummy}}{{splevel=Innate Ability}}{{school=Necromancy}}Specs=[Mummy-Fear,Power,1H,Innate Ability]{{components=S}}{{time=[[0]]}}{{range=Line of Sight}}{{duration=1d4 rounds}}{{aoe=Line of Sight}}{{save=Negates}}{{damage=[Paralyse with Fear](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select first to haunt|token_id}|Mummy-fear|\\amp#91;[1d4]\\amp#93;|-1|Petrified! Oh Mummy!|screaming)}}SpellData=[w:Mummy Fear,sp:0,cs:S]{{effects=The mere sight of a mummy causes such terror in any creature that a saving throw versus spell must be made or the victim becomes paralyzed with fright for 1 to 4 rounds. Numbers will bolster courage; for each six creatures present, the saving throw is improved by +1. Humans save against mummies at an additional +2.}}'},
@@ -3189,12 +3377,15 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Paladin-lay-on-hands',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} attempts to\nLay on Hands\nas a level @{selected|level-class1} @{selected|class1}}}{{splevel=Power}}{{school=Healing}}Specs=[Paladin-lay-on-Hands,Power,1H,Necromantic]{{components=S}}{{time=[[10]]}}{{range=Touch}}{{duration=Permanent}}{{aoe=[[1]] creature}}{{save=None}}{{reference=PHB p27}}SpellData=[w:Paladin Lay on Hands,sp:10,cs:S]{{effects=A paladin can heal by laying on hands. The paladin restores [[2*@{selected|level-class1}]] hit points. They can heal themselves or someone else, but only once per day.}}'},
{name:'Paralyse',type:'Power',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casts\nParalyse\nas a level @{selected|casting-level} caster}}{{splevel=Monster ability}}{{school=Alteration}}Specs=[Paralyse,Power,1H,Alteration]{{components=S}}{{time=[[2]]}}{{range=Touch}}{{duration=1d4 rounds}}{{aoe=varies}}{{save=Negates}}{{damage=[Paralyse](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select future statues|token_id}|Paralyse|\\amp#91;[\\amp#63;{Duration?|1d4}]\\amp#93;|-1|Paralysed|fishing-net) }}SpellData=[w:Paralyse,sp:2,cs:S]{{effects=A paralysation effect is often caused by monsters attacking the party, and is similar in effect to a \'Hold\' spell}}'},
{name:'Petrification-Gaze-Attack',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} uses a\nPetrification Gaze Attack}}{{splevel=Power}}{{school=Alteration}}Specs=[Petrification Gaze,Power,1H,Alteration]{{components=None}}{{time=[[0]]}}{{range=0}}{{duration=[Permanent](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who is the unfortunate soul?|token_id}|Petrified|99|0|Petrified by a Gaze Attack|padlock)}}{{aoe=When meet gaze, e.g. surprised, if doing attack etc}}{{save=vs. Petrification Negates}}{{reference=DMG p64}}SpellData=[w:Petrification Gaze,sp:0,pd:-1]{{effects=Monsters with a gaze attack, such as the basilisk, have the power to affect an opponent simply by making eye contact. This makes these creatures incredibly dangerous, for the slightest glance can cause great harm.\nCharacters who look directly at such creatures to attack them, or those who are surprised by the creature, automatically meet the creature\'s gaze. These unfortunate characters must make the appropriate saving throw or suffer the effects of the creature\'s attack. Such attackers undergo the gaze attack each round they attack. In large groups, only the front rank can meet the gaze, a fate that can be avoided if the attacker\napproaches from the rear, where the creature cannot see.\nCharacters can also attempt to avoid the gaze by looking in the general direction of the creature without actually looking into its eyes. This enables characters to see the target well enough to fight normally without falling victim to its power. However, there is a 20% chance each round that an attacker trying this trick will accidentally meet the gaze of the creature.\nFinally, a character can completely avert his gaze or close his eyes when attacking the creature, preventing any chance of meeting the creature\'s gaze. This is like fighting in the dark, and the character suffers all the normal penalties for fighting while blinded.}}'},
+ {name:'Plummet',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Plummet**\nas an attack}}Specs=[Plummet,Power,1H,Combat]{{Speed=[[0]]}}{{Range=0}}SpellData=[w:Plummet,sp:0,cs:S]{{Use=Specify use of the power during initiative, and then use it during the round to display its description. Use *bite attacks* for each victim to check if they are crushed, doing damage, then the crushed player must save vs. petrification to see if pinned. If pinned use the [pinned] button to mark the victim}}{{desc=If the DM chooses to allow plummets, an airborne dragon, or a dragon jumping and descending from at least 30 feet above a target, can land on a victim. The dragon crushes and pins opponents using its claws and tail, inflicting damage equal to its bite. The dragon can crush as many creatures as its combat modifier / age value, in this case [[@{selected|age|max}]]. The dragon rolls a separate attack against each creature affected (use the *bite* attack). Creatures that are missed are assumed to have escaped. Creatures that are crushed must roll successful saving throws vs. petrification or be [pinned](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Who is successfully pinned?|token_id}|Pinned|99|0|Pinned by a dragon and taking crushing damage equal to bite damage|fishing-net) under the dragon, automatically suffering crushing damage during the next round unless the dragon moves off them. If the dragon chooses to maintain the pin, the victims must roll successful saving throws vs. petrification to get free. The dragon\'s combat modifier of [[@{selected|strengthdmg}]] applies as a penalty to all saving throw vs. the crush. A dragon cannot take any other actions when plummeting or pinning.}}'},
{name:'Prestidigitation',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Prestidigitation}}{{splevel=Cantrip}}{{school=Alteration}}Specs=[Prestidigitation,Power,1H,Alteration]{{components=V,S}}{{time=[[0]]}}{{range=[[10]] feet}}{{duration=Up to [[1]] hour}}{{aoe=Special}}{{save=None}}SpellData=[w:Prestidigitation,sp:0,cs:VS]{{effects=This spell is a minor magical trick that novice spellcasters use for practice. You create one of the following magical effects within range: You create an instantaneous, harmless sensory effect, such as a shower of sparks, a puff of wind, faint musical notes, or an odd odour. You instantaneously light or snuff out a candle, a torch, or a small campfire. You instantaneously clean or soil an object no larger than 1 cubic foot. You chill, warm, or flavour up to 1 cubic foot of non-living material for 1 hour. You make a colour, a small mark, or a symbol appear on an object or a surface for 1 hour. You create a nonmagical trinket or an illusory image that can fit in your hand and that lasts until the end of your next turn. If you cast this spell multiple times, you can have up to three of its non-instantaneous effects active at a time, and you can dismiss such an effect as an action.}}'},
{name:'Prophesy',type:'Power',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} attempts to make a\nProphesy\nusing a Power}}{{splevel=Class Ability}}{{school=Divination}}Specs=[Prophesy,Power,1H,Divination]{{components=None}}{{time=[10 turns meditating](!rounds --target caster|@{selected|token_id}|Prophesy|100|-1|Meditating - do not disturb|stopwatch) *(click to start)*}}{{range=0}}{{duration=Special}}{{aoe=Special}}{{save=None}}{{Reference=*The Complete Priest\'s Handbook*, Powers}}SpellData=[w:Prophesy,sp:1,cs:None]{{effects=With this power, the priest can sometimes see visions of the future. The priest sinks into a meditative trance and try to receive visions of the future. This trance lasts ten turns; if the priest is interrupted before the ten turns are done (struck with a weapon, shouted at by someone within six feet of him, or knocked over), the trance is prematurely broken and the priest gets no vision.\nIt is sometimes possible for the priest to receive visions without trying - their god may foist one on them.}}'},
{name:'Purify-Water',type:'Power',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|Casting-name} has\nPurify Water\nas a Power cast at @{selected|Casting-Level} level}}{{splevel=Power}}{{school=Alteration}}Specs=[Purify-Water,Power,1H,Alteration]{{components=None}}{{time=[[5]]}}{{range=30 yds}}{{duration=Permanent}}{{aoe=[@{selected|casting-level} cu. ft.](!rounds --aoe @{selected|token_id}|rectangle|feet|90|||blue)}}{{save=None}}SpellData=[w:Purify-Water,lv:1,sp:5,gp:0]{{effects=Makes spoiled, rotten, poisonous, or otherwise contaminated water pure and suitable for drinking. Up to 1 cubic foot of water per level can be thus made suitable for consumption. This spell does not prevent subsequent natural decay or spoilage. Unholy water is spoiled by purify water, but the power has no effect on creatures of any type nor upon magical potions.}}'},
{name:'Quasit-Fear',type:'Power',ct:'4',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} uses their\nFear power}}{{splevel=Quasit power}}{{school=Illusion/Phantasm}}Specs=[Quasit-Fear,Power,0H,Illusion-Phantasm]{{components=None}}{{time=[[4]]}}{{range=[[0]]}}{{duration=[[3]] rounds}}{{aoe=[30ft. radius](!rounds --aoe @{selected|token_id}|circle|feet|0|60||acid|true)}}{{save=Negates}}{{damage=[Frighten them](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select first target|token_id}|Fear|3|-1|Frightened, flee at fastest rate from @{selected|Casting-name}|screaming)}}SpellData=[w:Quasit Fear,sp:4,cs:None]{{effects=Sends forth invisible circle of terror. Creatures within area of effect turn away from the caster and flee. Affected creatures are likely to drop whatever they are holding; base chance is [[60]]% at 1st level/1HD, each level/HD above reduces probability by [[5]]%. Creatures affected flee at fastest rate for 3 rounds. Undead and successful saves vs. spell are not affected.}}'},
{name:'Rage',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} starts\nRaging\nas a level @{selected|level-class1} Barbarian}}{{splevel=Power}}{{school=Barbarian}}Specs=[Rage,Power,0H,Innate Ability]{{components=S}}{{time=[[0]]}}{{range=Self}}{{duration=[[10]] Rounds Rage, then [[10]] Rounds recovery}}{{aoe=Self}}{{save=None}}{{healing=[Rage!](!rounds --target caster|@{selected|token_id}|Rage|10|-1|RAGE +2 bonus on att+dam+AC|overdrive)}}SpellData=[w:Rage,sp:0,cs:S]{{effects=This Barbarian may "Rage" [[{ceil(@{selected|level-class1}/4),3}kl1]] times a day for [[10]] melee rounds. When raging his AC, Thac0 and Damage all improve by [[2]]. When raging he gains [[15]] temporary hit points. After the 10 melee rounds he loses those. If that would take him below zero, he falls unconscious. He does not attack team-mates when raging but does not accept surrender from enemies. After raging if still conscious he is winded and his THAC0 AC and Damage decrease by [[0-2]] for [[10]] rounds. While Raging he is immune to *Sleep, Charm, Fear, Confusion, Level Drain, Maze, Stun, Imprisonment, Feeblemind* and *Hold* spells.\nIf desired, to end Rage early after melee use "View Powers" to view "Rage", then use\n[End Current Rage](!rounds --removetargetstatus @{selected|token_id}|Rage) or\n[End Exhaustion](!rounds --removetargetstatus @{selected|token_id}|Exhausted)}}'},
+ {name:'Rakshasa-Illusion',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} uses\nRakshasa Illusion}}{{splevel=Power}}{{school=Innate Ability}}Specs=[Rakshasa Illusion,Power,0H,Innate Ability]{{components=None}}{{time=[[0]]}}{{range=Line of sight}}{{duration=Terminates if Rakshasa attacks}}{{aoe=[1 creature](!rounds --target single|@{selected|token_id|\\amp#64;{target|Who is fooled by the Rakshasa\'s illusion?|token_id}|Some Effect|99|0|Some sort of effect - not sure what|spanner)}}{{save=Disbelieve as per *illusion*}}{{use=Use the Area of Effect button to target and mark the victim the Rakshasa has selected}}SpellData=[w:Rakshasa Illusion,sp:0]{{effects=Rakshasas savor fresh human meat and use illusions to get it. They have a limited form of *ESP* which allows them to disguise themselves as someone the victim trusts; the rakshasa uses this illusion as a lure and strikes when the victim is most unprepared. The rakshasa must drop the illusion when it attacks.}}'},
{name:'Rangers-Animal-Friendship',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} attempts to use\nRanger\'s Animal Friendship\nas a Power}}{{splevel=Class Ability}}{{school=Enchantment-Charm}}Specs=[Rangers-Animal-Friendship,Power,1H,Enchantment-Charm]{{components=None}}{{time=[[10]]}}{{range=[10 feet](!rounds --aoe @{selected|token_id}|circle|feet|0|20||magic|true)}}{{duration=Special}}{{aoe=Special}}{{save=Negates. Save vs Rod at a [[0-ceil(@{selected|casting-level}/3)]] penalty}}{{Reference=PHB p29}}SpellData=[w:Rangers-Animal-Friendship,sp:10,cs:None]{{effects=Rangers are adept with both trained and untamed creatures, having a limited degree of animal empathy. If a ranger carefully approaches or tends any natural animal, he can try to modify the animal\'s reactions. (A natural animal is one that can be found in the real world -- a bear, snake, zebra, etc.)\nDomestic or non-hostile animals can be approached and befriended automatically.\nWild and attack-trained animals roll a saving throw vs. rods with a -1 penalty per three levels of the Ranger. If failed, the creature\'s reaction can be shifted one category as the ranger\nchooses.}}'},
+ {name:'Red-Dragon-Breath',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=Red }}{{title=Dragon Breath}}{{use=Show the [90ft x 30ft cone](!rounds --aoe @{selected|token_id}|cone|feet|0|90|30|Fire --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) which also sets the recovery counter. Then do [[(@{selected|age|max}*2)d10+@{selected|age|max}]] HP damage (save. vs breath to halve}}{{desc=A red dragon\'s breath weapon is a searing cone of fire 90\' long, 5\' wide at the dragon\'s mouth and 30\' at the base. Creatures struck by the flames must save versus breath weapon for half damage. The damage done increases with the dragon\'s age: from 2d10+1 to 24d10+12. The damage shown above includes this age-related dice roll}}'},
{name:'Regenerate',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} Regenerates HP}}{{splevel=Innate Power}}{{school=Necromancy}}Specs=[Regenerate,Power,0H,Necromancy]{{components=S}}{{time=[[0]] and in parallel with other activity}}{{range=[[0]]}}{{duration=Instantanious}}{{aoe=The creature}}{{save=None)}}{{healing=[Regenerates @{selected|conregen}HP](!modbattr --fb-header Regenerating --fb-content @{selected|token_name} regenerates _TCUR0_ HP and now has _CUR0_ HP --charid @{selected|character_id} --hp|@{selected|conregen}) or [Regen every round](!rounds --target caster|@{selected|token_id}|Regeneration|99|0|Regenerating at @{selected|conregen}HP per round|strong)}}SpellData=[w:Regenerate,sp:0,cs:S]{{effects=This creature can regenerate damage up to their maximum HP at the rate of [[@{selected|conregen}]] per use of the Power}}'},
{name:'Resurrection-Rod',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.wandTemplate+'}{{title=Rod of Resurrection}}{{subtitle=Rod}}Specs=[Rod of Resurrection,Power,1H,Necromancy]{{components=V,M}}{{time=1 turn}}SpellData=[w:Rod of Resurrection,sp:10,cs:VM]{{range=Touch}}{{desc=This rod enables a cleric to [resurrect the dead](!magic --mi-charges @{selected|token_id}|-\\amp#63;{What Race?|Dwarf,3|Elf,4|Gnome,3|Half-elf,2|Halfling,2|Human,1}-\\amp#63;{What Class?|Cleric,1|Druid,2|Fighter,2|Paladin,1|Ranger,2|Mage,3|Illusionist,3|Thief,3|Bard,2}|Rod of Resurrection|||There are enough charges to attempt this resurrection, and these have been expended. Now roll for Resurrection Survival.) - even elven, dwarven, gnome, or halfling - as if he were of high enough level to cast the resurrection spell. No rest is required, as the rod bestows the life giving effects.\nThe rod can be used once per day. The number of charges used to resurrect a character depends on class and race. Total the number of charges indicated for the character\'s class\nand race:\n\\amplt;table\\ampgt;\\amplt;thead\\ampgt;\\amplt;th scope="col"\\ampgt;Class\\amplt;/th\\ampgt;\\amplt;th scope="col"\\ampgt;Charges\\amplt;/th\\ampgt;\\amplt;th scope="col"\\ampgt;Race\\amplt;/th\\ampgt;\\amplt;th scope="col"\\ampgt;Charges\\amplt;/th\\ampgt;\\amplt;/thead\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;Cleric\\amplt;/td\\ampgt;\\amplt;td\\ampgt;1\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Dwarf\\amplt;/td\\ampgt;\\amplt;td\\ampgt;3\\amplt;/td\\ampgt;\\amplt;/th\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;Druid\\amplt;/td\\ampgt;\\amplt;td\\ampgt;2\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Elf\\amplt;/td\\ampgt;\\amplt;td\\ampgt;4\\amplt;/td\\ampgt;\\amplt;/th\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;Fighter\\amplt;/td\\ampgt;\\amplt;td\\ampgt;2\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Gnome\\amplt;/td\\ampgt;\\amplt;td\\ampgt;3\\amplt;/td\\ampgt;\\amplt;/th\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;Paladin\\amplt;/td\\ampgt;\\amplt;td\\ampgt;1\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Half-elf\\amplt;/td\\ampgt;\\amplt;td\\ampgt;2\\amplt;/td\\ampgt;\\amplt;/th\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;Ranger\\amplt;/td\\ampgt;\\amplt;td\\ampgt;2\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Halfling\\amplt;/td\\ampgt;\\amplt;td\\ampgt;2\\amplt;/td\\ampgt;\\amplt;/th\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;Mage\\amplt;/td\\ampgt;\\amplt;td\\ampgt;3\\amplt;/td\\ampgt;\\amplt;td\\ampgt;Human\\amplt;/td\\ampgt;\\amplt;td\\ampgt;1\\amplt;/td\\ampgt;\\amplt;/th\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;Illusionist\\amplt;/td\\ampgt;\\amplt;td\\ampgt;3\\amplt;/td\\ampgt;\\amplt;/th\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;Thief\\amplt;/td\\ampgt;\\amplt;td\\ampgt;3\\amplt;/td\\ampgt;\\amplt;/th\\ampgt;\\amplt;tr\\ampgt;\\amplt;td\\ampgt;Bard\\amplt;/td\\ampgt;\\amplt;td\\ampgt;2\\amplt;/td\\ampgt;\\amplt;/th\\ampgt;\\amplt;/table\\ampgt;\nMulti-classed characters use the least favorable category. The rod cannot be recharged.}}{{Use=Now, use the [resurrect the dead] button to attempt the resurection}}'},
{name:'Rite-of-Arcs-Dilemma',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} casts\nThe Rite of Arc\'s Dilemma\nas a level @{selected|casting-level} caster}}{{splevel=Level 7 Wizard}}{{school=Alteration}}{{components=V, S}}{{time=[[1]] day per level transferred}}{{range=[[0]]}}{{duration=Permanent}}{{aoe=Caster}}{{save=None}}{{effects=A ritual that will allow reassignment of experience between classes. The subject of the casting must undertake the ritual for 1 hour each day for as many days as levels to be gained. Each day, the subject must roll percentile dice to see if the rite has been performed correctly, the chance of it working being 70% + the subject\'s Intelligence score (max 90%). If the check fails, no more performances of the rite at this level will work, and as per the specification of the Tome the avatar of Math Mathonwy may appear and attempt to reclaim the Tome (20% + 5% chance per level successfully being reassigned, max 90% chance - see AD\\ampD Legends \\amp Lore - Celtic Mythos for details of the avatar). Another attempt can be made as the subject gains levels of experience in the normal way.\nThe subject loses 1 level per day from the original class and gains 1 level per day in the new class up to the number transferred - this does not include any necessary training: the subject will need to locate and organise their own training in the necessary skills. \nThe DM may rule that action may need to be taken to pay penance for the loss of the class whose levels have been reduced: a Priest may need to *atone* to their (ex-) god or priesthood, a Rogue pay reparations to their guild for the lost talent and income, etc.}}'},
@@ -3205,17 +3396,25 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'RoSS-Spark-Shower',type:'ItemPower',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} casts\nShooting Stars\nfrom a Ring of Shooting Stars}}{{school=Evocation}}{{splevel=Power}}Specs=[RoSS-Spark-Shower,ItemPower,1H,Evocation]{{components=S}}{{time=[[5]]}}{{range=[[0]]}}{{duration=Instantaneous}}{{aoe=[Cone 20ft long, 10ft at end](!rounds --aoe @{selected|token_id}|cone|feet|0|20|10|light|true)}}{{save=None)}}{{damage=Metal worn/held [4d4](!\\amp#13;\\amp#47;r 4d4 HP from sparks), otherwise [2d8](!\\amp#13;\\amp#47;r 2d8 HP from sparks) HP from sparks}}{{damagetype=Electrical}}SpellData=[w:RoSS Spark Shower,sp:5,cs:S]{{effects=The *spark shower* is a flying cloud of sizzling purple sparks, which fan out from the ring for a distance of 20 feet to a breadth of 10 feet. Creatures within this area take 2d8 points of damage each if no metal armor is worn and/or no metal weapon is held. Characters wearing metal armor or carrying a metal weapon receive 4d4 points of damage.}}'},
{name:'Serpentine-Giant-Owl',type:'Power',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} uses\nFigurine of the Serpentine Owl\n(Giant Owl)}}{{splevel=Magic Item}}{{school=Conjuration/Summoning}}Specs=[Serpentine Giant Owl,Power,1H,Conjuration-Summoning]{{components=V,M}}{{time=[[3]]}}{{range=[[0]]}}{{duration=8 hours}}{{aoe=Figurine}}{{save=None}}SpellData=[w:Serpentine Giant Owl,sp:3,cs:VM]{{effects=Speaking the command work transforms the *Figurine of the Serpentine Owl* (a *Figurine of Wonderous Power*) into a *Giant Owl*. Ask the GM to *Drag \\amp Drop* a *Giant Owl* onto the map from the *Creature Database*. Note that this can only be done 3 times before the figurine loses all magical properties}}'},
{name:'Shapechange',type:'Power',ct:'9',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} uses\nShape Change\nas a Power}}{{splevel=Power}}{{school=Alteration}}Specs=[Shapechange,Power,1H,Alteration]{{components=V,S}}{{time=[[9]]}}{{range=[[0]]}}{{duration=[[[@{selected|casting-level}]] turns](!rounds --target caster|@{selected|token_id}|Shapechange-Power|[[10*@{selected|casting-level}]]|-1|Masqurading as a different natural creature|aura)}}{{aoe=The caster}}{{save=None}}{{reference=PHB p37}}SpellData=[w:Shapechange,sp:9,cs:VS]{{effects=A druid (or other priest) gains the ability to shapechange into a reptile, bird, or mammal up to three times per day after he reaches 7th level. Each animal form (reptile, bird, or mammal) can be used only once per day. The size can vary from that of a bullfrog or small bird to as large as a black bear. Upon assuming a new form, the druid heals 10-60% (1d6 _ 10%) of all damage he has suffered (round fractions down). The druid can only assume the form of a normal (real world) animal in its normal proportions, but by doing so he takes on all of that creature\'s characteristics -- its movement rate and abilities, its Armor Class, number of attacks, and damage per attack.\nThe druid\'s clothing and one item held in each hand also become part of the new body; these reappear when the druid resumes his normal shape. The items cannot be used while the druid is in animal form.}}'},
+ {name:'Silver-Dragon-Breath',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=Silver}}{{title=Dragon Breath}}{{use=**Cone of Cold:** Show the [80ft x 30ft cone](!rounds --aoe @{selected|token_id}|cone|feet|0|80|30|cold --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) which also sets the recovery counter. Then do [[(@{selected|age|max}*2)d10+@{selected|age|max}]] HP damage (save. vs breath to halve).\n**Paralysation Gas:** Show a [50ft x 40ft](!rounds --aoe @{selected|token_id}|rectangle|feet|0|50|40|magic --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) x 20ft high cloud of gas, save vs. breath weapon or [be paralysed](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Which creature is paralysed?|token_id}|paralysed|99|0|Paralysed by the breath of a *Silver Dragon*|padlock).}}{{desc=A silver dragon has two breath weapons: a cone of cold 80\' long, 5\' wide at the dragon\'s mouth, and 30\' wide at the end or a cloud of paralyzation gas 50\' long, 40\' wide, and 20\' high. Creatures caught in the cold are allowed a save versus breath weapon for half damage.Creatures caught in the *cold* take damage, save vs. breath weapon for half.}}'},
{name:'Smoke-Mephit-Soot-ball',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Smoke Mephit breathes out \na Sooty Ball}}{{splevel=Breath Weapon}}{{school=Power}}Specs=[Smoke Mephit Ball,Power,0H,Breath Weapon]{{components=None}}{{time=1 every 2 rounds}}{{range=[20 ft](!rounds --aoe @{selected|token_id}|circle|feet|0|40|0|acid|true --target caster|@{selected|token_id}|timer|1|-1|Counting down until Soot Ball can be breathed again|stopwatch)}}{{duration=Instantaneous}}{{aoe=1 creature}}{{save=None}}{{damage=Automatic hit [1d4](!\\amp#13;\\amp#47;gmroll 1d4+1 HP damage)HP, and [blinded](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who\'s the victim?|token_id}|blindness|\\amp#91;[1d2]\\amp#93;|-1|Blinded by soot, -4 penalty to AC and Attack|bleeding-eye) for 1d2 rounds}}SpellData=[w:Smoke Mephit Ball,sp:0,cs:None,pd:-1]{{effects=A sooty ball usable every other melee round, with no limit on the number of times it can be used in a day. The sooty ball automatically strikes one creature of the mephit\'s choice within 20 feet, causing ld4 points of damage and blinding the victim for 1-2 rounds. No saving throw is permitted.}}{{Use=Display the area of effect using the Range button (also sets timer to count down 1 round to next breath available). Then roll damage using the dice roll button, and add the blinding effect using the blinded button and selecting the victim\'s token}}'},
{name:'Snake-Poison-Type-3',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Snake Poison (type 3)}}{{splevel=Innate Ability}}{{school=Poison}}Specs=[Snake-Poison-Type-3,Power,0H,Innate Ability]{{components=S}}{{time=[[0]]}}{{range=Bite}}{{duration=2d6 rounds}}{{aoe=Bitten creature}}{{save=Negates}}{{damage=[Bite](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who has been poisoned?|token_id}|Snake-Poison-3|\\amp#91;[2d6]\\amp#93;|-1|Poisoned, will damage by 2d4hp if not neutralised|death-zone)}}SpellData=[w:Snake Poison Type 3,sp:0,cs:S]{{effects=All poisonous snakes deliver toxins automatically through their bite. Typical varieties of poisonous snakes include the asp, cobra, copperhead, coral snake, death adder, krait, mamba, puff adder, rattlesnake, sidewinder, and water moccasin.\nThis particular type of poison has a delayed action, causing 2d4 damage after 2d6 rounds if not neutralised.\nSome cobras and sidewinders hunt by night and can track warmblooded prey by body heat as well as by sight. They have the equivalent of 30-foot infravision. Black mambas are the fastest known snakes and can reach 30 across open ground.}}'},
+ {name:'Snatch',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Snatch**\nas an attack}}Specs=[Snatch,Power,1H,Combat]{{Speed=[[0]]}}{{Range=0}}SpellData=[w:Snatch,sp:0,cs:S]{{Use=Just specify use of the power during initiative, and then use it during the round to display its description}}{{desc=Only young adult and older dragons can snatch. This occurs when a flying dragon dives and attempts to grab a creature in one of its claws. A creature struck by this method is taken into the air. There is a 50% chance that a snatched creature has its arms pinned, and therefore cannot physically attack the dragon. Snatched creatures are sometimes taken to great heights and dropped. The snatched creature can be squeezed in the claw for automatic claw damage each round, or transferred to the dragon\'s mouth (the transfer requires a successful attack roll). If the transfer succeeds, the victim automatically suffers bite damage each round; if it fails, the victim is dropped. Dragons of age *old* and older can carry a victim in each claw, and they can try to snatch two victims at once. *Wyrms* and *great wyrms* can carry three victims, but one of the first two snatched must be transferred from claw to mouth before the third can be snatched.\nA dragon can snatch creatures two or more size categories smaller than itself. For example, a dragon that is 45\' long is a Gargantuan creature, so the biggest creature it can snatch is a Large one (12\' long).}}'},
{name:'Soothing-Word',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|casting-name} uses\nSoothing Word\nas a Power}}{{splevel=Power}}{{school=Enchantment/Charm}}Specs=[Soothing-Word,Power,0H,Enchantment-Charm]{{components=V}}{{time=[[10]]}}{{range=[[0]]}}{{duration=Permanent or as determined by DM)}}{{aoe=[[1]] creature or [[2*@{selected|casting-level}]] creatures}}{{save=Special}}{{reference=*The Complete Priest\'s Handbook*, Powers}}SpellData=[w:Soothing Word,sp:10,cs:V]{{effects=The priest can remove the effects of the fear spell or can sway the attitude of a hostile crowd or mob.\nThe priest can use this power three times per day. A single use can either: Dispel one application of the fear spell on one victim; eliminate one warrior\'s berserker rage; or momentarily calm down a number of characters or monsters (equal to 2x the priest\'s experience level in hit dice; therefore an 8th level priest could momentarily calm 16 HD of angry mob, for instance).\nThis power is primarily useful for getting the attention of an angry group of people and allowing the priest to address them. The combination of the soothing word , the respect that many cultures have for their priests, and the speaking abilities of many priests can often defuse an angry mob.}}'},
+ {name:'Sound-Imitation',type:'Power',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Sound Imitation**\nas a Power}}Specs=[Sound-Imitation,Power,1H,Illusion]{{Speed=[[1]]}}{{Range=0}}SpellData=[w:Sound Imitation,sp:1,cs:S]{{Use=Just specify use of the power during initiative, and then use it during the round to display its description}}{{desc=This creature can imitate any sound it has previously heard, but can only imitate a voice if it can speak a language it knows. This capability is very useful when combined with *Ventriloquism*}}'},
{name:'Spectator-Cause-Serious-Wounds',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Sectator Guardian casts\nCause Serious Wounds}}{{splevel=Spectator Guardian}}{{school=Necromancy}}{{sphere=Healing (Reversed)}}{{components=None}}{{time=[[7]]}}{{range=[[60]] yards}}{{duration=Instantaneous}}{{aoe=1 Creature}}{{save=Half Damage}}{{damage=[2d8+3](!\\amp#13;\\amp#47;gmroll 2d8+3 HP damage)}}{{effects=Spectator Guardian Beholder-kin uses its 2nd minor eye to cast a special Cause Serious Wounds, which inflicts 2d8+3 points of damage to a single being at a range of 60 yards; a saving throw vs. spell is allowed for half damage}}'},
{name:'Spectator-Create-F+W',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Sectator Guardian casts\nCreate Food and Water}}{{splevel=Spectator Guardian}}{{school=Alteration}}{{sphere=Creation}}{{components=None}}{{time=[[1]]round}}{{range=[[10]] yards}}{{duration=Special}}{{aoe=Meal for 6 with water to drink}}{{save=None}}{{effects=Causes food and water to appear. The food thus created is highly nourishing if rather bland, enough for 6 people. The food decays and becomes inedible within 24 hours, although it can be restored for another 24 hours by casting a purify food and water spell upon it. The water created by this spell is the same as that created by the 1st-level priest spell create water.}}'},
{name:'Spectator-Paralysation-Ray',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Sectator Guardian casts\nParalyzation Ray}}{{splevel=Spectator Guardian}}{{school=Enchantment/Charm}}{{components=None}}{{time=[[0]] innate attack}}{{range=[[90]] feet}}{{duration=[8d4](!\\amp#13;\\amp#47;gmroll 8d4 rounds of paralysation) rounds}}{{aoe=1 Creature}}{{save=Negates}}{{effects=Spectator Guardian Beholder-kin uses its 3rd minor eye to cast a special Paralysation Ray against 1 creature, causing paralysis for 8d4 rounds. The Spectator will attempt to then telepathically reason with the creature(s) so paralysed to retain it\'s treasure}}'},
{name:'Spectator-Spell-Reflection',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Sectator Guardian casts\nSpell Reflection}}{{splevel=Spectator Guardian}}{{school=Abjuration}}{{components=None}}{{time=[[0]] innate power}}{{range=[[0]]}}{{duration=Continuous}}{{aoe=1 Spell per Round}}{{save=Reflects}}{{effects=Spectator Guardian Beholder-kin uses its **undamaged** main eye to *Reflect* [[1]] spell per round. \nThis powerful abjuration causes spells cast against the wizard to rebound on the original caster. This includes spells cast from scrolls and innate spell-like abilities, but specifically excludes the following: area effects that are not centered directly upon the protected wizard, spell effects delivered by touch, and spell effects from devices such as wands, staves, etc. Thus, a light spell cast to blind the protected wizard could be turned back upon and possibly blind the caster, while the same spell would be unaffected if cast to light an area within which the protected wizard is standing.\nIf the protected wizard and a spellcasting attacker both have spell turning effects operating, a resonating field is created that has the following effects:\n\n**D100 Roll Effect**\n**01-70** Spell drains away without effect\n**71-80** Spell affects both equally at full damage\n**81-97** Both turning effects are rendered nonfunctional for [1d4](!\\amp#13;\\amp#47;gmroll 1d4) turns\n**98-00** Both casters go through a rift into the Positive Energy plane}}'},
{name:'Spectator-Telepathy',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Sectator Guardian casts\nTelepathy}}{{splevel=Spectator Guardian}}{{school=Divination}}{{components=None}}{{time=[[0]] innate power}}{{range=[[120]] feet}}{{duration=Continuous}}{{aoe=1 Creature}}{{save=Negates Suggestion}}{{effects=Spectator Guardian Beholder-kin uses its 4th minor eye to establish a Telepathic link with 1 creature. It will almost always attempt to immediately use [*Suggestion*](!magic --display-ability @{selected|token_id}|MU-Spells-DB|Suggestion) to implant *"leave in peace"* if the target does not save vs. spell. If the save is made, the Spectator will attempt to telepathically reason with the creature to retain the treasure it is protecting.}}'},
{name:'Spit-Poison',type:'Innate-Ranged|Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Spit Poison}}{{splevel=Power}}{{school=Enchantment/Charm}}Specs=[Spit Poison,Innate-Ranged|Power,0H,Spit Poison]{{components=S}}SpellData=[w:Spit Poison,sp:0,cs:S]{{time=0}}ToHitData=[w:Spit Poison,+:0,sb:0,equip:prime,n:1,ch:20,cm:1,sz:T,ty:SPB,sp:0]{{range=30ft, Line of sight}}AmmoData=[w:Snake Poison 1-4,st:Spit Poison,ru:2,msg:**Don\'t make saving throw now!** First \\lbrak;apply poison\\rbrak;\\lpar;!rounds --target single\\vbar;\\at;{selected\\vbar;token_id}\\vbar;\\amp#64;{target\\vbar;Who is the Unfortunate Victim?\\vbar;token_id}\\vbar;Poison Snake 1-4_Not quite right\\vbar;\\amp#91;\\lbrak;8+3d10\\rbrak;\\amp#93;\\vbar;-1\\vbar;That bite was quite painful. Should I see a Cleric?\\vbar;stopwatch\\rpar; ],[w:Snake Poison 5-6,st:Spit Poison,ru:2,msg:**Don\'t make saving throw now!** First \\lbrak;apply poison\\rbrak;\\lpar;!rounds --target single\\vbar;\\at;{selected\\vbar;token_id}\\vbar;\\amp#64;{target\\vbar;Who is the Unfortunate Victim?\\vbar;token_id}\\vbar;Poison Snake 1-4_Not quite right\\vbar;\\amp#91;\\lbrak;1+1d4\\rbrak;\\amp#93;\\vbar;-1\\vbar;That bite was quite painful. Should I see a Cleric?\\vbar;stopwatch\\rpar;],[w:Snake Poison 7-11,st:Spit Poison,ru:2,msg:**Don\'t make saving throw now!** First \\lbrak;apply poison\\rbrak;\\lpar;!rounds --target single\\vbar;\\at;{selected\\vbar;token_id}\\vbar;\\amp#64;{target\\vbar;Who is the Unfortunate Victim?\\vbar;token_id}\\vbar;Poison Snake 7-11_Not quite right\\vbar;\\amp#91;\\lbrak;2d6\\rbrak;\\amp#93;\\vbar;-1\\vbar;That bite was quite painful. Should I see a Cleric?\\vbar;stopwatch\\rpar;],[w:Snake Poison 12-14,st:Spit Poison,ru:2,msg:**Don\'t make saving throw now!** First \\lbrak;apply poison\\rbrak;\\lpar;!rounds --target single\\vbar;\\at;{selected\\vbar;token_id}\\vbar;\\amp#64;{target\\vbar;Who is the Unfortunate Victim?\\vbar;token_id}\\vbar;Poison Snake 12-14_Not quite right\\vbar;\\amp#91;\\lbrak;1d6\\rbrak;\\amp#93;\\vbar;-1\\vbar;That bite was quite painful. Should I see a Cleric?\\vbar;stopwatch\\rpar;],[w:Snake Poison 15-17,st:Spit Poison,ru:2,msg:**Don\'t make saving throw now!** First \\lbrak;apply poison\\rbrak;\\lpar;!rounds --target single\\vbar;\\at;{selected\\vbar;token_id}\\vbar;\\amp#64;{target\\vbar;Who is the Unfortunate Victim?\\vbar;token_id}\\vbar;Poison Snake 15-17_Not quite right\\vbar;\\amp#91;\\lbrak;2d4\\rbrak;\\amp#93;\\vbar;-1\\vbar;That bite was quite painful. Should I see a Cleric?\\vbar;stopwatch\\rpar;],[w:Snake Poison 18-19,st:Spit Poison,ru:2,msg:**Don\'t make saving throw now!** First \\lbrak;apply poison\\rbrak;\\lpar;!rounds --target single\\vbar;\\at;{selected\\vbar;token_id}\\vbar;\\amp#64;{target\\vbar;Who is the Unfortunate Victim?\\vbar;token_id}\\vbar;Poison Snake 18-19_Not quite right\\vbar;\\amp#91;\\lbrak;1d4\\rbrak;\\amp#93;\\vbar;-1\\vbar;That bite was quite painful. Should I see a Cleric?\\vbar;stopwatch\\rpar;],[w:Snake Poison 20,st:Spit Poison,ru:2,msg:**Don\'t make saving throw now!** First \\lbrak;apply poison\\rbrak;\\lpar;!rounds --target single\\vbar;\\at;{selected\\vbar;token_id}\\vbar;\\amp#64;{target\\vbar;Who is the Unfortunate Victim?\\vbar;token_id}\\vbar;Poison Snake 20_Not quite right\\vbar;\\amp#91;\\lbrak;1\\rbrak;\\amp#93;\\vbar;-1\\vbar;That bite was quite painful. Should I see a Cleric?\\vbar;stopwatch\\rpar;]{{duration=Depends on poison type}}RangeData=[t:Spitting Snake,r:1/2/3]{{aoe=[[1]] creature}}{{save=vs. poison with varying bonus/penalty negates}}{{effects=Spitting varieties of snakes bite their victims and can shoot poisonous spittle at a single target within 30 feet. Their poison is identical to normal poisonous snakes (see above). Typical species include the African spitting cobra, which can spit up to 15 feet. Its spittle can blind victims that fail a saving throw vs. poison. The blindness wears off after 2-12 hours.}}'},
+ {name:'Stall',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Stall**\nas an attack}}Specs=[Stall,Power,1H,Combat]{{Speed=[[0]]}}{{Range=0}}SpellData=[w:Stall,sp:0,cs:S]{{Use=Just specify use of the power during initiative, and then use it during the round to display its description}}{{desc=Any dragon flying near the ground can halt its forward motion and hover for one round; it must land immediately thereafter. Once stopped, the dragon can attack with its bite and all four legs. It can use its breath weapon instead, but this rarely happens since dragons can breathe on the wing. If a dragon stalls in an area with lots of trees or loose earth, the draft from its wings creates a dust cloud with the [same radius](!rounds --aoe @{selected|token_id}|circle|yards|0|[[({ { { {(@{selected|age|max}-4)},{0} }kh1},{1} }kl1)*(@{selected|age|max}-3)*5]]||light|true) as its fear aura. Creatures within the cloud are blinded, and no spell casting is possible. The dust lasts for one round.}}'},
{name:'Steam-Mephit-Rain',type:'Power',ct:'5',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Steam Mephit causes\nScalding Rain}}{{splevel=Power}}{{school=Power}}Specs=[Steam-Mephit-Rain,Power,0H,Evocation]{{components=S}}{{time=[[5]]}}{{range=[[0]]}}{{duration=Instantaneous}}{{aoe=[20ft.sq](!rounds --aoe @{selected|token_id}|square|feet|0|20||acid)}}{{save=None}}{{damage=[2d6](!\\amp#13;\\amp#47;gmroll 2d6)}}SpellData=[w:Steam Mephit Rain,sp:5,cs:S]{{effects=Once per day a steam mephit may create a rainstorm of boiling water over a 20-by 20-foot area. This storm inflicts 2d6 points of damage to all victims caught in the area of effect, with no saving throw allowed.}}'},
{name:'Steam-Mephit-Water-Jet',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Steam Mephit breathes out \na Boiling Water Jet}}{{splevel=Breath Weapon}}{{school=Power}}Specs=[Steam Mephit Jet,Power,0H,Breath Weapon]{{components=None}}{{time=1 every 2 rounds}}{{range=[20 ft](!rounds --aoe @{selected|token_id}|bolt|feet|0|20|1|lightning --target caster|@{selected|token_id}|timer|1|-1|Counting down until Water Jet can be breathed again|stopwatch)}}{{duration=Instantaneous}}{{aoe=1 creature}}{{save=None}}{{damage=Automatic hit [1d3](!\\amp#13;\\amp#47;gmroll 1d4+1 HP damage)HP, and [50% chance](!\\amp#13;\\amp#47;gr 1d100\\lt50 chance of stunning) of [stunning](!rounds --target single|@{selected|token_id}|\\amp#64;{target|Who\'s the victim?|token_id}|Stunned|+1|-1|Stunned by heat damage \\amp considered prone|back-pain) for 1 round, cumulative}}SpellData=[w:Steam Mephit Water Jet,sp:0,cs:None,pd:-1]{{effects=A scalding jet of water every other round; no limit to the number of times per day this can be used. This jet has a 20-foot range and automatically hits its target. Damage is 1d3 points (no saving throw) with a 50% chance of stunning the victim for one round.}}{{Use=Display the area of effect using the Range button (also sets timer to count down 1 round to next breath available). Then roll damage using the damage dice roll button, then use the percentage dice roll button and if less than 50% add stunned effect using the stunned button and selecting the victim\'s token}}'},
+ {name:'Summon-Djinni',type:'Power',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} \n**Summons a Djinni**\nas a Power}}Specs=[Summon-Djinni,Power,1H,Conjuration-Summoning]{{Speed=[[1]]}}{{Range=0}}SpellData=[w:Summon-Djinni,sp:1,cs:S]{{Use=The GM should create a *Drag \\amp Drop* Djinni by creating a blank character sheet (with a name and suitable image) and dragging it onto the playing surface to drop a token. Select it and use the *Drag \\amp Drop* dialog that will have appeared in the Chat Window to select the Djinni as a Creature.}}{{desc=The dragon usually asks the djinni to preform some service. Although the djinni serves willingly, the dragon will order it into combat only in extreme circumstances, as the dragon would be dismayed and embarrassed if the djinni were killed.}}'},
+ {name:'Symbol-of-Hopelessnes',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Symbol of Hopelessness}}{{splevel=Spell}}{{school=Conjuration Summoning}}Specs=[Symbol of Hopelessness,Power,0H,Conjuration-Summoning]{{components=None}}{{time=[[0]]}}{{range=[60 feet](!rounds --aoe @{selected|token_id}|circle|feet|0|120|120|dark|true)}}{{duration=3d4 turns}}{{aoe=[All creatures viewing symbol](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Who is viewing the symbol?|token_id}|Symbol-Hopelessness|\\amp#91;[10*3d4]\\amp#93;|-1|Feeling dejected so turn back, surrender, or attack hopelessly|broken-skull)}}{{save=vs. spell to negate}}{{reference=PHB page 236}}SpellData=[w:Symbol of Hopelessness,sp:0,pd:-1]{{effects=Creatures seeing this symbol must turn back in dejection or surrender to capture or attack unless they roll successful saving throws vs. spell. Its effects last for 3d4 turns.}}'},
+ {name:'Symbol-of-Pain',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Symbol of Pain}}{{splevel=Spell}}{{school=Conjuration Summoning}}Specs=[Symbol of Pain,Power,0H,Conjuration-Summoning]{{components=None}}{{time=[[0]]}}{{range=[60 feet](!rounds --aoe @{selected|token_id}|circle|feet|0|120|120|dark|true)}}{{duration=2d10 turns}}{{aoe=[All creatures viewing symbol](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Who is viewing the symbol?|token_id}|Symbol-Pain|\\amp#91;[10*2d10]\\amp#93;|-1|Wracking pains so attack at -4 penalty and -2 to dexterity checks|broken-skull)}}{{save=vs. spell to negate}}{{reference=PHB page 236}}SpellData=[w:Symbol of Pain,sp:0,pd:-1]{{effects=Creatures seeing this symbol suffer -4 penalties to their attack rolls and -2 penalties to their Dexterity ability scores due to wracking pains. The effects last for 2d10 turns.}}'},
+ {name:'Symbol-of-Pursuasion',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Symbol of Pursuasion}}{{splevel=Spell}}{{school=Conjuration Summoning}}Specs=[Symbol of Pursuasion,Power,0H,Conjuration-Summoning]{{components=None}}{{time=[[0]]}}{{range=[60 feet](!rounds --aoe @{selected|token_id}|circle|feet|0|120|120|dark|true)}}{{duration=1d20 turns}}{{aoe=[All creatures viewing symbol](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Who is viewing the symbol?|token_id}|Symbol-Pursuasion|\\amp#91;[10*1d20]\\amp#93;|-1|Become same alignment and fiendly to the priest who cast the symbol|broken-skull)}}{{save=vs. spell to negate}}{{reference=PHB page 236}}SpellData=[w:Symbol of Pursuasion,sp:0,pd:-1]{{effects=Creatures seeing the symbol become of the same alignment as and friendly to the priest who scribed the symbol for 1d20 turns}}'},
{name:'Target-power',type:'',ct:'0',charge:'uncharged',cost:'0',body:'/w gm @{selected|token_name} targeted @{target|target1|token_name} with the power @{selected|spelltomem}\n!rounds --addtargetstatus @{target|target1|token_id}|@{selected|Spell-cast}|@{selected|Spell-duration}|@{selected|Spell-direction}|@{selected|Spell-msg}|@{selected|Spell-marker}'},
{name:'Target-user',type:'',ct:'0',charge:'uncharged',cost:'0',body:'/w gm @{selected|token_name} used the power @{selected|spelltomem} on themselves\n!rounds --addtargetstatus @{selected|token_id}|@{selected|Spell-cast}|@{selected|Spell-duration}|@{selected|Spell-direction}|@{selected|Spell-msg}|@{selected|Spell-marker}'},
{name:'Teleport-Other',type:'Power',ct:'2',charge:'uncharged',cost:'0',body:'{{}}Specs=[Teleport-Other,Power,0H,Alteration]{{}}SpellData=[w:Teleport Other,sp:2,cs:SpellData=[w:Teleport Other,sp:10,cs:S]{{}}%{MU-Spells-DB|Teleport}'},
@@ -3230,80 +3429,58 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
{name:'Whelm-Locate-Object',type:'ItemPower',ct:'1',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Whelm casts\nLocate Object\nas a level 12 caster}}{{splevel=Power}}{{school=Divination}}{{sphere=Divination}}Specs=[Whelm-Locate-Object,ItemPower,1H,Divination]{{components=V,S}}{{time=[[1]] turn}}{{range=[180 yards](!rounds --aoe @{selected|token_id}|circle|yards|0|360||magic|true)}}{{duration=[[8]] hours}}{{aoe=[[1]] object}}{{save=None}}SpellData=[w:Whelm Locate Object,sp:1,cs:VS]{{effects=This spell helps locate a known or familiar object. The priest casts the spell, slowly turns, and will sense when he is facing in the direction of the object to be located, provided the object is within range--for example, 90 yards for 3rd-level priests, 100 yards for 4th, 110 yards for 5th, etc. The spell locates such objects as apparel, jewellery, furniture, tools, weapons, or even a ladder or stairway. Once the caster has fixed in his mind the items sought, the spell locates only that item. Attempting to find a specific item, such as a kingdom\'s crown, requires an accurate mental image. If the image is not close enough to the actual item, the spell does not work; in short, desired but unique objects cannot be located by this spell unless they are known by the caster. The spell is blocked by lead.\nThe reversal, obscure object, hides an object from location by spell, crystal ball, or similar means for eight hours. The caster must touch the object being concealed.\nNeither application of the spell affects living creatures.}}{{materials=Whelm}}'},
{name:'Whelm-Shockwave',type:'ItemPower',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} creates a\nShockwave\nwith Whelm}}{{splevel=Power}}{{school=Alteration}}Specs=[Whelm-Shockwave,ItemPower,1H,Alteration]{{components=S}}{{time=[[10]]}}{{range=[[0]]}}{{duration=[[1]] turn}}{{aoe=[Up to 120ft diameter](!rounds --aoe @{selected|token_id}|circle|feet|0|||lightning|true)}}{{save=Negates}}{{healing=[Stunning!](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Select first shocked creature|token_id}|Whelm-Stunned|10|-1|Stunned roll save vs Staves again|fishing-net)}}SpellData=[w:Whelm Shockwave,sp:10,cs:S]{{effects=You can use a round to strike the ground with *Whelm* and send a ***Shock Wave*** out from the point of impact. Each creature of your choice on the ground within [[60]] feet of that point must succeed on a saving throw vs. Staves or become stunned for [[1]] turn. A creature can repeat the saving throw at the end of each round, ending the effect on itself on a success. Once used, this property can\'t be used again until the next dawn.}}'},
{name:'Whirlwind',type:'Power',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Whirlwind}}Specs=[Whirlwind,Power,0H,Innate Ability]{{Speed=[[3]]}}{{save=Vs Breath Weapon to halve}}{{Recharge=[Start recharging](!rounds --target caster|@{selected|token_id}|AE-Whirlwind|\\amp#91;[3+1d3]\\amp#93;|-1|Whirlwind building|stopwatch)}}SpellData=[w:Whirlwind,sp:3,cs:S]{{desc=The most feared power of an air elemental is its ability to form a whirlwind upon command. Using this form, the air elemental appears as a truncated, reversed cone with a 10 foot bottom diameter and 30 foot top diameter. The height of the whirlwind depends on the Hit Dice of the elemental. An air elemental of 8 Hit Dice will produce a whirlwind standing 40 feet tall; a 12 Hit Dice elemental produces a whirlwind standing 60 feet tall; and a 16 Hit Dice elemental produces a whirlwind standing 80 feet tall. It takes one full turn to form and dissipate this cone.\nThis whirlwind lasts for one melee round. Each creature in the elemental\'s space must make a **saving throw vs Breath Weapon**. On a failure, creatures of 3 hit dice or less are killed (0 HP not stable). Creatures of more than 3 HD take [2d8](!\\amp#13;\\amp#47;gmroll 2d8 damage from whirlwind) bludgeoning damage and is flung up to [[20]] feet away from the elemental in a random direction and knocked prone. If a thrown target strikes an object, such as a wall or floor, the target takes an additional [10yds 1d6, 20yds 2d6](!\\amp#13;\\amp#47;gmroll \\amp#63;{How far|10,1|20,2}d6 damage from hitting wall) bludgeoning damage for every 10 feet it was thrown. If the target is thrown at another creature, that creature must succeed on a Dexterity saving throw or take the same damage and be knocked prone.\nIf the saving throw is successful, the target takes half the bludgeoning damage and isn\'t flung away or knocked prone.\nIf, because of overhead obstructions, the whirlwind fails to reach its full height, it can only sweep up creatures under 2 Hit Dice and do 1-8 points of damage to all others in its cone.}}'},
+ {name:'White-Dragon-Breath',type:'',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{prefix=White}}{{title=Dragon Breath}}{{use=Show the [70ft x 25ft cone](!rounds --aoe @{selected|token_id}|cone|feet|0|70|25|Cold --target caster|@{selected|token_id}|Dragon-Breath|3|-1|Catching breath before breathing again|stopwatch) of frost which also sets the recovery counter. Then do [[(@{selected|age|max})d6+@{selected|age|max}]] HP damage (save. vs breath to halve}}{{desc=A white dragon\'s breath weapon is a come of frost 70\' long, 5\' wide at the dragon\'s mouth, and 25\' wide at the base. Creatures caught in the blast may Save versus Breath Weapon for half damage.The damage done increases with the dragon\'s age: from 1d6+1 to 12d6+12. The damage shown above includes this age-related dice roll}}'},
+ {name:'Wing-Buffet',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Wing Buffet**\nas an attack}}Specs=[Wing Buffet,Power,1H,Combat]{{Speed=[[0]]}}{{Range=0}}SpellData=[w:Wing Buffet,sp:0,cs:S]{{Use=Just specify use of the power during initiative, use it during the round to display its description, and do Claw attacks to assess succes and do damage}}{{desc=Young adult and older dragons can employ their wings in combat; targets must be at the dragon\'s sides. The damage inflicted is the same as a claw attack, and creatures struck must roll their Dexterity or less on 1d20 or be knocked prone.}}'},
{name:'WoF-Burning-Hands',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Wand of Fire\nBurning Hands}}{{splevel=Magic Item Power}}{{school=Evocation}}Specs=[Burning Hands,Power,1H,Evocation]{{components=V,M}}{{time=[[0]]}}{{range=12ft}}{{duration=Instantaneous}}{{aoe=[Fan 10ft wide](!rounds --aoe @{selected|token_id}|cone|feet|0|12|10|fire|true)}}{{save=None}}{{reference=DMG p154}}SpellData=[w:WoF-Burning-Hands,sp:0,cs:VM]{{effects=**Note: specs different from spell.** The wand emits a [[120]]degree fan-shaped sheet of fire [[10]] feet wide at its end and [[12]] feet long. Each creature touched suffers [[6]] HP of damage. The sheet of fire appears instantly, shoots forth dark red flames, and snuffs out in less than one second.}}'},
{name:'WoF-Cone-of-Cold',type:'Power',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Wand of Frost\nCone of Cold}}{{splevel=Power}}{{school=Evocation}}Specs=[WoF Cone of Cold,Power,1H,Evocation]{{components=V,M}}{{time=[[2]]}}{{range=[[0]]}}{{duration=Instantaneous}}{{aoe=[Cone 60ft x 20ft](!rounds --aoe @{selected|token_id}|cone|feet|0|60|20|cold)}}{{save=Halves}}SpellData=[w:Cone of Cold,lv:6,sp:2,cs:VM]{{effects=White crystalline motes spray forth from the wand in a cone with a 60-foot length and a terminal diameter of 20 feet. The initiative modifier is +2, and the effect lasts just one second. The temperature is -100 degrees F., and damage is [6d6](!\\amp#13;\\amp#47;w gm Rolled \\amp#91;\\amp#91; { {1d6}, {1d6}, {1d6}, {1d6}, {1d6}, {1d6}, {2}, {2}, {2}, {2}, {2}, {2} }kh6 \\amp#93;\\amp#93;, treating all 1s rolled as 2s), treating all 1s rolled as 2s (6d6, 12-36). The cost is two charges per use. Saving throw vs. wands is applicable.}}'},
{name:'WoF-Fireball',type:'Power',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Wand of Fire\nFireball}}{{splevel=Magic Item Power}}{{school=Evocation}}Specs=[Fireball,Power,1H,Evocation]{{components=V,M}}{{time=[[2]]}}{{range=160ft}}{{duration=Instantaneous}}{{aoe=[20ft radius](!rounds --aoe @{selected|token_id}|circle|feet|160|40|40|fire)}}{{save=vs. wand to halve damage}}SpellData=[w:WoF-Fireball,sp:2,cs:VM]{{effects=**Note: specs different from spell.** The wand coughs forth a pea-sized sphere that streaks out to the desired range (to a maximum of 160 feet) and bursts in a fiery, violet-red blast, just like the fireball spell. The initiative modifier is +2, and this expends [[2]] charges. The fireball inflicts [6d6 min 2/dice](!\\amp#13;\\amp#47;r {1d6,2+0d0}k1+{1d6,2+0d0}k1+{1d6,2+0d0}k1+{1d6,2+0d0}k1+{1d6,2+0d0}k1+{1d6,2+0d0}k1 points of fireball damage, save to half) points of damage, but all 1s rolled are counted as 2s (i.e., the burst causes 12-36 points). A saving throw vs. wand is applicable.}}'},
{name:'WoL-Lightning-Bolt',type:'Power',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Wand of Lightning\nLightning Bolt}}{{splevel=Power}}{{school=Evocation}}Specs=[WoI Lightning Bolt,Power,0H,Evocation]{{components=V,M}}{{time=[[2]]}}{{range=[[0]]}}{{duration=Instantanious}}{{aoe=[Lightning Bolt](!rounds --aoe @{selected|token_id}|bolt|feet|0|80|5|lightning)\nor [Lightning Fork](!rounds --aoe @{selected|token_id}|bolt|feet|0|40|10|lightning)\nall creatures within area}}{{save=vs. Wand for half damage)}}{{damage=[Roll 6d6, 1s as 2s](!\\amp#13;\\amp#47;w gm \\amp#91;[{ {1d6}, {1d6}, {1d6}, {1d6}, {1d6}, {1d6}, {2}, {2}, {2}, {2}, {2}, {2} }k6]\\amp#93;HP damage)}}SpellData=[w:WoL Lightning Bolt,sp:2,cs:VM]{{effects=A bolt similar to that from a staff of thunder \\amp lightning is generated, but it is of 6d6 strength, causing 12-36 points of damage (rolls of 1 are counted as 2) to those who fail a saving throw. The stroke can be single or forked.}}'},
- {name:'Cure-Blindness',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Staff of Curing\nCure Blindness}}{{splevel=Magic Item Power}}{{school=Necromancy}}{{sphere=Healing}}Specs=[Cure Blindness,Power,1H,Necromancy]{{components=V,M}}{{time=[[10]]}}{{range=Touch}}{{duration=Permanent}}{{aoe=1 Creature}}{{save=None}}{{reference=DMG p154}}SpellData=[w:Cure Blindness,sp:10,cs:VM]{{effects=By touching the creature afflicted, the priest employing the spell can permanently cure some forms of blindness. This spell does not restore or repair visual organs damaged by injury or disease. Only once per creature per day, and only twice a day in total}}'},
- {name:'Djinni-Create-Illusion',type:'Power',ct:'2',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Create Illusion}}{{splevel=Djinn Power}}{{school=Illusion/Phantasm}}Specs=[Create Illusion,Power,0H,Alteration]{{components=None}}{{time=[[2]]}}{{range=260 yards}}{{duration=Special}}{{aoe=[Up to 1200 sq. ft.](!rounds --aoe @{selected|token_id}||feet|260|||magic)}}{{save=to disbelieve}}{{reference=AD\\ampD2e Monstrous Manual Djinni}}SpellData=[w:Create Illusion,sp:2,pd:1]{{effects=A standard Djinn power is to create an illusion with both visible and audible components, once per day. It is the equivalent of *Improved Phantasmal Force* cast at 20th level, but does not require any concentration and persists until touched or magically dispelled.}}'},
- {name:'Djinni-Create-Metal',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Create Metal}}{{splevel=Djinn Power}}{{school=Alteration}}Specs=[Create Metal,Power,0H,Alteration]{{components=None}}{{time=[[10]]}}{{range=Special}}{{duration=Special}}{{aoe=Up to 100 lbs weight}}{{save=None}}{{reference=AD\\ampD2e Monstrous Manual Djinni}}SpellData=[w:Create Metal,sp:10,pd:1]{{effects=A standard Djinn power is to create up to 100 lbs weight of metal, once per day. However, this metal only has a short lifespan, which depends on the metal\'s hardness. Gold has about a 24 hour life, whereas steel lasts only one hour}}'},
- {name:'Djinni-Create-Nutritious-Food',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Create Nutritious Food}}{{splevel=Djinn Power}}{{school=Alteration}}Specs=[Create Nutritious Food,Power,0H,Alteration]{{components=None}}{{time=[[10]]}}{{range=Special}}{{duration=Permanent}}{{aoe=[2d6 Persons](!\\amp#13;\\amp#47;gr 2d6 persons of nutritious food created)}}{{save=None}}{{reference=AD\\ampD2e Monstrous Manual Djinni}}SpellData=[w:Create Nutritious Food,sp:10,pd:1]{{effects=A standard Djinn power is to *Create Nutritious Food* for 2d6 persons, once per day}}'},
- {name:'Djinni-Create-Soft-Goods',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Create Soft Goods}}{{splevel=Djinn Power}}{{school=Alteration}}Specs=[Create Soft Goods,Power,0H,Alteration]{{components=None}}{{time=[[10]]}}{{range=Special}}{{duration=Permanent}}{{aoe=Up to 16 cu ft}}{{save=None}}{{reference=AD\\ampD2e Monstrous Manual Djinni}}SpellData=[w:Create Soft Goods,sp:10,pd:1]{{effects=A standard Djinn power is to create up to 16 cu ft of soft goods (cushions, mats, blankets, tents, etc), once per day}}'},
- {name:'Djinni-Create-Wine-or-Water',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Create Wine or Water}}{{splevel=Djinn Power}}{{school=Alteration}}Specs=[Create Wine or Water,Power,0H,Alteration]{{components=None}}{{time=[[10]]}}{{range=Special}}{{duration=Permanent}}{{aoe=[2d6 Persons](!\\amp#13;\\amp#47;gr 2d6 persons of either wine or water created)}}{{save=None}}{{reference=AD\\ampD2e Monstrous Manual Djinni}}SpellData=[w:Create Wine or Water,sp:10,pd:1]{{effects=A standard Djinn power is to *Create Wine or Water* for 2d6 persons, once per day}}'},
- {name:'Djinni-Create-Wooden-Items',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=CreateWooden Items}}{{splevel=Djinn Power}}{{school=Alteration}}Specs=[Create Wooden Items,Power,0H,Alteration]{{components=None}}{{time=[[10]]}}{{range=Special}}{{duration=Permanent}}{{aoe=Up to 9 cu ft}}{{save=None}}{{reference=AD\\ampD2e Monstrous Manual Djinni}}SpellData=[w:Create Wooden Items,sp:10,pd:1]{{effects=A standard Djinn power is to create up to 9 cu ft of wooden Items (chairs, bed frames, wooden shields, 10ft poles etc), once per day}}'},
- {name:'Djinni-Whirlwind',type:'Magic|Power|Magic|Power|Magic|Power',ct:'100',charge:'recharging',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{name=Djinni Whirlwind}}Specs=[Djinni Whirlwind,Magic|Power,1H|2H,Innate Ability],[Djinni Whirlwind,Magic|Power,1H|2H,Innate Ability],[Djinni Whirlwind,Magic|Power,1H|2H,Innate Ability]{{Speed=1 turn}}ToHitData=[w:Start Whirlwind,sp:100,c:0,rc:recharging],[w:Whirlwind Attack,sp:1,c:0,rc:recharging],[w:Finished with Whirlwind,sp:0,c:1,rc:recharging]{{save=Vs Breath Weapon each round of contact to negate}}{{Use=The Djinni should take the Whirlwind in-hand as a 2-handed weapon and attack with it. Ask the target to make a save vs. breath weapon and then choose the appropriate damage button.}}{{GM Info=Represent the location of the Whirlwind with a suitable token and give control of that token to the Djinni (the Player controlling the Djinni). The whirlwind power will only be consumed when the *Finished with Whirlwind* button is selected, and will recharge as a Power on a long rest.}}SpellData=[w:Whirlwind,pd:1,c:0,rc:recharging]{{desc=Once per day, the genie can create a whirlwind, which the it can ride or even direct at will from a distance. The whirlwind is a cone-shaped spiral, measuring up to 10 feet across at its base, 40 feet across at the top, and up to 70 feet in height (the djinni chooses the dimensions). Its maximum speed is 18, with maneuverability class A. The whirlwind\'s base must touch water or a solid surface, or it will dissolve. It takes a full turn for the whirlwind to form or dissolve. During that time, the whirlwind inflicts no damage and has no other effect. The whirlwind lasts as long as the djinni concentrates on it, moving at the creature\'s whim.\nIf the whirlwind strikes a non-aerial creature with fewer than 2 Hit Dice, the creature must make a saving throw vs. breath weapon for each round of contact with the whirlwind, or be swept off its feet, battered, and killed. Hardier beings, as well as aerial or airborne creatures, take 2d6 points of damage per round of contact with the whirlwind.\nA djinni can ride its whirlwind and even take along passengers, who (like the djinni) suffer no damage from the buffeting winds. The whirlwind can carry the genie and up to six man-sized or three genie-sized companions.}}'},
- {name:'Symbol-of-Hopelessnes',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Symbol of Hopelessness}}{{splevel=Spell}}{{school=Conjuration Summoning}}Specs=[Symbol of Hopelessness,Power,0H,Conjuration-Summoning]{{components=None}}{{time=[[0]]}}{{range=[60 feet](!rounds --aoe @{selected|token_id}|circle|feet|0|120|120|dark|true)}}{{duration=3d4 turns}}{{aoe=[All creatures viewing symbol](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Who is viewing the symbol?|token_id}|Symbol-Hopelessness|\\amp#91;[10*3d4]\\amp#93;|-1|Feeling dejected so turn back, surrender, or attack hopelessly|broken-skull)}}{{save=vs. spell to negate}}{{reference=PHB page 236}}SpellData=[w:Symbol of Hopelessness,sp:0,pd:-1]{{effects=Creatures seeing this symbol must turn back in dejection or surrender to capture or attack unless they roll successful saving throws vs. spell. Its effects last for 3d4 turns.}}'},
- {name:'Symbol-of-Pain',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Symbol of Pain}}{{splevel=Spell}}{{school=Conjuration Summoning}}Specs=[Symbol of Pain,Power,0H,Conjuration-Summoning]{{components=None}}{{time=[[0]]}}{{range=[60 feet](!rounds --aoe @{selected|token_id}|circle|feet|0|120|120|dark|true)}}{{duration=2d10 turns}}{{aoe=[All creatures viewing symbol](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Who is viewing the symbol?|token_id}|Symbol-Pain|\\amp#91;[10*2d10]\\amp#93;|-1|Wracking pains so attack at -4 penalty and -2 to dexterity checks|broken-skull)}}{{save=vs. spell to negate}}{{reference=PHB page 236}}SpellData=[w:Symbol of Pain,sp:0,pd:-1]{{effects=Creatures seeing this symbol suffer -4 penalties to their attack rolls and -2 penalties to their Dexterity ability scores due to wracking pains. The effects last for 2d10 turns.}}'},
- {name:'Symbol-of-Pursuasion',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=Symbol of Pursuasion}}{{splevel=Spell}}{{school=Conjuration Summoning}}Specs=[Symbol of Pursuasion,Power,0H,Conjuration-Summoning]{{components=None}}{{time=[[0]]}}{{range=[60 feet](!rounds --aoe @{selected|token_id}|circle|feet|0|120|120|dark|true)}}{{duration=1d20 turns}}{{aoe=[All creatures viewing symbol](!rounds --target area|@{selected|token_id}|\\amp#64;{target|Who is viewing the symbol?|token_id}|Symbol-Pursuasion|\\amp#91;[10*1d20]\\amp#93;|-1|Become same alignment and fiendly to the priest who cast the symbol|broken-skull)}}{{save=vs. spell to negate}}{{reference=PHB page 236}}SpellData=[w:Symbol of Pursuasion,sp:0,pd:-1]{{effects=Creatures seeing the symbol become of the same alignment as and friendly to the priest who scribed the symbol for 1d20 turns}}'},
- {name:'Rakshasa-Illusion',type:'Power',ct:'0',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.spellTemplate+'}{{title=@{selected|token_name} uses\nRakshasa Illusion}}{{splevel=Power}}{{school=Innate Ability}}Specs=[Rakshasa Illusion,Power,0H,Innate Ability]{{components=None}}{{time=[[0]]}}{{range=Line of sight}}{{duration=Terminates if Rakshasa attacks}}{{aoe=[1 creature](!rounds --target single|@{selected|token_id|\\amp#64;{target|Who is fooled by the Rakshasa\'s illusion?|token_id}|Some Effect|99|0|Some sort of effect - not sure what|spanner)}}{{save=Disbelieve as per *illusion*}}{{use=Use the Area of Effect button to target and mark the victim the Rakshasa has selected}}SpellData=[w:Rakshasa Illusion,sp:0]{{effects=Rakshasas savor fresh human meat and use illusions to get it. They have a limited form of *ESP* which allows them to disguise themselves as someone the victim trusts; the rakshasa uses this illusion as a lure and strikes when the victim is most unprepared. The rakshasa must drop the illusion when it attacks.}}'},
- {name:'Bead-of-Curing',type:'Power',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Bead of Curing**\non their *Necklace of Prayer Beads*}}Specs=[Bead of Curing,Power,1H,Necromancy]{{splevel=Necromancy}}{{School=Healing}}{{Speed=[[3]]}}{{Range=Touch}}{{Duration=Permanent}}{{Area of Effect=1 creature}}{{save=None}}{{reference=DMG p175}}SpellData=[w:Bead of Curing,sp:3,cs:M]{{desc=Once per day, cure [blindness](!magic --display-ability @{selected|token_id}|PR-Spells-DB|Cure-Blindness-or-Deafness), [disease](!magic --display-ability @{selected|token_id}|PR-Spells-DB|Cure-Disease), or [serious wounds](!magic --display-ability @{selected|token_id}|PR-Spells-DB|Cure-Serious-Wounds) (as the appropriate spells)}}'},
- {name:'Bead-of-Karma',type:'Power',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Bead of Karma**\non their *Necklace of Prayer Beads*}}Specs=[Bead of Karma,Power,1H,Alteration]{{splevel=Alteration}}{{Sphere=All}}{{Speed=[[3]]}}{{Range=0}}{{Duration=1 spell}}{{Area of Effect=Caster}}{{save=None}}{{reference=DMG p175}}SpellData=[w:Bead of Karma,sp:3,cs:M]{{Use=In order to cast a spell 4 levels higher with respect to range, duration etc., the button in the description below must be used}}{{desc=Once per day, allows the priest to [cast a spell](!magic --cast-spell PR|@{selected|token_id}|[[@{selected|pr-casting-level}+4]]) as if they were four levels higher (with respect to range, duration, etc. - but not any spells of a higher level than the priest can normally cast)}}'},
- {name:'Bead-of-Summons',type:'Power',ct:'3',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} uses \n**Bead of Summons**\non their *Necklace of Prayer Beads*}}Specs=[Bead of Summons,Power,1H,Summoning]{{splevel=Power}}{{Sphere=Summoning}}{{Speed=[[3]]}}{{Range=0}}{{Duration=Special}}{{Area of Effect=1 deity}}{{save=None}}{{reference=DMG p175}}SpellData=[w:Bead of Summoning,sp:3,cs:M]{{GM info=If the priest summons his deity frivolously, the deity will, at the very least, take the necklace as punishment.}}{{desc=Once per day, calls the priest\'s deity ([90% probability](!\\amp#13;\\amp#47;r 1d100)) to come to him in material form (but it had better be for a good reason!).}}'},
- {name:'Improve-Gem',type:'Power',ct:'10',charge:'uncharged',cost:'0',body:'\\amp{template:'+fields.defaultTemplate+'}{{title=@{selected|token_name} attempts to\n**Improve a Gem**\nusing a *Jewel of Flawlessness*}}Specs=[Improve Gem,Power,1H,Alteration]{{Speed=[[10]]}}{{Range=0}}{{Duration=Permanent}}{{Area of Effect=Jewels in same container with *Jewel of Flawlessness*}}{{save=None}}{{reference=DMG p173}}SpellData=[w:Improve Gem,sp:10,cs:M]{{desc=When a jewel of flawlessness is placed with other gems, it doubles the likelihood of their being more valuable (i.e., the chance for each stone going up in value increases from 10% to 20%). The jewel has from 10-100 facets, and whenever a gem increases in value because of the magic of the jewel of flawlessness (a roll of 2 on d10), one of these facets disappears. When all are gone, the jewel is a spherical stone that has no value.\nValue 1 = $[[1]]}}{{Need to Roll=2}}{{Improvement Roll=[[1d10]]}}{{Result=Need to Roll\\gt=Improvement Roll}}{{successcmd=!magic ~~mi-charges @{selected|token_id}¦-[[$[[1]]-1]]¦Jewel-of-Flawlessness¦¦charged}}'},
]},
});
const handouts = Object.freeze({
RPGM_Release_Notes: {name:'RPGM Release Notes',
- version:'2.202',
+ version:'2.300',
avatar:'https://s3.amazonaws.com/files.d20.io/images/257656656/ckSHhNht7v3u60CRKonRTg/thumb.png?1638050703',
bio:''
+'RPGMaster Release Notes v2.202'
+' '
+''
+' RPGMaster Release Notes'
- +' for version 2.2.2'
- +' '
- +' Added "-CHANGE" qualifier for spell-storing items'
- +' Spell-storing magic items, such as a Ring of Spell Storing generally come with a predefined set of spells stored on them, that the character can\'t change, but can only refresh after use by recasting the same spell into the item. A couple of releases ago, I added the "-ADD" and "-ANY" qualifiers to the !magic --mem-spell MI command. The "-CHANGE" command has now been added to complete the set. This is required for items like the Vibrant Purple Ioun Stone. See new entries in the MagicMaster Help handout for more information. '
- +' Defining storage qualifiers in data'
- +' The qualifiers "-ADD", "-ANY", and "-CHANGE" can now be specified in the Data=[...] specification in the item database entry, using the attribute "store:". This then applies the appropriate behaviour for the qualifier whenever a !magic --mem-spell is used on the spell-storing magic item without having to specify the qualifier. See new entries in the Magic Database Help handout for more information. '
- +' Restricting levels stored for spell-storing items'
- +' A new spell-storing item database data attribute, "lvl:", has been coded that will flag that the total number of spell levels that can be stored on the spell-storing item should be limited to the qty (otherwise known as the number of charges) set for the item. lvl:1 restricts the total levels to the number of charges, whereas lvl:0 (or not specified) will not apply any restriction. See new entries in the Magic Database Help handout for more information. '
- +' Fixes to Spell Storing magic items'
- +' A number of fixes to the processing of spell-storing magic items have been made to address historic bugs, and some introduced with a recent speed improvement. '
- +' Secret Panel Lock & Thrusting Blade Trap'
- +' The new Locks-Traps-DB has been updated with a new Secret Panel lock that requires a successful roll to find secret panels in order to find and unlock the lock. The GM determines the difficulty of the lock (i.e. the success target for the roll) from 1-in-6 to 5-in-6 or a custom percentage. Of course, the GM can also re-program the lock using the provided help '
- +' Also new is a Thrusting Blade trap which works in a similar fashion to a Single Dart trap but with different range and damage calculations. '
+ +' for version 2.3.0'
+' '
- +' Release notes for v2.2.0'
- +' Drag & Drop Containers'
- +' Added two new databases, and accompanying functionality to support locked and/or trapped containers that can contain items and treasure, and can be interacted with by player tokens. The first database defines various types of container, such as small and large chests, sacks, table, desk, and even a sleeping creature and a dead body, with matching images, that can be dragged onto the playing surface (in a very similar fashion to Drag & Drop creatures). The second database defines multiple locks and traps that can be added to the containers. Locks and traps can be mixed and matched, and each have various parameters that the GM can alter, such as the combination of a combination lock, the password that will open a chest, the spell cast by wizard spell trapped container, or the poison type and damage done by a poison dart trap. The sleeping creature can wake and stand up to defend themselves, and the body can rise as an undead creature, fully specified and ready to drag the thief into hell! '
- +' The Drag & Drop container system comes with full documentation in the form of the Locks and Traps Help handout. Full functionality is provided for the GM to set up locked and trapped containers either with the locks & traps provided, or with their own locks & traps designed using the help handout and the examples provided. '
- +' New Find Traps Function'
- +' The introduction of the Drag & Drop container system has enabled the introduction of a new "Find Traps" capability for Player Characters (and NPCs and Creatures for that matter), using the menu selection MI Menu / Find Traps (next to the "Search for MIs & Treasure" function) or the command syntax !magic --find-traps token_id(of searcher)|pick_id(of container)|put_id(of where to put items) . This command works not only on containers dropped using the Drag & Drop system (though it does work best for them) but also in a bulk standard fashion for any target the Character wants to search for traps. Interaction between the Player & GM is supported by the process, allowing the GM to "tailor" the outcome as desired e.g. for no trap exists, or forcing a successful outcome, or to state the trap is magical and therefore harder to remove. '
- +' Simplified Container Types'
- +' The types that containers can be has been simplified, and now automatically detects the type of the container where it can. If the character sheet associated with a searched container has non-zero intelligence (either Character attribute, or "Monster" intelligence score), and is still alive (Hit Points greater than zero), then the searched object is considered to be sentient, and requires a pick pockets roll. Drag & Drop containers are automatically set to be "trapped" although the trap can be "No Lock" and "No Trap". All other containers will automatically be deemed to just be inanimate and searchable. The automatic assessment can be overriden by the GM using the GM\'s [Add Items] button (or the !magic --gm-edit-mi command), and setting the Container Type to be "Force Inanimate Container" or "Force Sentient Creature". Setting it to "Trapped Container" will work only if trap macros have been added (either by the Drag & Drop container system or manually), and setting to "Untrapped Container" will revert to the APIs automatically detecting the type of the container. '
- +' Wizards can Learn New Spells'
- +' There now exists a Blank Spell Book as a magic item called Spellbook under the [Scrolls] list on the GM\'s [Add-Items] dialog. With the Spellbook added to a container and then selected in the list of stored items, the GM can use the [Store Spells/Powers in MI] button on that dialog to store Wizard spells (of any & all levels) into the Spellbook. This functionality has been available for a while. '
- +' However, what is different here is that if a spell is stored in this spellbook, any wizard picking it up (i.e. through using a "Search for MIs and Treasure" on the container in which the spellbook was stored by the GM) can view the spellbook once they have it in their MI bag by using MI Menu / View Your Magic Item Bag. Doing so will show a button called [View] on the description of the Spellbook, which displays the stored spells. The wizard cannot cast from this spellbook, but they can learn the spell! This is achieved by viewing one of the spells they want to learn by clicking on it in this displayed list, and when the description of the spell pops up a [Learn this spell] button is at the bottom of the description - if they click the button, the APIs check they are of a class of wizard that can use this spell, and prompts them to make the dice roll to learn the spell. If successful the APIs will then automatically add that spell to those the wizard can memorise (i.e. add it to their character sheet spellbook of the right level). '
- +' As with any item, the GM can change the name of the item using the GM\'s [Add-Items] dialog, so there can be lots of spellbooks around that can be differentiated by their name. '
- +' Critical Rolls and RPGMdefault Templates'
- +' The critical roll processing that has been a feature of RPGMattack roll templates, which displays Critical Hit! and Fumble! bars when a critical dice roll is made, has been extended to all roll templates that are based on the RPGMdefault template (see the RPGMaster Library Help handout). Furthermore, the {{successcmd=...}} and {{failcmd...}} processing has been extended for critical rolls, so that {{critcmd=...}} will be executed when a critical success roll is achieved, and {{fumblecmd=...}} will be executed on a critical fumble. Examples of this use can be seen in the new Locks-Traps-DB. '
- +' Improved Error Handling and Capture'
- +' While I am very hopeful you never see fatal error in the RPGMaster suite of APIs, I admit they do occur. I have done even more to stop any error being terminal and stopping the APIs from running (though I can\'t stop every type of error). I have also implemented the error capture & reporting approach developed by The Aaron, which will prompt anyone experiencing any programatic failure (or at least the ones I can capture) to send me useful data to eliminate the bug. Please do look out for any of these, and send me the information using the instructions given if you see any. '
- +' Better Targeted Chat Window Dialogs'
- +' The RPGMaster suite APIs already do a good job of targeting all information displayed in the Chat Window to only those players and/or the GM that should see it or need to see it. This helps to keep Chat Window clutter down. However, I have been aware that there are certain circumstances where information has gone to too wide an audience, or not gone out at all (perhaps because the player identified to see it is off-line). '
- +' Some of the issue is that commands originated by the APIs rather than by a player clicking a button can be deemed by Roll20 to have come from the GM, and the APIs loose who the information on the outcome of that command should really go to. Using a mixture of an addressing extension to the --display-ability command, a better algorithm for inserting Chat Addressing Commands (e.g. /w, /gm, etc) into output streams, and in the extreme a senderID override system (see API help documentation for details), Chat Window messages and dialogs are mostly now only going to who they should, under all circumstances. '
- +' Improved "gm{...}" Roll Query Processing'
- +' The processing of the special version of the Roll20 Roll Query, which forces the Roll Query to be answered by the GM regardless of who originated the command and who the information is going back to, has been improved to provide a message to the player to "please wait for the GM to make a decision or a dice roll". The previous situation, of the player not seeing any feedback and wondering what was happening caused some confusion with the players and was unacceptable. '
- +' Preventative Error Fixes'
- +' The introduction of ever more asynchronous processing and multi-threading of the RPGMaster suite APIs has the potential to introduce unexpected handling of data if players make rapid and concurrent actions. The APIs have been further reviewed to ensure data is stacked and managed appropriately to ensure elimination of "leakage" of data between player actions. As I have yet to see any of this actually happening in game-play, the changes made are purely preventative and in anticipation of any errors. '
- +' Initialise Command now Automatic'
- +' The !cmd --initialise command now runs automatically on start-up, and displays a message if any new buttons have been added for the GM. Do take note of this. '
- +' Updated Help Handouts & Databases'
- +' Many of the Help Handouts have been updated to provide information on the new functionality. If you need more detailed information than is provided in this Release Note, please do refer to the Help Handouts which, as you know, are automatically added to any campaign that the RPGMaster suite is loaded into. '
- +' Also, additional updates and bug fixes to the databases continue, too many to list here! '
+ +' New creatures, with powers, weapons, classes and effects'
+ +' A number of new Drag & Drop creatures have been added, including many Giants, Metalic & Chromatic Dragons, Winter Wolves, Centaurs, Ropers, Hell Hounds and Titans, along with all their powers, weapons and spell-casting abilities. '
+ +' New RaceData attributes'
+ +' Mainly to support Drag & Drop dragons, new attributes have been added to RaceData specifications: Age, Magic resistance, and Spell Speed Override (e.g. dragons always cast spells at 1 segment). The Age attribute takes the form text:# , with the text version of the age being displayed in the Age field of the character sheet (this can of course just be the numeric age). The # is used in maths to affect other attributes and use of powers & spells. See the Class & Race Database Help handout for details. '
+ +' Drag & Drop Creature \'Query\' Attribute'
+ +' A new drag & drop creature RaceData \'query\' attribute has been created that adds an extra level of query to Drag & Drop creature selection and returns variables based on the selection. This is used, for instance, when Dragging & Dropping a Dragon to ask the GM for its age, which affects many of the attributes & powers of the Dragon. See the Class & Race Database Help handout for more information. '
+ +' Maths Evaluator for Drag & Drop Creature Attributes'
+ +' A new maths evaluation function has been added to support new race \'query\' variables. It is not possible to use the Roll20 chat maths for various reasons when specifying creature attributes that are dependent on the values returned by the new \'query\' attribute described above, so a new simple maths evaluator has been added to the APIs to support the likes of Dragon age variation. See the Class & Race Database Help handout for more information. '
+ +' Random Spells for Spell-casting Drag & Drop creatures'
+ +' It has been possible to specify spellbooks for Drag & Drop creatures that can cast spells for some time. However, it is now possible to add random spells (randomly selected and added to the spell book at creation) to the spell book. Just put the word "random" in as a spell name when specifying a spell book in the Drag & Drop creature specification e.g. [cl:MU,lv:2,w:random|random|random] would add three random spells to the creature\'s 2nd level spell book. As always, see the Class & Race Database Help handout for more information '
+ +' Drag & Drop Auto-Memorisation of Spells as well as Powers'
+ +' Drag & Drop creature Powers have always automatically been memorised. It is now the case that any spell-casting Drag & Drop creatures will memorise random sets of spells from their spell-books at each level appropriate to their casting capabilities. Priests always have all spells for their allowed spheres available for memorising and random spells will be selected from these as appropriate. But wizard classes may or may not have spell-books specified. If a Drag & Drop creature has a wizard casting level but no spells specified for their spell-books (using the [cl:MU,lv:#,w:...|...|...] syntax), the APIs will automatically randomly memorise valid spells appropriate to each valid spell casting level from all valid spells, and add these memorised spells to the creature\'s spell books. Of course, in the case of both Priest and Wizard classes, the GM can adjust the spells in the spell-books using the appropriate button on the GM\'s [Token Setup] dialog, and memorise different spells from the spell-book using the Spells Menu / Memorise Spells dialog. '
+ +' \'specmu\' ClassData Attribute'
+ +' The new \'specmu\' ClassData attribute flags this class is to be specmu:1 or not be specmu:0 a specialist Wizard class. Defaults to 1 for new classes of Wizard, meaning they can memorise an additional spell per spell level in their specialist school. '
+ +' Multiple Effect Instances'
+ +' To date, it has been possible to only simultaneously run multiple copies of the same Effect by adding a Differentiator to the called Effect name (see RoundMaster API Help handout for details). Invoking any Effect more than once using !rounds --target or !rounds --addstatus or any related command would overwrite, extend or otherwise change the duration and direction of the Effect, depending on the \'operator\' preceding the Effect duration (+,-,<,>,=). A new operator is now allowed: \'#\'. Specifying a duration such as #5 will spawn a new Status of the same name with duration of 5 rounds, apply any Effect-start specification again, invoke Effect-turn multiply each round, and invoke Effect-end as each instance of the Effect ends. An example of this use is the Roper Strand - multiple Roper Strand hits can affect the victim\'s Strength score at the same time. '
+ +' Item-Specific Spell Lists'
+ +' To date, specific spell book entries for spell-storing magic items were not allocated specifically to the item they were stored in: if two items had the same spell stored, and one of those spells had not yet been cast, either item could cast the remaining available spell which could cause issues and invalid game play. Spells are now tied to the item they are stored on even if the same spell is stored on two or more items. This approach has always been the case for items with powers - spells now use the same storing mechanism. However, backwards compatibility has been retained for use of legacy items and items already "owned" by characters. '
+ +' New !magic --change-attr Maths Operators'
+ +' The MagicMaster API command --change-attr can be used in Effects and the chat window to adjust the value of a character\'s attribute by a +/- amount. This takes account of strength 18 percentages (which will actually work on any attribute, though this is not strictly valid for 2e). Now, in addition you can use a \'*\' for multiply and \'/\' for divide to adjust the attribute by a specified factor. Several examples of this use can be seen in the Effects-DB. '
+ +' Multiple Bug Fixes'
+ +' The following bugs have been fixed '
+ +' '
+ +'- Fixed bug that prevented \'-turn\' effects working under some circumstances
'
+ +'- Fixed two-weapon attack speeds where one weapon has less than one attack per round.
'
+ +'- Fixed calculation of non-proficient weapon penalties set for classes & races.
'
+ +'- Fixed checking valid spells & valid powers which would show invalid spells/powers as valid under some circumstances.
'
+ +'- Fixed character level of creature that has both HD & caster level.
'
+ +'- Fixed save mods due to some magic items not being correctly applied.
'
+ +'- Several small database data fixes.
'
+ +'- Improved setAttr() error handling.
'
+ +' '
+' ',
},
RPGM_Templates_Handout: {name:'RPGMaster Library Help',
@@ -4546,10 +4723,10 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
+'',
},
ClassDatabase_Help: {name:'Class & Race Database Help',
- version:2.02,
+ version:2.03,
avatar:'https://s3.amazonaws.com/files.d20.io/images/257656656/ckSHhNht7v3u60CRKonRTg/thumb.png?1638050703',
bio:''
- +'Class & Race Database Help v2.02'
+ +'Class & Race Database Help v2.03'
+' '
+''
+' Character Class & Race Databases'
@@ -4654,6 +4831,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
+' '
+' slv: | <#|#|#|(MU/PR)> | three numbers followed by either MU or PR (no brackets), separated by vertical bars (\'|\'). The first number is the highest level of spell that can be cast, the second the first class level at which spells can be cast, and the third the maximum casting level, followed by the class of spells being specified (MU=Wizard, PR=Priest) | '
+' spl#: | <#|#|#|...> | for spells of level spl#, starting at the class level at which spells can be cast, the numbers of spells that can be cast at that and subsequent levels | '
+ +' specmu: | [ 0 | 1 ] | (not shown above) a flag signifying whether a non-standard wizard-type spellcaster is a specialist or not, granting the extra spell per level if \'1\' | '
+' '
+' Classes with Specific Powers'
+' A character class can also be granted powers, and these can be specified in the class definition both as text for the Player to read, and also coded so the APIs can read them. '
@@ -4668,6 +4846,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
+' cl: | <PW> | specifies the type of granted capability - for Class definitions, this is always PW (standing for Power) |
---|
'
+' w: | <text> | the name of the power granted (which should match a definition in the Powers database Powers-DB) |
---|
'
+' lv: | <#> | the character level at which they will gain this power |
---|
'
+ +' age: | <#> | (not shown above) the character age value at which they will gain this power (used for e.g. dragons). The age value is stored in @{selected|age|max} |
---|
'
+' pd: | < -1 / # / #L# > | the number of times per day the power can be used. A number, or -1 (meaning "at will"), or #L# which is first number per second number levels per day (e.g. 1L4 means once per day for L1 to L4, twice L5 to L8, etc) |
---|
'
+' '
+' This allows the DM to use a single button to add all the specified powers to the Powers list of a specific character sheet using the [Token-Setup] macro or the !cmd --abilities command, and then using the [Add to Spellbook] / [Powers] dialogue. The Player will then only be able to memorise the appropriate powers for the character\'s level. '
@@ -4765,6 +4944,37 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
+' both | weapon : qty | Name & quantity of two-handed weapon to take in both hands. Only 1 is taken in-hand, rest of qty held in items |
---|
'
+' items | weap/armour:qty | weap/armour:qty | ... | Name & quantity of weapons or armours to store as items of equipment. Armour will automatically contribute to creature armour class |
---|
'
+''
+ +' 4.2 Creatures with Spell-Casting Ability'
+ +' It is possible to give spell-casting creatures spells as powers - just specify the number per day as 1, and you can even use the MU-[Spell-Name] or PR-[spell-name] syntax as the power name to specify the spells to use (as shown in the Vampire above). However, for larger numbers of spells, and/or to grant random spells, an additional syntax is available: '
+ +' &{template:RPGMdefault}{{}}RaceData=[w:Frost Giant Witch Doctor,sps:any,cattr:cl=pr:frost-giant-shaman/mu:frost-giant-witch-doctor|lv=7/3,ns:2],[cl:MU,lv:1,w:random|random|random|Detect-Magic],[cl:MU,lv:2,w:random|ESP|Mirror-Image|random|random]{{}}Specs=[Frost-Giant-Witch-Doctor,CreatureRace,2H,Frost-Giant-AC0]{{}}%{Race-DB-Creatures|Frost-Giant-AC0}{{name= Witch Doctor}}{{Section3=**Witch Doctor:** This Frost Giant is a Witch Doctor that can cast spells of a number of wizard spells, and priest spheres of magic:*healing, charm, protection, divination*, or *weather*}}{{desc6=**Frost Giant Witch Doctor:** There is a 20% chance that any band of frost giants will have a shaman (80%) or witch doctor (20%). If the group is led by a jarl, there is an 80% chance for a spell caster. Frost giant shamans are priests of up to 7th level. A shaman can cast normal or reversed spells from the *healing, charm, protection, divination*, or *weather* spheres. Frost giant witch doctors are priest/wizards of up to 7th/3rd level; they prefer spells that can bewilder and confound other giants. Favorite spells include: *unseen servant, shocking grasp, detect magic, ventriloquism, deeppockets, ESP, mirror image,* and *invisibility*.}} '
+ +' This Witch Doctor has a number of spells specified to be in their spellbook by using the RaceData extension data sets: '
+ +' [cl:MU,lv:1,w:random|random|random|Detect-Magic],[cl:MU,lv:2,w:random|ESP|Mirror-Image|random|random] '
+ +' The cl:MU specifies that this data set specifies spells for the spellbook, and the lv:# specifies the level of spells. The w: string then defines the spell names, separated by pipes \'|\'. These names must be the same as those given in the spells databases (which can be listed using the GMs [Token Setup] / [Add Spells & Powers] dialog), or can be \'random\'. Specifying \'random\' will do what it says on the tin - a random spell will be chosen from all available spells at that level. If more than one spell is stated as \'random\' there is a chance that the same one will come up twice - the APIs will allow this. '
+ +' If a spellbook is specified for a creature in this way, it must be of a class that can cast spells or it will not be able to use them. The creature\'s level as a spellcaster will determine how many spells can be memorised at each level, regardless of how many are given in the spellbooks. '
+ +' Also, if spellbooks are specified like this the API will automatically memorise spells, selecting spells from the list at random up to the correct number for the creature\'s level. If a creature can cast Wizard spells and no spellbooks are specified, random spells will be memorised from all possible wizard spells that are valid for the schools that caster can cast. The GM (or other controlling player) can always use the Spells Menu to memorise different spells, and the GM can use the [Token Setup] / [Add Spells & Powers] dialog to change the spellbooks. '
+ +' If the creature can cast Priest spells, the creature will be granted a spellbook of all priest spells that are valid for the spheres it can cast, and random spells from this list automatically memorised from this list. The specification can override this behaviour by specifying particuler priest spells to have in the spellbook at a specific level using [cl:PR,lv:#,w:....] . Alternatiely, if the w: is followed by an empty string e.g. [cl:PR,lv:#,w:] , then the correct number of random priest spells will be memorised at each level, but only those memorised spells will be written to the spellbook. An example of this is for dragons, as according to the Monsterous Manual they only know an exclectic mix of spells they have picked up as they age and are not granted spells by a god. '
+ +' 4.3 Complex Creatures with Multiple Forms'
+ +' Some creatures, such as Dragons, have multiple forms and also vary within a single form. For example, a Dragon can be Red, Blue, White, Gold, Silver, Crystal, ... etc. Not only that, but each of these dragons\' powers grow with age from Hatchling through Juvenile, Adulthood, to Venerable, Wyrm & Great Wyrm. Rather than create a definition for each age and colour combination (which would result in 180 definitions just for the standard dragons!) it is possible to add a query presented to the GM when selecting the type of creature to drag & drop. This query can specify data to be factored into calculations in the RaceData specification dependent on the selection made. '
+ +' &{template:RPGMdefault}{{title=Red}}{{name=Dragon}}Specs=[Dragon,DragonRace,2H,Creature]{{subtitle=Dragon}}RaceData=[w:Red Dragon, query:What Age?|Hatchling%%1%%-6|Very Young%%2%%-4|Young%%3%%-2|Juvenile%%4%%0|Young Adult%%5%%1|Adult%%6%%2|Mature Adult%%7%%3|Old%%8%%4|Very Old%%9%%5|Venerable%%10%%6|Wyrm%%11%%7|Great Wyrm%%12%%8, align:CE, ac:none, cattr:int=15:16|mov=9|fly=30C|jump=3|ac=1-??1|age=??0:??1|hd=(11+??1)d8r1|mr=(v(^((??1-4);0);1)*??1*5)|cl=mu:red-dragon/pr:red-dragon|lv=8+??1/8+??1|spellsp=1|thac0=11-??1|tohit=??2|dmg=??1|size=G|attk1=1d10:Claw x 2 or Claw+Kick:0:S|attk2=3d10:Bite:0:P|attk3=2d10:Tail Swipe:0:B|attkmsg=Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$Remember powers such as *Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*$$\lbrak;Show the radius\rbrak;\lpar;!rounds ~~aoe `{selected¦token_id}¦arc180¦0¦80¦160¦red\rpar; then up to \lbrak;\lbrak;`{selected¦age|max}\rbrak;\rbrak; opponents in the area take damage and Save vs. Petrification with the penalty shown below or be \lbrak;Stunned\rbrak;\lpar;!rounds ~~target area¦`{selected¦token_id}¦`{target¦Select the stunned creature¦token_id}¦Stunned¦\lbrak;[1+1d4]\rbrak;¦-1¦Stunned by a dragon tail slap¦back-pain\rpar; for 1d4+1 rounds., spattk:*Dragon Fear; Wing Buffet; Snatch; Plummet;* and *Spell Casting*, spdef:Magic resistance \lbrak;\lbrak;({ { { {(@{selected|age|max}-4)},{0} }kh1}, {1} }kl1) * (@{selected|age|max}+1) * 5\rbrak;\rbrak;%, ns:1],[cl:PW,w:MU-Affect-Normal-Fires,pd:3,sp:1],[cl:PW,w:MU-Pyrotechnics,pd:3,sp:1],[cl:PW,w:PR-Heat-Metal,pd:1,sp:1],[cl:PW,w:MU-Suggestion,pd:1,sp:1],[cl:PW,w:MU-Hypnotism,pd:1,sp:1],[cl:PW,w:Detect-Gems-Kind+Number,pd:3,sp:1],[cl:PW,w:Red-Dragon-Breath,pd:-1,sp:1],[cl:PW,w:PW-Snatch,lv:14,pd:-1,sp:0],[cl:PW,w:PW-Plummet,pd:-1,sp:0],[cl:PW,w:PW-Wing-Buffet,lv:14,pd:-1,sp:0],[cl:PW,w:PW-Stall,pd:-1,sp:0],[cl:PW,w:PW-Dragon-Fear,lv:14,pd:-1,sp:0],[cl:PR,lv:1,w:],[cl:PR,lv:2,w:]{{Section=**Attributes**}}{{Intelligence=Exceptional (15-16)}}{{AC=Varies with age, adult red dragon is AC -5}}{{Alignment=Chaotic Evil}}{{Move=9, FL 30(C), Jump 3}}{{Hit Dice=Varies with age, adult red dragon is 15 HD}}{{THAC0=Varies with age, adult red dragon is 5}}{{Section1=**Attacks:** ToHit and damage bonus varies with age, adult red dragon is +2 and +6. 2 x Claws for 1d10 HP each, possibly with 1 or 2 kicks for 1d10 each, bite for 3d10, and tail slap for 2d10 and possible *stun* within an area varying with age. Several other attacks possible - see *Powers*}}{{Languages=*Red Dragon* and *Dragon Common*, and 16% if hatchlings (+5% per age level) can perform universal communication with any intelligent creature}}{{Size=G, varies with age}}{{Life Expectancy=Possibly in excess of 1,000 years. Adult dragons are considered between 100 and 200 years old}}{{Section2=**Powers**}}{{Breath Weapon=A cone of flame, 90ft long, 5ft wide at dragon and spreading to 30ft wide. Damage varies by age from 2d10+1 to 24d10+12. Save vs. Breath Weapon to take half damage}}{{Fear=Can inspire fear in creatures that see the dragon: affect varies with the level / HD of the viewing creature.}}{{Spell Casting=Knows a number of random wizard and priest spells cast at a level from 10 to 21 varying with age. All spells are cast at a speed of 1 segment regardless of the spell}}{{Spell-like Powers=*Young* dragons can *Affect Normal Fires* x 3 per day, *Juveniles* gain *Pyrotechnics* x3 per day, *Adult* gains *Heat Metal* x 1 per day, *Old* gain *Suggestion* x 1 per day, *Very Old* gain *Hypnotism* x 1 per day, and *Venerable* gain *Detect Gems, Kind & Number* x 3 per day}}{{Special Attacks=*Snatch, Plummet, Stall*, and *Wing Buffet*}}{{Section4=**Special Advantages**}}{{Section5=Its a Dragon!}}{{Section6=**Special Disadvantages**}}{{Section7=None}}{{Section9=**Description**}}{{desc7=Dragons are an ancient, winged reptilian race. They are known and feared for their size, physical prowess, and magical abilities. The oldest dragons are among the most powerful creatures in the world. Most dragons are identified by the color of their scales. All subspecies of dragons have 12 age categories, and gain more abilities and greater power as they age. Dragons range in size from several feet upon hatching to more than 100 feet, after they have attained the status of great wyrm. The exact size varies according to age and subspecies... }} '
+ +' In the case of dragons, this query asks the GM for the age to make the dragon, and sets two values based on the age to use in calculations (seen above in red). The query will be applied to all creatures of the Creature Database-Class (Specs definition field 2), in this case any DragonRace creature, even if the roll query is specified in the definition of only 1 such creature. Different roll queries can be specified for different Creature Database-Classes: you can make up your own db-classes to differentiate them. '
+ +' The query specification in the Data section has the following syntax: '
+ +' query:What Age?|Hatchling%%1%%-6|Very Young%%2%%-4|Young%%3%%-2|Juvenile%%4%%0|Young Adult%%5%%1|Adult%%6%%2|Mature Adult%%7%%3|Old%%8%%4|Very Old%%9%%5|Venerable%%10%%6|Wyrm%%11%%7|Great Wyrm%%12%%8 '
+ +' If you are familiar with Roll20 Roll Queries, you will note that the ?{...} has been left out: only the text between the braces is defined. This text starts with the query text to be presented to the GM - "What Age?". Possible answers are then specified, separated by pipes \'|\'. Each answer has text followed by values separated by double-percents \'%%\'. The text will be displayed in the roll query to the GM to select the option. The percent-separated values will be returned by the query, including the text as the first value. '
+ +' It is then possible to refer to the returned values in the RaceData specification using the syntax ??# , where # is the zero-based number of the value - ??0 is the text of the option selected, ??1 the next value, ??2 the value after that, etc. An example of this is given in the new age=??0:??1 data specification in red above, which will set the character sheet "age" field to the text of the dragon\'s age selected by the GM, and the sheet "age|max" field to the ??1 parameter, which is the "age value" of that age of dragon. '
+ +' It is possible to do simple maths using these values and others in the data specification. The API supports plus (+), minus (-), times (*), divide (/), left & right parenthesis (()), max (^(...;...)), min (v(...;...)), dice rolls (#d#+#r#), and ranges (#:#). These operators can be combined in simple ways - to be honest, I\'ve not tested all possible combinations - keep it simple and it should work! An example is the calculation for magic resistance: '
+ +' mr=(v(^((??1-4);0);1)*??1*5) '
+ +' The order of calculation is: '
+ +' - the two instances of ??1 will be replaced by the first value after the selected text in the roll query,
'
+ +'- then the parentheses that hold numbers are calculated (??1-4),
'
+ +'- then any ranges are resolved by rolling a number in the range (none here),
'
+ +'- next dice rolls are made (none here),
'
+ +'- then the max & min are resolved and
'
+ +'- the final parentheses calculated.
'
+ +' Ranges: These are specified with two numbers separated by a colon, thus ##:## . E.g. 3:18 - The API will attempt to roll any range by using the Roll20 dice roller, with 3 dice if possible (so that standard attribute rolls of NPCs and creatures are as close to real as possible). Thus, 3:18 is rolled using 3d6, 6:15 will be 3d4+3, 5:17 is 3d5+2. If a range is too small or cannot be done with 3 dice, 2 or 1 will be used instead, so 2:4 will be 1d3+1, 15:16 will be 1d2+14 etc. If you want more control, specify a particular dice roll. '
+ +' Dice Rolls: can be specified using the syntax #d#+#r# or #d#-#r# : all parts except the #d# are optional. The r# specifies a re-roll number - if any dice roll is equal to or less than the r# number, that dice alone will be rerolled until the value is higher. Note: The Hit Dice specification (hd=) can use a format like #d# or #d#+# or #d#+#r# (the plus can be a minus), or can be extended to #d#+#d#r# (i.e. the roll modifier can be a dice roll itself) - but the reroll value always applies to the main dice roll. Avoid other maths for the Hit Dice value, but ??# substitutions and maths on the number of dice are possible e.g. (??1+9)d8+??2r2 is valid. '
+ +' Min & Max: The operators ^ (caret - max) and v (lower-case V - min) can be used with the syntax ^(#;#;#) or v(#;#;#;#) (any number of values is valid) and will evaluate to the maximum or minimum value respectively. Note that a semi-colon separator \';\' is used rather than a comma. '
+ +' So now it can be seen that the Magic Resistance calculation above will resolve to 0 if the ??1 value is 4 or less, or (5 times ??1) if ??1 is 5 or more. The combination of the Roll Query, values set by the answer to it, and the simple maths engine can provide powerful results. '
+ +' Note: semi-colons are used for min & max seperators, and square brackets avoided for calculations, so that Roll20 calculations are not inappropriately triggered when the Roll Templates are displayed and so that these calculations can be passed in API calls. Use these forms of maths in creature definition data specifications, and not Roll20 calculations, to avoid issues. Roll20 calculations can be used inside {{...}} parts of Roll Templates as these will never be encountered by the API management functions, including in API button calls. '
+' 5. Specs & Data field values'
+' Below are lists of the current possible values for the Class and Race database Ability macro sections. '
+' 5.1 Specs sections'
@@ -5257,33 +5467,33 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
trap: {type:'trap',field:fields.ItemTrapsList},
lock: {type:'lock',field:fields.ItemLocksList},
});
- const clTypeLists = Object.freeze({
- warriorclass: {type:'warrior',field:fields.ClassWarriorList},
- warriorhrclass: {type:'warrior',field:fields.ClassWarriorList},
- warriorkitclass:{type:'warrior',field:fields.ClassWarriorList},
- wizardclass: {type:'wizard',field:fields.ClassWizardList},
- wizardhrclass: {type:'wizard',field:fields.ClassWizardList},
- wizardkitclass: {type:'wizard',field:fields.ClassWizardList},
- priestclass: {type:'priest',field:fields.ClassPriestList},
- priesthrclass: {type:'priest',field:fields.ClassPriestList},
- priesthoodclass:{type:'priest',field:fields.ClassPriestList},
- priestkitclass: {type:'priest',field:fields.ClassPriestList},
- rogueclass: {type:'rogue',field:fields.ClassRogueList},
- roguehrclass: {type:'rogue',field:fields.ClassRogueList},
- roguekitclass: {type:'rogue',field:fields.ClassRogueList},
- psionclass: {type:'psion',field:fields.ClassPsionList},
- psionhrclass: {type:'psion',field:fields.ClassPsionList},
- psionkitclass: {type:'psion',field:fields.ClassPsionList},
- creatureclass: {type:'creature',field:fields.ClassCreatureList},
- humanoidrace: {type:'humanoid',field:fields.RaceHumanoidList},
- humanoidhrrace: {type:'humanoid',field:fields.RaceHumanoidList},
- humanoidkitrace:{type:'humanoid',field:fields.RaceHumanoidList},
- humanoidcreature:{type:'creature',field:fields.RaceCreatureList},
- creaturerace: {type:'creature',field:fields.RaceCreatureList},
- creaturehrrace: {type:'creature',field:fields.RaceCreatureList},
- creaturekitrace:{type:'creature',field:fields.RaceCreatureList},
- container: {type:'container',field:fields.ContainerList},
- });
+ var clTypeLists = {
+ warriorclass: {type:'warrior',field:fields.ClassWarriorList,query:''},
+ warriorhrclass: {type:'warrior',field:fields.ClassWarriorList,query:''},
+ warriorkitclass:{type:'warrior',field:fields.ClassWarriorList,query:''},
+ wizardclass: {type:'wizard',field:fields.ClassWizardList,query:''},
+ wizardhrclass: {type:'wizard',field:fields.ClassWizardList,query:''},
+ wizardkitclass: {type:'wizard',field:fields.ClassWizardList,query:''},
+ priestclass: {type:'priest',field:fields.ClassPriestList,query:''},
+ priesthrclass: {type:'priest',field:fields.ClassPriestList,query:''},
+ priesthoodclass:{type:'priest',field:fields.ClassPriestList,query:''},
+ priestkitclass: {type:'priest',field:fields.ClassPriestList,query:''},
+ rogueclass: {type:'rogue',field:fields.ClassRogueList,query:''},
+ roguehrclass: {type:'rogue',field:fields.ClassRogueList,query:''},
+ roguekitclass: {type:'rogue',field:fields.ClassRogueList,query:''},
+ psionclass: {type:'psion',field:fields.ClassPsionList,query:''},
+ psionhrclass: {type:'psion',field:fields.ClassPsionList,query:''},
+ psionkitclass: {type:'psion',field:fields.ClassPsionList,query:''},
+ creatureclass: {type:'creature',field:fields.ClassCreatureList,query:''},
+ humanoidrace: {type:'humanoid',field:fields.RaceHumanoidList,query:''},
+ humanoidhrrace: {type:'humanoid',field:fields.RaceHumanoidList,query:''},
+ humanoidkitrace:{type:'humanoid',field:fields.RaceHumanoidList,query:''},
+ humanoidcreature:{type:'creature',field:fields.RaceCreatureList,query:''},
+ creaturerace: {type:'creature',field:fields.RaceCreatureList,query:''},
+ creaturehrrace: {type:'creature',field:fields.RaceCreatureList,query:''},
+ creaturekitrace:{type:'creature',field:fields.RaceCreatureList,query:''},
+ container: {type:'container',field:fields.ContainerList,query:''},
+ };
const spTypeLists = Object.freeze({
muspelll1: {type:'muspelll1',field:['spellmem','current']},
muspelll2: {type:'muspelll2',field:['spellmem2','current']},
@@ -5467,7 +5677,8 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
[fields.Wizard_class,fields.Wizard_level,-5],
[fields.Priest_class,fields.Priest_level,-3],
[fields.Rogue_class,fields.Rogue_level,-3],
- [fields.Psion_class,fields.Psion_level,-4]
+ [fields.Psion_class,fields.Psion_level,-4],
+ [fields.Monster_class,fields.Monster_level,-2],
];
var rangedWeapMods = {
N : -5,
@@ -5675,6 +5886,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
const reClassSpecs = {
name: {field:'name',def:'-',re:/[\[,\s]w:([\s\w\-\+]+?)[,\]]/i},
+ query: {field:'query',def:'',re:/[\[,\s]query:(.+?)[,\]]/i},
alignment: {field:'align',def:'any',re:/[\[,\s]align:([\s\w\-\+\|\!]+?)[,\s\]]/i},
race: {field:'race',def:'any',re:/[\[,\s]race:([\s\w\-\+\|\!]+?)[,\s\]]/i},
hitdice: {field:'hd',def:'1d10',re:/[\[,\s]hd:([d\d\+\-]+?)[,\s\]]/i},
@@ -5694,10 +5906,11 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
spattk: {field:'spattk',def:'',re:/[\[,\s]spattk:(.+?)[,\]]/i},
spdef: {field:'spdef',def:'',re:/[\[,\s]spdef:(.+?)[,\]]/i},
powerdef: {field:'cl',def:'',re:/[\[,\s]cl:([\s\w]+?)[,\]]/i},
- numpowers: {field:'numpowers',def:0,re:/[\[,\s]ns:([\d\w]+?)[,\s\]]/i},
+ numpowers: {field:'numpowers',def:0,re:/[\[,\s]ns:(=?[\d\w]+?)[,\s\]]/i},
slots: {field:'slots',def:18,re:/[\[,\s]slots:([\d\w]+?)[,\s\]]/i},
action: {field:'action',def:0,re:/[\[,\s]action:([0|1])[,\s\]]/i},
magical: {field:'magical',def:0,re:/[\[,\s]magical:([0|1])[,\s\]]/i},
+ specmu: {field:'specmu',def:1,re:/[\[,\s]specmu:([0|1])[,\s\]]/i},
lock: {field:'lock',def:'',re:/[\[,\s]lock:(.*?)[,\s\]]/i},
trap: {field:'trap',def:'',re:/[\[,\s]trap:(.*?)[,\s\]]/i},
tvar1: {field:'tvar1',def:undefined,re:/[\[,\s]tvar1:(.*?)[,\]]/i},
@@ -5764,24 +5977,27 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
mov: {field:'mov',def:'',re:/[:\s\|]?mov\s*=\s*(.*?(?:\:[\s\d]+?)?)[\|,\]]/i},
fly: {field:'fly',def:'',re:/[:\s\|]?fly\s*=\s*(.*?)[\|,\]]/i},
swim: {field:'swim',def:'',re:/[:\s\|]?sw(?:im)?\s*=\s*(.*?)[\|,\]]/i},
- tohit: {field:'tohit',def:'',re:/[:\s\|]?tohit\s*=\s*([-+]?\d+?)[\|,\]]/i},
- dmg: {field:'dmg',def:'',re:/[:\s\|]?dmg\s*=\s*([-+]?\d+?)[\|,\]]/i},
+ tohit: {field:'tohit',def:'',re:/[:\s\|]?tohit\s*=\s*([dr\d\+\-\(\)\*\/\:]+?)[\|,\]]/i},
+ dmg: {field:'dmg',def:'',re:/[:\s\|]?dmg\s*=\s*([\d\+\-\(\)\*\/\:]+?)[\|,\]]/i},
dexdef: {field:'dexdef',def:'',re:/[:\s\|]?dexdef\s*=\s*([-+]?\d+?)[\|,\]]/i},
crith: {field:'crith',def:'20',re:/[:\s\|]?ch\s*=\s*(\d+?)[\|,\]]/i},
critm: {field:'critm',def:'1',re:/[:\s\|]?cm\s*=\s*(\d+?)[\|,\]]/i},
- hd: {field:'hd',def:'',re:/[:\s\|]?hd\s*=\s*(\d[dr\d\+\-]*?)[\|,\]]/i},
- hp: {field:'hp',def:'',re:/[:\s\|]?hp\s*=\s*(\d*?)[\|,\]]/i},
+ hd: {field:'hd',def:'',re:/[:\s\|]?hd\s*=\s*([\(\d][dr\d\+\-\(\)\*\/\:]*?)[\|,\]]/i},
+ hp: {field:'hp',def:'',re:/[:\s\|]?hp\s*=\s*([\d\+\-\(\)\*\/\:]*?)[\|,\]]/i},
regen: {field:'regen',def:'',re:/[:\s\|]?regen\s*=\s*(\d*?)[\|,\]]/i},
- thac0: {field:'thac0',def:'',re:/[:\s\|]?thac0\s*=\s*([\d\+\-]+?)[\|,\]]/i},
+ thac0: {field:'thac0',def:'',re:/[:\s\|]?thac0\s*=\s*([dr\d\+\-\(\)\*\/\:]+?)[\|,\]]/i},
size: {field:'size',def:'M',re:/[:\s\|]?size\s*=\s*([TSMLHG])[\|,\]]/i},
attk1: {field:'attk1',def:'',re:/[:\s\|]?attk1\s*=\s*(.*?)[\|,\]]/i},
attk2: {field:'attk2',def:'',re:/[:\s\|]?attk2\s*=\s*(.*?)[\|,\]]/i},
attk3: {field:'attk3',def:'',re:/[:\s\|]?attk3\s*=\s*(.*?)[\|,\]]/i},
attkmsg: {field:'attkmsg',def:'',re:/[:\s\|]?attkmsg\s*=\s*(.*?)[\|,\]]/i},
dmgmsg: {field:'dmgmsg',def:'',re:/[:\s\|]?dmgmsg\s*=\s*(.*?)[\|,\]]/i},
- speed: {field:'speed',def:'',re:/[:\s\|]?sp\s*=\s*([\d\+\-]+?)[\|,\]]/i},
+ speed: {field:'speed',def:'',re:/[:\s\|]?sp\s*=\s*([\d\+\-\(\)\*\/\:]+?)[\|,\]]/i},
+ spellspeed: {field:'spellspeed',def:'',re:/[:\s\|]?spellsp\s*=\s*([\d\+\-\(\)\*\/\:]+?)[\|,\]]/i},
+ mr: {field:'mr',def:'',re:/[:\s\|]?mr\s*=\s*(.*?)[\|,\]]/i},
+ age: {field:'age',def:'',re:/[:\s\|]?age\s*=\s*([\s\d\+\-\(\)\*\/\:\w]*?)[\|,\]]/i},
cl: {field:'cl',def:'',re:/[:\s\|]?cl\s*=\s*([-\:\/\w]*?)[\|,\]]/i},
- lv: {field:'lv',def:'',re:/[:\s\|]?lv\s*=\s*([\d\/]*?)[\|,\]]/i},
+ lv: {field:'lv',def:'',re:/[:\s\|]?lv\s*=\s*([dr\d\+\-\(\)\*\/\:]*?)[\|,\]]/i},
};
const reSpellSpecs = {
@@ -5790,6 +6006,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
type: {field:'spell',def:'',re:/[\[,\s]cl:(PR|MU|PW|MI|WP|AC|AB)[,\s\]]/i},
itemType: {field:'itemType',def:'',re:/[\[,\s]st:([\s\w\-\+]+?)[,\]]/i},
speed: {field:'speed',def:0,re:/[\[,\s]sp:([d\d\+\-]+?)[,\s\]]/i},
+ age: {field:'age',def:0,re:/[:\s\|]?age\s*:\s*([\d\+\-\(\)\*\/\:\w]*?)[\|,\]]/i},
level: {field:'level',def:1,re:/[\[,\s]lv:(\d+?)[,\s\]]/i},
castlvl: {field:'castlvl',def:-1,re:/[\[,\s]clv:(\d+?)[,\s\]]/i},
lvlimit: {field:'lvlimit',def:0,re:/[\[,\s]lvl:([0|1])[,\s\]]/i},
@@ -5832,6 +6049,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
[/\\cr;?/g, "
"],
[/&&/g, "/"],
[/%%/g, "%"],
+ [/\\comma;?/g, ","],
];
const dbEncoders = [
@@ -5917,6 +6135,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
WeaponArmourDatabaseHelp: '',
};
*/ var DBindex;
+ var classesParsed = false;
var magicList = {};
var RPGMap = {};
var apis = {magic:false,attk:false,init:false};
@@ -6342,7 +6561,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
if (!rowVals) rowVals = this.copyValues();
if (index) index = parseInt(index);
if (_.isUndefined(index) || isNaN(index)) index = this.sortKeys.length;
-
+
if ((index < 0) || ((index < this.sortKeys.length) && !_.isUndefined(this.tableLookup( fields[fieldGroup+'name'], index, false )))) {
_.each( list, (elem,key) => {
if (_.isUndefined(elem.attrs)) return;
@@ -7984,7 +8203,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
return true;
});
magicList = {}; // Blank the internal index of items, as it might have changed and needs rebuilding
- LibFunctions.sendFeedback( waitMsgDiv+'RPGMaster is now ready. ' );
+// LibFunctions.sendFeedback( waitMsgDiv+'RPGMaster is now ready.' );
return index;
}
@@ -8032,8 +8251,8 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
if (!lists[objCS.id][itemType].includes(objName)) {
lists[objCS.id][itemType].push(objName);
};
- } else if (_.isUndefined(itemType)) {
- LibFunctions.sendError((objName+' is of undefined type '+t+'. Please correct this item definition.'));
+// } else if (_.isUndefined(itemType)) {
+// LibFunctions.sendError((objName+' is of undefined type '+t+'. Please correct this item definition.'));
};
};
};
@@ -8229,13 +8448,13 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
* consolidate their parsed data and attribute specifications
*/
- LibFunctions.resolveData = function( name, dBase, reThisData, defBase=true, doneList=[] ) {
+ LibFunctions.resolveData = function( name, dBase, reThisData, quals=[], defBase=true, doneList=[] ) {
var thisObj, thisSpecs, baseObj, thisData, thisAttr, parsedData,
baseData = [],
baseParsed = LibFunctions.parseData( '', reClassSpecs, defBase ),
baseAttr = LibFunctions.parseData( '', reAttr, defBase ),
- debugging = false;
+ debugging = false; //(name.dbName() === 'bronzedragon');
if (!name || !name.trim().length || doneList.includes(name.dbName())) {if (debugging) log('resolveData: no name or already processed '+name); return [baseParsed,baseAttr,baseData];}
thisObj = LibFunctions.abilityLookup( dBase, name, null, true );
@@ -8243,9 +8462,12 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
doneList.push(name.dbName());
thisSpecs = thisObj.specs();
if (!thisSpecs || !thisSpecs[0]) {if (debugging)log('resolveData: no Specs in definition of '+name);return [baseParsed,baseAttr,baseData];}
- [baseParsed,baseAttr,baseData] = LibFunctions.resolveData( thisSpecs[0][4], dBase, reThisData, defBase, doneList );
+ [baseParsed,baseAttr,baseData] = LibFunctions.resolveData( thisSpecs[0][4], dBase, reThisData, quals, defBase, doneList );
thisData = thisObj.data(reThisData);
if (!thisData || !thisData[0]) {if (debugging)log('resolveData: no data in definition of '+name+', thisData.length = '+(!thisData ? 0 : thisData.length));return [baseParsed,baseAttr,baseData];}
+ _.each( quals, (q,k) => thisData[0][0] = thisData[0][0].replace(new RegExp('\\?\\?'+k,'g'),q));
+ if (debugging) log('resolveData: quals = '+quals+', after ??# replacement, thisData[0][0] = '+thisData[0][0]);
+ thisData[0][0] = thisData[0][0].replace(/\?\?\d/g,'0');
parsedData = LibFunctions.parseData( thisData[0][0], reClassSpecs, false );
thisAttr = LibFunctions.parseData( parsedData.cattr+',', reAttr, false );
if (baseParsed) {
@@ -8431,7 +8653,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
// if (_.isUndefined(classDef) || !classDef.length) classDef = [{name:'creature', base:'warrior', level:0, obj:LibFunctions.abilityLookup( fields.ClassDB, 'creature', charCS ).obj}];
// classDef = classDef.map(c => {[c.classData] = LibFunctions.resolveData(c.name, c.dB, reData);return c});
if (_.isUndefined(classDef) || !classDef.length) classDef = [{name:'creature', dB:fields.RaceDB, base:'warrior', dBbase:fields.ClassDB, level:0, obj:LibFunctions.abilityLookup( fields.ClassDB, 'creature', charCS ).obj}];
- classDef = classDef.map(c => {[c.classData] = LibFunctions.resolveData((c.name || charClass), (c.dB || dB), reData);return c});
+ classDef = classDef.map(c => {[c.classData,c.attrData,c.rawData] = LibFunctions.resolveData((c.name || charClass), (c.dB || dB), reData);return c});
} catch (e) {
LibFunctions.sendCatchError( 'RPGM Library',(senderId ? msg_orig[senderId] : null),e,'RPGM Library classObjects()');
@@ -8567,6 +8789,8 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
var typeList;
if (objIndex[0].length) {
let obj = getObj('ability',objIndex[0]);
+// log('addItemToList: adding '+objName+', _.isUndefined(obj) = '+_.isUndefined(obj));
+ if (!obj) return true;
let objDef = obj.get('action');
let specs = objDef.match(reSpecs);
specs = specs ? [...('['+specs[0]+']').matchAll(reSpecsAll)] : [];
@@ -8578,7 +8802,15 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
if (t==='magic') continue;
if ((mapObj[t] && !!mapObj[t].type && objType.includes(mapObj[t].type))
|| (!mapObj[t] && mapObj.miscellaneous && objType.includes(mapObj.miscellaneous.type))) {
- list.push(obj.get('name').dispName());
+ let listName = obj.get('name').dispName();
+ let listQuery = !mapObj[t] ? '' : (!mapObj[t].query ? '' : '%%'+mapObj[t].query).replace(/%/g,'%%')
+ .replace(/\&/g,'&')
+ .replace(/\?/g,'?')
+ .replace(/{/g,'&#123;')
+ .replace(/}/g,'&#125;')
+ .replace(/\|/g,'&#124;')
+ .replace(/\,/g,'&#44;');
+ list.push(listName+(alphabet ? ',' : ',')+listName+listQuery);
break outer_block;
}
}
@@ -8591,7 +8823,15 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
if (t === 'magic') continue;
if ((mapObj[t] && !!mapObj[t].type && objType.includes(mapObj[t].type))
|| (!mapObj[t] && mapObj.miscellaneous && objType.includes(mapObj.miscellaneous.type))) {
- list.push(dbNames[objIndex[2]].db[objIndex[3]].name.dispName());
+ let listName = dbNames[objIndex[2]].db[objIndex[3]].name.dispName();
+ let listQuery = !mapObj[t] ? '' : (!mapObj[t].query ? '' : '%%'+mapObj[t].query).replace(/%/g,'%%')
+ .replace(/\&/g,'&')
+ .replace(/\?/g,'?')
+ .replace(/{/g,'&#123;')
+ .replace(/}/g,'&#125;')
+ .replace(/\|/g,'&#124;')
+ .replace(/\,/g,'&#44;');
+ list.push(listName+(alphabet ? ',' : ',')+listName+listQuery);
break;
}
}
@@ -8625,18 +8865,18 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
if (alphabet) {
for (let i=65; i<=90; i++) {
let subList = list.filter( n => n.toUpperCase().charCodeAt(0)==i )
- .concat(list.filter( n => n.toUpperCase().startsWith('POTION OF ') && n.charCodeAt(10)==i ),
- list.filter( n => n.toUpperCase().startsWith('RING OF ') && n.charCodeAt(8)==i ),
- list.filter( n => n.toUpperCase().startsWith('SCROLL OF ') && n.charCodeAt(10)==i ))
- .join('|');
+ .concat(list.filter( n => n.toUpperCase().startsWith('POTION OF ') && n.toUpperCase().charCodeAt(10)==i ),
+ list.filter( n => n.toUpperCase().startsWith('RING OF ') && n.toUpperCase().charCodeAt(8)==i ),
+ list.filter( n => n.toUpperCase().startsWith('SCROLL OF ') && n.toUpperCase().charCodeAt(10)==i ));
if (subList && subList.length) {
- alphaList.push(String.fromCharCode(i)+',?{Choose from |'+subList+'}');
+ if (subList.length === 1) subList.push(subList[0]);
+ alphaList.push(String.fromCharCode(i)+',?{Choose from |'+(subList.join('|'))+'}');
}
};
list = alphaList;
}
if (other) {
- if (!alphabet) list = list.map( e => e + ',' + e );
+// if (!alphabet) list = list.map( e => e + ',' + e );
list.push('Other,?{'+otherMsg+'}');
}
@@ -8645,6 +8885,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
magicList[rootDB][objType].list = list.join('|');
magicList[rootDB][objType].alpha = alphabet;
}
+// log('getMagicList: magicList['+rootDB+']['+objType+'] = '+magicList[rootDB][objType].list);
return magicList[rootDB][objType].list;
};
@@ -8736,13 +8977,13 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
LibFunctions.characterLevel = function( charCS ) {
var level = parseInt((LibFunctions.attrLookup( charCS, fields.Total_level ) || 0),10);
if (!level) {
- level = parseInt((LibFunctions.attrLookup( charCS, fields.Fighter_level ) || 0),10)
- + parseInt((LibFunctions.attrLookup( charCS, fields.Wizard_level ) || 0),10)
- + parseInt((LibFunctions.attrLookup( charCS, fields.Priest_level ) || 0),10)
- + parseInt((LibFunctions.attrLookup( charCS, fields.Rogue_level ) || 0),10)
- + parseInt((LibFunctions.attrLookup( charCS, fields.Psion_level ) || 0),10)
- + (parseInt((LibFunctions.attrLookup( charCS, fields.Monster_hitDice ) || 0),10)
- + ((parseInt((LibFunctions.attrLookup( charCS, fields.Monster_hpExtra ) || 0),10) >= 3) ? 1 : 0));
+ level = Math.max(((parseInt((LibFunctions.attrLookup( charCS, fields.Monster_hitDice ) || 0),10)
+ + ((parseInt((LibFunctions.attrLookup( charCS, fields.Monster_hpExtra ) || 0),10) >= 3) ? 1 : 0)) || 0),
+ ((parseInt((LibFunctions.attrLookup( charCS, fields.Fighter_level ) || 0),10)
+ + parseInt((LibFunctions.attrLookup( charCS, fields.Wizard_level ) || 0),10)
+ + parseInt((LibFunctions.attrLookup( charCS, fields.Priest_level ) || 0),10)
+ + parseInt((LibFunctions.attrLookup( charCS, fields.Rogue_level ) || 0),10)
+ + parseInt((LibFunctions.attrLookup( charCS, fields.Psion_level ) || 0),10)) || 0));
}
return level;
}
@@ -8767,6 +9008,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
charClass = (LibFunctions.attrLookup( charCS, casterData[0] ) || '');
castingClass = charClass.dbName().replace(reIgnore,'');
level = LibFunctions.attrLookup(charCS,casterData[1]) || 0;
+// log('caster: castingClass = '+castingClass+': exists = '+!(_.isUndefined(spellsPerLevel[castingClass]) || _.isUndefined(spellsPerLevel[castingClass][casterType]))+', level = '+level);
if (level > 0 && (_.isUndefined(spellsPerLevel[castingClass]) || _.isUndefined(spellsPerLevel[castingClass][casterType]))) {
if (casterType == 'MU' && casterData[0][0] == fields.Wizard_class[0]) {
castingClass = 'WIZARD';
@@ -8776,12 +9018,13 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
level = 0;
}
}
- if (level > 0 && casterType === casterData[2]) break;
+ if (level > 0) break;
}
if (level>0 && castingClass) {
castingLevel = Math.min(Math.max((1+parseInt(level) - spellsPerLevel[castingClass][casterType][0][1]),0),spellsPerLevel[castingClass][casterType][0][2]);
if (castingLevel <= 0) castingLevel = -1;
};
+// log('caster: charClass = '+charClass+', castingClass = '+castingClass+', level = '+level+', castingLevel = '+castingLevel);
return {lv:level,cl:charClass,clv:castingLevel,ccl:castingClass};
};
@@ -8834,7 +9077,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
* any changes held for specific Class definitions
*/
- LibFunctions.parseClassDB = function(silent=true) {
+ LibFunctions.parseClassDB = function(forceUpdate=false) {
var doParse = function( rootDB, saveMods ) {
let isClass = rootDB === fields.ClassDB,
@@ -8844,33 +9087,36 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
let parsedData, parsedAttr, classData;
let def = LibFunctions.abilityLookup(rootDB, ClassName),
- type = !def.obj ? '' : def.obj[1].type;
-
- [parsedData,parsedAttr,classData] = LibFunctions.resolveData( ClassName, rootDB, /}}\s*?(?:Class|Race)Data\s*?=(.*?){{/im, false );
+ type = !def.obj ? '' : def.obj[1].type,
+ classSpecs = def.specs(reSpecs) || [['','','','','']],
+ isCreature = type.toLowerCase().includes('creature') || (classSpecs && classSpecs[0] && classSpecs[0][4] && String(classSpecs[0][4]).toLowerCase().includes('creature'));
+ [parsedData,parsedAttr,classData] = LibFunctions.resolveData( ClassName, rootDB, /}}\s*?(?:Class|Race)Data\s*?=(.*?){{/im, [], false );
+
if (isClass) {
- let classSpecs = def.specs(reSpecs),
- classType;
+ let classType;
if (classSpecs && !_.isNull(classSpecs)) {
if (classSpecs.some( s => {
if (s && s.length >= 5) {
classType = (s[1]||'').dbName();
- return (((s[4]||'').dbName() == 'wizard' ) && !ordMU.includes(classType));
+ return (((s[4]||'').dbName() == 'wizard' ) && !ordMU.includes(classType) && (parsedData.specmu == 1));
}
return false;
})) {
if (!specMU.includes(classType)) specMU.push(classType);
+ } else {
+ if (!ordMU.includes(classType)) ordMU.push(classType);
};
};
}
- if (classData && !type.toLowerCase().includes('creature')) {
+ if (classData) {
for (let r=0; r { // eslint-disable-line no-unused-vars
for (let i=1; i<=spellData[0]; ++i) {
let spells = [];
spells.length = spellData[1];
- spellsPerLevel[name][spellType][i] = (!!parsedData[('spellLV'+i)] && !!parsedData[('spellLV'+i)].length) ? (spells.fill(0).concat(parsedData[('spellLV'+i)].split('|'))) : spellsPerLevel[(spellType === 'MU'?'WIZARD':'PRIEST')][spellType][i];
-// log('parseClassDB: spellData = '+spellData+', test = '+(!!parsedData[('spellLV'+i)] && !!parsedData[('spellLV'+i)].length)+', data = '+spellsPerLevel[name][spellType][i]);
+ spellsPerLevel[name][spellType][i] = (!!parsedRow[('spellLV'+i)] && !!parsedRow[('spellLV'+i)].length) ? (spells.fill(0).concat(parsedRow[('spellLV'+i)].split('|'))) : spellsPerLevel[(spellType === 'MU'?'WIZARD':'PRIEST')][spellType][i];
};
if (spellData[4] && spellData[4].toLowerCase() === 'spec' && !specMU.includes(name)) specMU.push(name);
if (spellData[4] && spellData[4].toLowerCase() === 'ord' && !ordMU.includes(name)) ordMU.push(name);
};
- if (parsedData.attkLevels || parsedData.attkMelee || parsedData.attkRanged) {
+ if (parsedRow.attkLevels || parsedRow.attkMelee || parsedRow.attkRanged) {
if (_.isUndefined(weapMultiAttks[name])) {
weapMultiAttks[name] = {};
weapMultiAttks[name].Levels = new Array(weapMultiAttks.fighter.Levels);
weapMultiAttks[name].Proficient = Object.create(weapMultiAttks.fighter.Proficient);
}
- if (parsedData.attkLevels) weapMultiAttks[name].Levels = parsedData.attkLevels.split('|');
- if (parsedData.attkMelee) weapMultiAttks[name].Proficient.melee = parsedData.attkMelee.split('|');
- if (parsedData.attkRanged) weapMultiAttks[name].Proficient.ranged = parsedData.attkRanged.split('|');
+ if (parsedRow.attkLevels) weapMultiAttks[name].Levels = parsedRow.attkLevels.split('|');
+ if (parsedRow.attkMelee) weapMultiAttks[name].Proficient.melee = parsedRow.attkMelee.split('|');
+ if (parsedRow.attkRanged) weapMultiAttks[name].Proficient.ranged = parsedRow.attkRanged.split('|');
};
- if (parsedData.nonProfPen) {
- classNonProfPenalty[name] = parsedData.nonProfPen;
+ if (!_.isUndefined(parsedRow.nonProfPen)) {
+ classNonProfPenalty[name] = parsedRow.nonProfPen;
};
- if (parsedData.toHitMods) {
- raceToHitMods[name] = _.map(parsedData.toHitMods.split('|'), pen => {
+ if (parsedRow.toHitMods) {
+ raceToHitMods[name] = _.map(parsedRow.toHitMods.split('|'), pen => {
pen = pen.toLowerCase().split('=');
pen[0] = pen[0].dbName();
pen[1] = parseInt(pen[1]) || 0;
@@ -8907,6 +9152,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
}
let rowArray = rowData.toLowerCase().replace(/\[/g,'').replace(/\]/g,'').split(','),
svlArray = rowArray.filter(elem => elem.startsWith('svl'));
+
if (svlArray && svlArray.length) {
svlArray.sort((a,b)=>{parseInt((a.match(/svl(\d+):/)||[0,0])[1])-parseInt((b.match(/svl(\d+):/)||[0,0])[1]);});
saveLevels[name] = [];
@@ -8929,22 +9175,23 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
oldLevel = level+1;
});
};
- svlArray = rowArray.filter(elem => {return /^sv[a-z]{3}:/.test(elem);});
+ svlArray = rowArray.filter(elem => {return /^\s*sv[a-z]{3}:/.test(elem);});
if (svlArray && svlArray.length) {
saveMods[name] = {att:'con',par:0.0,poi:0.0,dea:0.0,rod:0.0,sta:0.0,wan:0.0,pet:0.0,pol:0.0,bre:0.0,spe:0.0,str:0.0,con:0.0,dex:0.0,int:0.0,wis:0.0,chr:0.0};
svlArray.forEach(svm => {
- let sv = svm.match(/sv([a-z]{3}):([+-]?\d+\.?\d*|\w{3})/i);
+ let sv = svm.match(/sv([a-z]{3}):([+-]?\d+\.?\d*|\w{3})(L\d+)?/i);
if (sv[1] == 'all') {
saveMods[name] = _.mapObject(saveMods[name], (v,k) => {return k != 'att' ? v + (parseFloat(sv[2] || 0) || 0) : v;});
} else if (['sav','atr','chk'].includes(sv[1])) {
let saves = sv[1] === 'sav' ? saveFormat.Saves : (sv[1] === 'atr' ? saveFormat.Attributes : saveFormat.Checks);
_.each(saves, s => saveMods[name][s.tag] = saveMods[name][s.tag] + (parseFloat(sv[2] || 0) || 0));
} else {
- saveMods[name][sv[1]] = (sv[1] != 'att') ? (parseFloat(sv[2] || 0) || 0) : (sv[2] || 'con').dbName();
+ let plv = parseInt(sv[3]) || 1;
+ saveMods[name][sv[1]] = (sv[1] != 'att') ? (String(parseFloat(sv[2] || 0) || 0)+(sv[3] || '')) : (sv[2] || 'con').dbName();
}
});
};
- svlArray = rowArray.filter(elem => {return /^sv[a-z]{3}\+:/.test(elem);});
+ svlArray = rowArray.filter(elem => {return /^\s*sv[a-z]{3}\+:/.test(elem);});
if (svlArray && svlArray.length) {
classSaveMods[name] = {att:'con',par:0.0,poi:0.0,dea:0.0,rod:0.0,sta:0.0,wan:0.0,pet:0.0,pol:0.0,bre:0.0,spe:0.0,str:0.0,con:0.0,dex:0.0,int:0.0,wis:0.0,chr:0.0};
svlArray.forEach(svm => {
@@ -8961,11 +9208,27 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
};
};
};
+ if (isCreature) {
+ if (!clTypeLists[classSpecs[0][2].toLowerCase()]) clTypeLists[classSpecs[0][2].toLowerCase()] = {type:'creature',field:fields.RaceCreatureList,query:''};
+ if (parsedData.query && parsedData.query.length) {
+ let query = LibFunctions.parseStr(parsedData.query).split('|');
+ let question = query.shift();
+ clTypeLists[classSpecs[0][2].toLowerCase()].query = '?{'+question + '|'
+ + query.map( q => {
+ let sq = q.split('%');
+ return sq[0]+','+sq.join('%%');
+ }).join('|')
+ + '}';
+ };
+ };
};
return;
};
+ if (classesParsed && !forceUpdate) return;
doParse( fields.ClassDB, classSaveMods );
doParse( fields.RaceDB, raceSaveMods );
+ classesParsed = true;
+ LibFunctions.sendFeedback( waitMsgDiv+'RPGMaster is now ready.' );
return;
};
@@ -9074,6 +9337,11 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
classes.forEach( c => {
classMods = classSaveMods[c.name] || classSaveMods[c.base] || classSaveMods.undefined;
+ classMods = _.mapObject(classMods,v=>{
+ let plv = (v || '').match(/([-\+]?\d+)L(\d+)/i);
+ if (plv && plv[2] != 0) v = plv[1] * Math.ceil(c.level/plv[2]);
+ return parseInt(v);
+ });
if (!mods && !mods.length) {
mods = classMods;
} else {
@@ -9098,7 +9366,7 @@ const libRPGMaster = (() => { // eslint-disable-line no-unused-vars
if (itemObj.obj) {
let specsArray = itemObj.specs(/}}\s*specs=\s*?(.*?)\s*?{{/im);
let miClass = specsArray ? (specsArray[0][2].dbName() || 'magicitem') : 'magicitem',
- dataArray = itemObj.data(/}}\s*\w*?data\s*=.*?sv[a-z]{3}:.*?{{/g); // [...itemDef.matchAll(/}}\s*\w*?data\s*=.*?sv[a-z]{3}:.*?{{/g)];
+ dataArray = itemObj.data(/}}\s*\w*?data\s*=.*?sv[a-z]{3}:.*?{{/img); // [...itemDef.matchAll(/}}\s*\w*?data\s*=.*?sv[a-z]{3}:.*?{{/g)];
if (miClass.includes('ring') && miClass.includes('protection')) {
let leftRing = LibFunctions.attrLookup( charCS, fields.Equip_leftTrueRing ) || '-',
diff --git a/RPGMlibrary AD+D2e/script.json b/RPGMlibrary AD+D2e/script.json
index 3640a3e4f..9a7cd08a5 100644
--- a/RPGMlibrary AD+D2e/script.json
+++ b/RPGMlibrary AD+D2e/script.json
@@ -2,8 +2,8 @@
"$schema": "https://github.com/DameryDad/roll20-api-scripts/blob/RPGMlibrary/RPGMlibrary AD+D2e/Script.json",
"name": "RPGMaster library AD+D2e",
"script": "libRPGMaster2e.js",
- "version": "2.2.2",
- "previousversions": ["1.3.00","1.3.01","1.3.02","1.3.03","1.3.04","1.4.01","1.4.02","1.4.03","1.4.04","1.4.05","1.4.06","1.4.07","1.5.01","1.5.02","1.5.03","1.5.04","1.5.05","1.5.06","2.1.0","2.2.0","2.2.1"],
+ "version": "2.3.0",
+ "previousversions": ["1.3.00","1.3.01","1.3.02","1.3.03","1.3.04","1.4.01","1.4.02","1.4.03","1.4.04","1.4.05","1.4.06","1.4.07","1.5.01","1.5.02","1.5.03","1.5.04","1.5.05","1.5.06","2.1.0","2.2.0","2.2.1","2.2.2"],
"description": "RPGMaster Library for AD&D2e provides all of the game-version-specific data and rule processing for the RPGMaster series of APIs to work with the Advanced Dungeon & Dragons 2nd Edition rule set, and with the Advanced D&D2e Character Sheet by Peter B. Other versions of the library will support other gave versions in future. In order for versions of the RPGMaster series APIs later than 1.0.0 to work (i.e. those that have version numbers with three segments) they require one of the RPGMaster Libraries to be loaded with them: which one determines which rule set and character sheet they work with. The Library does not support any API commands itself (the other RPGMaster APIs provide those), but it supports a unique set of Roll Templates, and provides API Authors with a number of callable functions that might be of use. See the RPGMaster Library Help handout that the Library creates in your campaign when initially loaded for details.\n\n[RPGMaster Documentation](https://wiki.roll20.net/RPGMaster) \n### Getting Started\n1. When all APIs in the RPGMaster suite are loaded, run `!cmd --initialise` and add the player macros created to the Macro Bar, then\n2. Select tokens and use the `Token Setup` macro bar button just created to add all relevant Action Buttons to the token(s) (plus set the tokens/Characters up in any other way provided in the menu displayed) \n3. Once steps 1 & 2 have been done, the players and DM can then use the buttons displayed at the top of the screen when their character's token is selected to perform all actions needed in normal play.",
"authors": "Richard E.",
"roll20userid": "6497708",
|