diff --git a/firebase-rules.json b/firebase-rules.json index 04159cb11..c3e49ea41 100644 --- a/firebase-rules.json +++ b/firebase-rules.json @@ -1,1085 +1,1442 @@ { - "rules": { - "campaigns": { - "$uid": { - ".write": "$uid === auth.uid || root.child('users').child(auth.uid).child('admin').exists()", - ".indexOn": "private" - }, - ".read": true - }, - "search_campaigns": { - ".read": true, - "$uid": { - ".write": "$uid === auth.uid", - "results": { - ".indexOn": ["name"] - } - } - }, - "users": { - "$uid": { - "username": { - ".write": "$uid === auth.uid || root.child('users').child(auth.uid).child('admin').exists()" - }, - "email": { - ".write": "$uid === auth.uid || root.child('users').child(auth.uid).child('admin').exists()" - }, - "active_campaign": { - ".write": "$uid === auth.uid || root.child('users').child(auth.uid).child('admin').exists()" - }, - "admin": { - ".write": false - }, - "contribute": { - ".write": "root.child('users').child(auth.uid).child('admin').exists()" - }, - "follow": { - ".write": "$uid === auth.uid" - }, - "voucher": { - ".write": "root.child('users').child(auth.uid).child('admin').exists()" - }, - "patreon_email": { - ".write": "root.child('users').child(auth.uid).child('admin').exists()" - } - }, - ".read": true, - ".indexOn": ["username", "email", "admin", "contribute"] - }, - "search_users": { - ".read": true, - "$uid": { - ".write": "$uid === auth.uid" - }, - ".indexOn": ["username", "email"] - }, - "status": { - ".write": true, - ".read": true, - ".indexOn": "state" - }, - "posters": { - ".write": true, - ".read": true - }, - "patrons": { - ".write": true, - ".read": true, - ".indexOn": "email" - }, - "new_patrons": { - ".write": true, - ".read": true, - ".indexOn": "email" - }, - "patreon_data": { - ".write": true, - ".read": true, - ".indexOn": "timestamp" - }, - "tiers": { - ".write": true, - ".read": true - }, - "settings": { - "$uid": { - ".write": "$uid === auth.uid", - ".read": true - } - }, - "players": { - "$uid": { - "$playerid": { - ".write": "$uid === auth.uid || root.child('character_control').child(auth.uid).child($playerid).child('user').val() === $uid", - ".validate": "newData.hasChildren(['player_name', 'character_name', 'maxHp', 'ac'])", - "sync_character": { - ".validate": "newData.isString() && newData.val().length <= 2000" - }, - "control": { - ".validate": "newData.isString() && newData.val().length <= 100" - }, - "campaign_id": { - ".validate": "newData.isString() && newData.val().length <= 100" - }, - "player_name": { - ".validate": "newData.isString() && newData.val().length <= 100" - }, - "character_name": { - ".validate": "newData.isString() && newData.val().length <= 100" - }, - "avatar": { - ".validate": "newData.isString() && newData.val().length <= 2000" - }, - "storage_avatar": { - ".validate": "newData.isString() && newData.val().length <= 2000" - }, - "experience": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 355000" - }, - "level": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" - }, - "maxHp": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 999" - }, - "ac": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "spell_save_dc": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "speed": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "initiative": { - ".validate": "newData.isNumber() && newData.val() >= -10 && newData.val() <= 99" - }, - "strength": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "dexterity": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "constitution": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "intelligence": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "wisdom": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "charisma": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "passive_insight": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "passive_investigation": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "passive_perception": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "damage_vulnerabilities": { - "$vulnerabilityIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder)$/)" - } - }, - "damage_resistances": { - "$resistanceIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder)$/)" - } - }, - "damage_immunities": { - "$immunityIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder)$/)" - } - }, - "condition_immunities": { - "$conditionImmunityIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(blinded|charmed|deafened|exhaustion|frightened|grappled|incapacitated|invisible|paralyzed|petrified|poisoned|prone|restrained|stunned|unconscious)$/)" - } - }, - "skills": { - "$skillIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(acrobatics|animal Handling|arcana|athletics|deception|history|insight|intimidation|investigation|medicine|nature|perception|performance|persuasion|religion|sleight of Hand|stealth|survival)$/)" - } - }, - "skills_expertise": { - "$skillIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(acrobatics|animal Handling|arcana|athletics|deception|history|insight|intimidation|investigation|medicine|nature|perception|performance|persuasion|religion|sleight of Hand|stealth|survival)$/)" - } - }, - "companions": { - "$npcId": { - ".validate": "newData.isBoolean()" - } - }, - "$other": { ".validate": false } - }, - ".read": true - }, - ".read": "root.child('users').child(auth.uid).child('admin').exists()" - }, - "search_players": { - ".read": true, - "$uid": { - ".write": "$uid === auth.uid", - "results": { - "$playerid": { - ".write": "$uid === auth.uid || root.child('character_control').child(auth.uid).child($playerid).child('user').val() === $uid", - }, - ".indexOn": ["character_name"] - } - } - }, - "characters": { - "$uid": { - "$characterId": { - ".write": "$uid === auth.uid || root.child('character_control').child(auth.uid).child($characterId).child('user').val() === $uid" - }, - ".read": true - } - }, - "search_characters": { - ".read": true, - "$uid": { - ".write": "$uid === auth.uid", - "results": { - ".indexOn": ["character_name"] - } - } - }, - "character_control": { - "$uid": { - "$playerid": { - ".write": "data.exists() || newData.child('user').val() === auth.uid || data.child('user').val() === auth.uid" - }, - ".read": true - } - }, - "npcs": { - "$uid": { - "$npcId": { - ".write": "$uid === auth.uid || root.child('character_control').child(auth.uid).child( data.child('player_id').val() ).child('user').val() === $uid", - ".validate": "newData.hasChildren(['name', 'size', 'type', 'challenge_rating', 'armor_class', 'hit_points', 'strength', 'dexterity', 'constitution', 'intelligence', 'wisdom', 'charisma'])", - "harmless_key": { - ".validate": "newData.isString() && newData.val().length <= 100" - }, - "name": { - ".validate": "newData.isString() && newData.val().length <= 100" - }, - "source": { - ".validate": "newData.isString() && newData.val().length <= 20" - }, - "avatar": { - ".validate": "newData.isString() && newData.val().length <= 2000" - }, - "storage_avatar": { - ".validate": "newData.isString() && newData.val().length <= 2000" - }, - "size": { - ".validate": "newData.isString() && newData.val().matches(/^(Tiny|Small|Medium|Large|Huge|Gargantuan)$/)" - }, - "type": { - ".validate": "newData.isString() && newData.val().matches(/^(Aberration|Beast|Celestial|Construct|Dragon|Elemental|Fey|Fiend|Giant|Humanoid|Monstrosity|Ooze|Plant|Swarm of tiny beasts|Undead)$/)" - }, - "subtype": { - ".validate": "newData.isString() && newData.val().length <= 25" - }, - "alignment": { - ".validate": "newData.isString() && newData.val().matches(/^(Any|Any alignment|Unaligned|Lawful Good|Neutral Good|Chaotic Good|Lawful neutral|Neutral|Chaotic neutral|Lawful evil|Neutral evil|Chaotic evil)$/i)" - }, - "walk_speed": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "swim_speed": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "fly_speed": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "burrow_speed": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "climb_speed": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "languages": { - "$langugeIndex": { - ".validate": "newData.isString() && newData.val().length <= 100" - } - }, - "challenge_rating": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 30" - }, - "proficiency": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 10" - }, - "friendly": { - ".validate": "newData.isBoolean()" - }, - "player_id": { - ".validate": "newData.isString() && newData.val().length <= 50" - }, - "armor_class": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "hit_points": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 9999" - }, - "hit_dice": { - ".validate": "newData.isString() && newData.val().length <= 10 && (newData.val().length === 0 ||newData.val().matches(/^[0-9]+d[0-9]+$/))" - }, + "rules": { + "campaigns": { + "$uid": { + ".write": "$uid === auth.uid || root.child('users').child(auth.uid).child('admin').exists()", + ".indexOn": "private" + }, + ".read": true + }, + "search_campaigns": { + ".read": true, + "$uid": { + ".write": "$uid === auth.uid", + "results": { + ".indexOn": ["name"] + } + } + }, + "users": { + "$uid": { + "username": { + ".write": "$uid === auth.uid || root.child('users').child(auth.uid).child('admin').exists()" + }, + "email": { + ".write": "$uid === auth.uid || root.child('users').child(auth.uid).child('admin').exists()" + }, + "active_campaign": { + ".write": "$uid === auth.uid || root.child('users').child(auth.uid).child('admin').exists()" + }, + "admin": { + ".write": false + }, + "contribute": { + ".write": "root.child('users').child(auth.uid).child('admin').exists()" + }, + "follow": { + ".write": "$uid === auth.uid" + }, + "voucher": { + ".write": "$uid === auth.uid || root.child('users').child(auth.uid).child('admin').exists()" + }, + "patreon_email": { + ".write": "root.child('users').child(auth.uid).child('admin').exists()" + } + }, + ".read": true, + ".indexOn": ["username", "email", "admin", "contribute"] + }, + "search_users": { + ".read": true, + "$uid": { + ".write": "$uid === auth.uid" + }, + ".indexOn": ["username", "email"] + }, + "status": { + ".write": true, + ".read": true, + ".indexOn": "state" + }, + "posters": { + ".write": true, + ".read": true + }, + "patrons": { + ".write": true, + ".read": true, + ".indexOn": "email" + }, + "new_patrons": { + ".write": true, + ".read": true, + ".indexOn": "email" + }, + "patreon_data": { + ".write": true, + ".read": true, + ".indexOn": "timestamp" + }, + "tiers": { + ".write": true, + ".read": true + }, + "settings": { + "$uid": { + ".write": "$uid === auth.uid", + ".read": true + } + }, + "players": { + "$uid": { + "$playerid": { + ".write": "$uid === auth.uid || root.child('character_control').child(auth.uid).child($playerid).child('user').val() === $uid", + ".validate": "newData.hasChildren(['player_name', 'character_name', 'maxHp', 'ac'])", + "sync_character": { + ".validate": "newData.isString() && newData.val().length <= 2000" + }, + "created": { + ".validate": "newData.isNumber()" + }, + "updated": { + ".validate": "newData.isNumber()" + }, + "control": { + ".validate": "newData.isString() && newData.val().length <= 100" + }, + "campaign_id": { + ".validate": "newData.isString() && newData.val().length <= 100" + }, + "player_name": { + ".validate": "newData.isString() && newData.val().length <= 100" + }, + "character_name": { + ".validate": "newData.isString() && newData.val().length <= 100" + }, + "avatar": { + ".validate": "newData.isString() && newData.val().length <= 2000" + }, + "storage_avatar": { + ".validate": "newData.isString() && newData.val().length <= 2000" + }, + "experience": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 355000" + }, + "level": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "maxHp": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 999" + }, + "ac": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "spell_save_dc": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "speed": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "initiative": { + ".validate": "newData.isNumber() && newData.val() >= -10 && newData.val() <= 99" + }, + "strength": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "dexterity": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "constitution": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "intelligence": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "wisdom": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "charisma": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "strength-save-profficient": { + ".validate": "newData.isBoolean()" + }, + "dexterity-save-profficient": { + ".validate": "newData.isBoolean()" + }, + "constitution-save-profficient": { + ".validate": "newData.isBoolean()" + }, + "intelligence-save-profficient": { + ".validate": "newData.isBoolean()" + }, + "wisdom-save-profficient": { + ".validate": "newData.isBoolean()" + }, + "charisma-save-profficient": { + ".validate": "newData.isBoolean()" + }, + "passive_insight": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "passive_investigation": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "passive_perception": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "damage_vulnerabilities": { + "$vulnerabilityIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + } + }, + "damage_resistances": { + "$resistanceIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + } + }, + "damage_immunities": { + "$immunityIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + } + }, + "condition_immunities": { + "$conditionImmunityIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(blinded|charmed|deafened|exhaustion|frightened|grappled|incapacitated|invisible|paralyzed|petrified|poisoned|prone|restrained|stunned|unconscious)$/)" + } + }, + "skills": { + "$skillIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(acrobatics|animal Handling|arcana|athletics|deception|history|insight|intimidation|investigation|medicine|nature|perception|performance|persuasion|religion|sleight of Hand|stealth|survival)$/)" + } + }, + "skills_expertise": { + "$skillIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(acrobatics|animal Handling|arcana|athletics|deception|history|insight|intimidation|investigation|medicine|nature|perception|performance|persuasion|religion|sleight of Hand|stealth|survival)$/)" + } + }, + "companions": { + "$npcId": { + ".validate": "newData.isBoolean()" + } + }, + "$other": { ".validate": false } + }, + ".read": true + }, + ".read": "root.child('users').child(auth.uid).child('admin').exists()" + }, + "search_players": { + ".read": true, + "$uid": { + ".write": "$uid === auth.uid", + "results": { + "$playerid": { + ".write": "$uid === auth.uid || root.child('character_control').child(auth.uid).child($playerid).child('user').val() === $uid" + }, + ".indexOn": ["character_name"] + } + } + }, + "characters": { + "$uid": { + "$characterId": { + ".write": "$uid === auth.uid || root.child('character_control').child(auth.uid).child($characterId).child('user').val() === $uid" + }, + ".read": true + } + }, + "search_characters": { + ".read": true, + "$uid": { + ".write": "$uid === auth.uid", + "results": { + ".indexOn": ["character_name"] + } + } + }, + "character_control": { + "$uid": { + "$playerid": { + ".write": "data.exists() || newData.child('user').val() === auth.uid || data.child('user').val() === auth.uid" + }, + ".read": true + } + }, + "npcs": { + "$uid": { + "$npcId": { + ".write": "$uid === auth.uid || root.child('character_control').child(auth.uid).child( data.child('player_id').val() ).child('user').val() === $uid", + ".validate": "newData.hasChildren(['name', 'size', 'type', 'challenge_rating', 'armor_class', 'hit_points', 'strength', 'dexterity', 'constitution', 'intelligence', 'wisdom', 'charisma'])", + "created": { + ".validate": "newData.isNumber()" + }, + "updated": { + ".validate": "newData.isNumber()" + }, + "harmless_key": { + ".validate": "newData.isString() && newData.val().length <= 100" + }, + "name": { + ".validate": "newData.isString() && newData.val().length <= 100" + }, + "source": { + ".validate": "newData.isString() && newData.val().length <= 20" + }, + "avatar": { + ".validate": "newData.isString() && newData.val().length <= 2000" + }, + "storage_avatar": { + ".validate": "newData.isString() && newData.val().length <= 2000" + }, + "size": { + ".validate": "newData.isString() && newData.val().matches(/^(Tiny|Small|Medium|Large|Huge|Gargantuan)$/)" + }, + "type": { + ".validate": "newData.isString() && newData.val().matches(/^(Aberration|Beast|Celestial|Construct|Dragon|Elemental|Fey|Fiend|Giant|Humanoid|Monstrosity|Ooze|Plant|Swarm of tiny beasts|Undead)$/)" + }, + "subtype": { + ".validate": "newData.isString() && newData.val().length <= 25" + }, + "alignment": { + ".validate": "newData.isString() && newData.val().matches(/^(Any|Any alignment|Unaligned|Lawful Good|Neutral Good|Chaotic Good|Lawful neutral|Neutral|Chaotic neutral|Lawful evil|Neutral evil|Chaotic evil)$/i)" + }, + "walk_speed": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "swim_speed": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "fly_speed": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "burrow_speed": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "climb_speed": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "languages": { + "$langugeIndex": { + ".validate": "newData.isString() && newData.val().length <= 100" + } + }, + "challenge_rating": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 30" + }, + "proficiency": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 10" + }, + "friendly": { + ".validate": "newData.isBoolean()" + }, + "player_id": { + ".validate": "newData.isString() && newData.val().length <= 50" + }, + "armor_class": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "hit_points": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 9999" + }, + "hit_dice": { + ".validate": "newData.isString() && newData.val().length <= 10 && (newData.val().length === 0 ||newData.val().matches(/^[0-9]+d[0-9]+$/))" + }, - "senses": { - "blindsight": { - "blindsight": { - ".validate": "newData.isBoolean()" - }, - "range": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "comments": { - ".validate": "newData.isString() && newData.val().length <= 999" - }, - "$other": { ".validate": false } - }, - "darkvision": { - "darkvision": { - ".validate": "newData.isBoolean()" - }, - "range": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "comments": { - ".validate": "newData.isString() && newData.val().length <= 999" - }, - "$other": { ".validate": false } - }, - "tremorsense": { - "tremorsense": { - ".validate": "newData.isBoolean()" - }, - "range": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "comments": { - ".validate": "newData.isString() && newData.val().length <= 999" - }, - "$other": { ".validate": false } - }, - "truesight": { - "truesight": { - ".validate": "newData.isBoolean()" - }, - "range": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "comments": { - ".validate": "newData.isString() && newData.val().length <= 999" - }, - "$other": { ".validate": false } - } - }, + "senses": { + "blindsight": { + "blindsight": { + ".validate": "newData.isBoolean()" + }, + "range": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "comments": { + ".validate": "newData.isString() && newData.val().length <= 999" + }, + "$other": { ".validate": false } + }, + "darkvision": { + "darkvision": { + ".validate": "newData.isBoolean()" + }, + "range": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "comments": { + ".validate": "newData.isString() && newData.val().length <= 999" + }, + "$other": { ".validate": false } + }, + "tremorsense": { + "tremorsense": { + ".validate": "newData.isBoolean()" + }, + "range": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "comments": { + ".validate": "newData.isString() && newData.val().length <= 999" + }, + "$other": { ".validate": false } + }, + "truesight": { + "truesight": { + ".validate": "newData.isBoolean()" + }, + "range": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "comments": { + ".validate": "newData.isString() && newData.val().length <= 999" + }, + "$other": { ".validate": false } + } + }, - "strength": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 99" - }, - "dexterity": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 99" - }, - "constitution": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 99" - }, - "intelligence": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 99" - }, - "wisdom": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 99" - }, - "charisma": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 99" - }, + "strength": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 99" + }, + "dexterity": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 99" + }, + "constitution": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 99" + }, + "intelligence": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 99" + }, + "wisdom": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 99" + }, + "charisma": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 99" + }, - "saving_throws": { - "$savingIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" - } - }, + "saving_throws": { + "$savingIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" + } + }, - "skills": { - "$skillIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(acrobatics|animal Handling|arcana|athletics|deception|history|insight|intimidation|investigation|medicine|nature|perception|performance|persuasion|religion|sleight of Hand|stealth|survival)$/)" - } - }, - "skills_expertise": { - "$skillIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(acrobatics|animal Handling|arcana|athletics|deception|history|insight|intimidation|investigation|medicine|nature|perception|performance|persuasion|religion|sleight of Hand|stealth|survival)$/)" - } - }, - "skill_modifiers": { - "acrobatics": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "animal Handling": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "arcana": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "athletics": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "deception": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "history": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "insight": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "intimidation": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "investigation": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "medicine": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "nature": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "perception": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "performance": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "persuasion": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "religion": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "sleight of Hand": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "stealth": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "survival": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "$other": { - ".validate": false - } - }, + "skills": { + "$skillIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(acrobatics|animal Handling|arcana|athletics|deception|history|insight|intimidation|investigation|medicine|nature|perception|performance|persuasion|religion|sleight of Hand|stealth|survival)$/)" + } + }, + "skills_expertise": { + "$skillIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(acrobatics|animal Handling|arcana|athletics|deception|history|insight|intimidation|investigation|medicine|nature|perception|performance|persuasion|religion|sleight of Hand|stealth|survival)$/)" + } + }, + "skill_modifiers": { + "acrobatics": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "animal Handling": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "arcana": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "athletics": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "deception": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "history": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "insight": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "intimidation": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "investigation": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "medicine": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "nature": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "perception": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "performance": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "persuasion": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "religion": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "sleight of Hand": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "stealth": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "survival": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "$other": { + ".validate": false + } + }, - "damage_vulnerabilities": { - "$vulnerabilityIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder)$/)" - } - }, - "damage_resistances": { - "$resistanceIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder)$/)" - } - }, - "damage_immunities": { - "$immunityIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder)$/)" - } - }, - "condition_immunities": { - "$conditionImmunityIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(blinded|charmed|deafened|exhaustion|frightened|grappled|incapacitated|invisible|paralyzed|petrified|poisoned|prone|restrained|stunned|unconscious)$/)" - } - }, + "damage_vulnerabilities": { + "$vulnerabilityIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + } + }, + "damage_resistances": { + "$resistanceIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + } + }, + "damage_immunities": { + "$immunityIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + } + }, + "condition_immunities": { + "$conditionImmunityIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(blinded|charmed|deafened|exhaustion|frightened|grappled|incapacitated|invisible|paralyzed|petrified|poisoned|prone|restrained|stunned|unconscious)$/)" + } + }, - "caster_ability": { - ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" - }, - "caster_level": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" - }, - "caster_save_dc": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "caster_spell_attack": { - ".validate": "newData.isNumber() && newData.val() >= -10 && newData.val() <= 99" - }, - "caster_spell_slots": { - "$slotIndex": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 9" - } - }, - "caster_spells": { - "$spellId": { - "level": { - ".validate": "newData.isNumber() && newData.val() >= -1 && newData.val() <= 9" - }, - "name": { - ".validate": "newData.isString() && newData.val().length <= 50" - }, - "key": { - ".validate": "newData.isString() && newData.val().length <= 50" - }, - "$other": { ".validate": false } - } - }, + "caster_ability": { + ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" + }, + "caster_level": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "caster_save_dc": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "caster_spell_attack": { + ".validate": "newData.isNumber() && newData.val() >= -10 && newData.val() <= 99" + }, + "caster_spell_slots": { + "$slotIndex": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 9" + } + }, + "caster_spells": { + "$spellId": { + "level": { + ".validate": "newData.isNumber() && newData.val() >= -1 && newData.val() <= 9" + }, + "name": { + ".validate": "newData.isString() && newData.val().length <= 50" + }, + "key": { + ".validate": "newData.isString() && newData.val().length <= 50" + }, + "$other": { ".validate": false } + } + }, - "innate_ability": { - ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" - }, - "innate_save_dc": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "innate_spell_attack": { - ".validate": "newData.isNumber() && newData.val() >= -10 && newData.val() <= 99" - }, - "innate_spells": { - "$spellId": { - "limit": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 10" - }, - "name": { - ".validate": "newData.isString() && newData.val().length <= 50" - }, - "$other": { ".validate": false } - } - }, + "innate_ability": { + ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" + }, + "innate_save_dc": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "innate_spell_attack": { + ".validate": "newData.isNumber() && newData.val() >= -10 && newData.val() <= 99" + }, + "innate_spells": { + "$spellId": { + "limit": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 10" + }, + "name": { + ".validate": "newData.isString() && newData.val().length <= 50" + }, + "$other": { ".validate": false } + } + }, - "special_abilities": { - "$abilityIndex": { - ".validate": "newData.hasChildren(['name'])", - "name": { - ".validate": "newData.isString() && newData.val().length <= 50" - }, - "recharge": { - ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(-[0-9]+)*$/) || newData.val().matches(/^(rest)$/))" - }, - "limit": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 9" - }, - "limit_type": { - ".validate": "newData.isString() && newData.val().matches(/^(day|turn)$/)" - }, - "desc": { - ".validate": "newData.isString() && newData.val().length <= 2000" - }, - "reach": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "range": { - ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(\\/[0-9]+)*$/))" - }, - "aoe_type": { - ".validate": "newData.isString() && newData.val().matches(/^(cone|cube|cylinder|line|sphere|square|square feet)$/)" - }, - "aoe_size": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "versatile": { - ".validate": "newData.isBoolean()" - }, - "versatile_one": { - ".validate": "newData.isString() && newData.val().length <= 25" - }, - "versatile_two": { - ".validate": "newData.isString() && newData.val().length <= 25" - }, - "action_list": { - "$listIndex": { - "type": { - ".validate": "newData.isString() && newData.val().matches(/^(melee_weapon|ranged_weapon|spell_attack|save|damage|healing|other)$/)" - }, - "attack_bonus": { - ".validate": "newData.isNumber() && newData.val() >= -10 && newData.val() <= 99" - }, - "save_ability": { - ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" - }, - "save_dc": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "rolls": { - "$rollIndex": { - "damage_type": { - ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder)$/)" - }, - "dice_count": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "dice_type": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" - }, - "fixed_val": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "versatile_damage_type": { - ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder)$/)" - }, - "versatile_dice_count": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "versatile_dice_type": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" - }, - "versatile_fixed_val": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "projectile_count": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "miss_mod": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" - }, - "save_fail_mod": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" - }, - "special": { - "$specialIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(siphon_full|siphon_half|drain)$/)" - } - }, - "$other": { ".validate": false } - } - }, - "$other": { ".validate": false } - } - }, - "$other": { ".validate": false } - } - }, + "special_abilities": { + "$abilityIndex": { + ".validate": "newData.hasChildren(['name'])", + "name": { + ".validate": "newData.isString() && newData.val().length <= 50" + }, + "recharge": { + ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(-[0-9]+)*$/) || newData.val().matches(/^(rest)$/))" + }, + "limit": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 9" + }, + "limit_type": { + ".validate": "newData.isString() && newData.val().matches(/^(day|turn)$/)" + }, + "desc": { + ".validate": "newData.isString() && newData.val().length <= 2000" + }, + "reach": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "range": { + ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(\\/[0-9]+)*$/))" + }, + "aoe_type": { + ".validate": "newData.isString() && newData.val().matches(/^(cone|cube|cylinder|line|sphere|square|square feet)$/)" + }, + "aoe_size": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "versatile": { + ".validate": "newData.isBoolean()" + }, + "versatile_one": { + ".validate": "newData.isString() && newData.val().length <= 25" + }, + "versatile_two": { + ".validate": "newData.isString() && newData.val().length <= 25" + }, + "options": { + "$optionIndex": { + ".validate": "newData.isString() && newData.val().length <= 30" + } + }, + "action_list": { + "$listIndex": { + "type": { + ".validate": "newData.isString() && newData.val().matches(/^(melee_weapon|ranged_weapon|spell_attack|save|damage|healing|other)$/)" + }, + "attack_bonus": { + ".validate": "newData.isNumber() && newData.val() >= -10 && newData.val() <= 99" + }, + "save_ability": { + ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" + }, + "save_dc": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "rolls": { + "$rollIndex": { + "damage_type": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + }, + "magical": { + ".validate": "newData.isBoolean()" + }, + "dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "dice_type": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "versatile_damage_type": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + }, + "versatile_magical": { + ".validate": "newData.isBoolean()" + }, + "versatile_dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "versatile_dice_type": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "versatile_fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "options": { + "$optionKey": { + "damage_type": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + }, + "magical": { + ".validate": "newData.isBoolean()" + }, + "dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "dice_type": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "ignore": { + ".validate": "newData.isBoolean()" + } + } + }, + "projectile_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "miss_mod": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" + }, + "save_fail_mod": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" + }, + "special": { + "$specialIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(siphon_full|siphon_half|drain)$/)" + } + }, + "$other": { ".validate": false } + } + }, + "$other": { ".validate": false } + } + }, + "$other": { ".validate": false } + } + }, - "actions": { - "$actionIndex": { - ".validate": "newData.hasChildren(['name'])", - "name": { - ".validate": "newData.isString() && newData.val().length <= 50" - }, - "recharge": { - ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(-[0-9]+)*$/) || newData.val().matches(/^(rest)$/))" - }, - "limit": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 9" - }, - "limit_type": { - ".validate": "newData.isString() && newData.val().matches(/^(day|turn)$/)" - }, - "desc": { - ".validate": "newData.isString() && newData.val().length <= 2000" - }, - "reach": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "range": { - ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(\\/[0-9]+)*$/))" - }, - "aoe_type": { - ".validate": "newData.isString() && newData.val().matches(/^(cone|cube|cylinder|line|sphere|square|square feet)$/)" - }, - "aoe_size": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "versatile": { - ".validate": "newData.isBoolean()" - }, - "versatile_one": { - ".validate": "newData.isString() && newData.val().length <= 25" - }, - "versatile_two": { - ".validate": "newData.isString() && newData.val().length <= 25" - }, - "action_list": { - "$listIndex": { - "type": { - ".validate": "newData.isString() && newData.val().matches(/^(melee_weapon|ranged_weapon|spell_attack|save|damage|healing|other)$/)" - }, - "attack_bonus": { - ".validate": "newData.isNumber() && newData.val() >= -10 && newData.val() <= 99" - }, - "save_ability": { - ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" - }, - "save_dc": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "rolls": { - "$rollIndex": { - "damage_type": { - ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder)$/)" - }, - "dice_count": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "dice_type": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" - }, - "fixed_val": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "versatile_damage_type": { - ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder)$/)" - }, - "versatile_dice_count": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "versatile_dice_type": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" - }, - "versatile_fixed_val": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "projectile_count": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "miss_mod": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" - }, - "save_fail_mod": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" - }, - "special": { - "$specialIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(siphon_full|siphon_half|drain)$/)" - } - }, - "$other": { ".validate": false } - } - }, - "$other": { ".validate": false } - } - }, - "$other": { ".validate": false } - } - }, + "actions": { + "$actionIndex": { + ".validate": "newData.hasChildren(['name'])", + "name": { + ".validate": "newData.isString() && newData.val().length <= 50" + }, + "recharge": { + ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(-[0-9]+)*$/) || newData.val().matches(/^(rest)$/))" + }, + "limit": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 9" + }, + "limit_type": { + ".validate": "newData.isString() && newData.val().matches(/^(day|turn)$/)" + }, + "desc": { + ".validate": "newData.isString() && newData.val().length <= 2000" + }, + "reach": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "range": { + ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(\\/[0-9]+)*$/))" + }, + "aoe_type": { + ".validate": "newData.isString() && newData.val().matches(/^(cone|cube|cylinder|line|sphere|square|square feet)$/)" + }, + "aoe_size": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "versatile": { + ".validate": "newData.isBoolean()" + }, + "versatile_one": { + ".validate": "newData.isString() && newData.val().length <= 25" + }, + "versatile_two": { + ".validate": "newData.isString() && newData.val().length <= 25" + }, + "options": { + "$optionIndex": { + ".validate": "newData.isString() && newData.val().length <= 30" + } + }, + "action_list": { + "$listIndex": { + "type": { + ".validate": "newData.isString() && newData.val().matches(/^(melee_weapon|ranged_weapon|spell_attack|save|damage|healing|other)$/)" + }, + "attack_bonus": { + ".validate": "newData.isNumber() && newData.val() >= -10 && newData.val() <= 99" + }, + "save_ability": { + ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" + }, + "save_dc": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "rolls": { + "$rollIndex": { + "damage_type": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + }, + "magical": { + ".validate": "newData.isBoolean()" + }, + "dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "dice_type": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "versatile_damage_type": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + }, + "versatile_magical": { + ".validate": "newData.isBoolean()" + }, + "versatile_dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "versatile_dice_type": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "versatile_fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "options": { + "$optionKey": { + "damage_type": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + }, + "magical": { + ".validate": "newData.isBoolean()" + }, + "dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "dice_type": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "ignore": { + ".validate": "newData.isBoolean()" + } + } + }, + "projectile_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "miss_mod": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" + }, + "save_fail_mod": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" + }, + "special": { + "$specialIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(siphon_full|siphon_half|drain)$/)" + } + }, + "$other": { ".validate": false } + } + }, + "$other": { ".validate": false } + } + }, + "$other": { ".validate": false } + } + }, - "legendary_count": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 9" - }, - "legendary_actions": { - "$legendaryIndex": { - ".validate": "newData.hasChildren(['name', 'legendary_cost'])", - "legendary_cost": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 9" - }, - "name": { - ".validate": "newData.isString() && newData.val().length <= 50" - }, - "recharge": { - ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(-[0-9]+)*$/) || newData.val().matches(/^(rest)$/))" - }, - "limit": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 9" - }, - "limit_type": { - ".validate": "newData.isString() && newData.val().matches(/^(day|turn)$/)" - }, - "desc": { - ".validate": "newData.isString() && newData.val().length <= 2000" - }, - "reach": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "range": { - ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(\\/[0-9]+)*$/))" - }, - "aoe_type": { - ".validate": "newData.isString() && newData.val().matches(/^(cone|cube|cylinder|line|sphere|square|square feet)$/)" - }, - "aoe_size": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "versatile": { - ".validate": "newData.isBoolean()" - }, - "versatile_one": { - ".validate": "newData.isString() && newData.val().length <= 25" - }, - "versatile_two": { - ".validate": "newData.isString() && newData.val().length <= 25" - }, - "action_list": { - "$listIndex": { - "type": { - ".validate": "newData.isString() && newData.val().matches(/^(melee_weapon|ranged_weapon|spell_attack|save|damage|healing|other)$/)" - }, - "attack_bonus": { - ".validate": "newData.isNumber() && newData.val() >= -10 && newData.val() <= 99" - }, - "save_ability": { - ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" - }, - "save_dc": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "rolls": { - "$rollIndex": { - "damage_type": { - ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder)$/)" - }, - "dice_count": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "dice_type": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" - }, - "fixed_val": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "versatile_damage_type": { - ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder)$/)" - }, - "versatile_dice_count": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "versatile_dice_type": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" - }, - "versatile_fixed_val": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "projectile_count": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "miss_mod": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" - }, - "save_fail_mod": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" - }, - "special": { - "$specialIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(siphon_full|siphon_half|drain)$/)" - } - }, - "$other": { ".validate": false } - } - }, - "$other": { ".validate": false } - } - }, - "$other": { ".validate": false } - } - }, + "legendary_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 9" + }, + "legendary_actions": { + "$legendaryIndex": { + ".validate": "newData.hasChildren(['name', 'legendary_cost'])", + "legendary_cost": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 9" + }, + "name": { + ".validate": "newData.isString() && newData.val().length <= 50" + }, + "recharge": { + ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(-[0-9]+)*$/) || newData.val().matches(/^(rest)$/))" + }, + "limit": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 9" + }, + "limit_type": { + ".validate": "newData.isString() && newData.val().matches(/^(day|turn)$/)" + }, + "desc": { + ".validate": "newData.isString() && newData.val().length <= 2000" + }, + "reach": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "range": { + ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(\\/[0-9]+)*$/))" + }, + "aoe_type": { + ".validate": "newData.isString() && newData.val().matches(/^(cone|cube|cylinder|line|sphere|square|square feet)$/)" + }, + "aoe_size": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "versatile": { + ".validate": "newData.isBoolean()" + }, + "versatile_one": { + ".validate": "newData.isString() && newData.val().length <= 25" + }, + "versatile_two": { + ".validate": "newData.isString() && newData.val().length <= 25" + }, + "options": { + "$optionIndex": { + ".validate": "newData.isString() && newData.val().length <= 30" + } + }, + "action_list": { + "$listIndex": { + "type": { + ".validate": "newData.isString() && newData.val().matches(/^(melee_weapon|ranged_weapon|spell_attack|save|damage|healing|other)$/)" + }, + "attack_bonus": { + ".validate": "newData.isNumber() && newData.val() >= -10 && newData.val() <= 99" + }, + "save_ability": { + ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" + }, + "save_dc": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "rolls": { + "$rollIndex": { + "damage_type": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + }, + "magical": { + ".validate": "newData.isBoolean()" + }, + "dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "dice_type": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "versatile_damage_type": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + }, + "versatile_magical": { + ".validate": "newData.isBoolean()" + }, + "versatile_dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "versatile_dice_type": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "versatile_fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "options": { + "$optionKey": { + "damage_type": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + }, + "magical": { + ".validate": "newData.isBoolean()" + }, + "dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "dice_type": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "ignore": { + ".validate": "newData.isBoolean()" + } + } + }, + "projectile_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "miss_mod": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" + }, + "save_fail_mod": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" + }, + "special": { + "$specialIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(siphon_full|siphon_half|drain)$/)" + } + }, + "$other": { ".validate": false } + } + }, + "$other": { ".validate": false } + } + }, + "$other": { ".validate": false } + } + }, - "reactions": { - "$reactionIndex": { - ".validate": "newData.hasChildren(['name'])", - "name": { - ".validate": "newData.isString() && newData.val().length <= 50" - }, - "recharge": { - ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(-[0-9]+)*$/) || newData.val().matches(/^(rest)$/))" - }, - "limit": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 9" - }, - "limit_type": { - ".validate": "newData.isString() && newData.val().matches(/^(day|turn)$/)" - }, - "desc": { - ".validate": "newData.isString() && newData.val().length <= 2000" - }, - "reach": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "range": { - ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(\\/[0-9]+)*$/))" - }, - "aoe_type": { - ".validate": "newData.isString() && newData.val().matches(/^(cone|cube|cylinder|line|sphere|square|square feet)$/)" - }, - "aoe_size": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" - }, - "versatile": { - ".validate": "newData.isBoolean()" - }, - "versatile_one": { - ".validate": "newData.isString() && newData.val().length <= 25" - }, - "versatile_two": { - ".validate": "newData.isString() && newData.val().length <= 25" - }, - "action_list": { - "$listIndex": { - "type": { - ".validate": "newData.isString() && newData.val().matches(/^(melee_weapon|ranged_weapon|spell_attack|save|damage|healing|other)$/)" - }, - "attack_bonus": { - ".validate": "newData.isNumber() && newData.val() >= -10 && newData.val() <= 99" - }, - "save_ability": { - ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" - }, - "save_dc": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "rolls": { - "$rollIndex": { - "damage_type": { - ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder)$/)" - }, - "dice_count": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "dice_type": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" - }, - "fixed_val": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "versatile_damage_type": { - ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder)$/)" - }, - "versatile_dice_count": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "versatile_dice_type": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" - }, - "versatile_fixed_val": { - ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" - }, - "projectile_count": { - ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" - }, - "miss_mod": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" - }, - "save_fail_mod": { - ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" - }, - "special": { - "$specialIndex": { - ".validate": "newData.isString() && newData.val().matches(/^(siphon_full|siphon_half|drain)$/)" - } - }, - "$other": { ".validate": false } - } - }, - "$other": { ".validate": false } - } - }, - "$other": { ".validate": false } - } - }, - "$other": { ".validate": false } - }, - ".write": "root.child('users').child(auth.uid).child('admin').exists()", - ".read": true, - ".indexOn": ["name", "harmless_key"] - }, - ".read": "root.child('users').child(auth.uid).child('admin').exists()" - }, - "search_npcs": { - ".read": true, - "$uid": { - ".write": "$uid === auth.uid", - "results": { - ".indexOn": ["name", "challenge_rating", "type"] - } - } - }, - "custom_items": { - "$uid": { - ".write": "$uid === auth.uid", - ".read": true - }, - ".read": "root.child('users').child(auth.uid).child('admin').exists()" - }, - "search_custom_items": { - ".read": true, - "$uid": { - ".write": "$uid === auth.uid", - "results": { - ".indexOn": ["name"] - } - } - }, - "encounters": { - "$uid": { - ".write": "$uid === auth.uid || root.child('users').child(auth.uid).child('admin').exists()", - ".read": true, - - // Allow all to write to requests - "$campaignId": { - ".indexOn": "entities/id", - "$encounterId": { - "requests": { - ".write": true - } - } - } - }, - ".read": "root.child('users').child(auth.uid).child('admin').exists()" - }, - "search_encounters": { - ".read": true, - "$uid": { - ".write": "$uid === auth.uid", - "results": { - "$campaignId": { - ".indexOn": ["name", "finished"] - } - } - } - }, + "reactions": { + "$reactionIndex": { + ".validate": "newData.hasChildren(['name'])", + "name": { + ".validate": "newData.isString() && newData.val().length <= 50" + }, + "recharge": { + ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(-[0-9]+)*$/) || newData.val().matches(/^(rest)$/))" + }, + "limit": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 9" + }, + "limit_type": { + ".validate": "newData.isString() && newData.val().matches(/^(day|turn)$/)" + }, + "desc": { + ".validate": "newData.isString() && newData.val().length <= 2000" + }, + "reach": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "range": { + ".validate": "newData.isString() && (newData.val().length === 0 || newData.val().matches(/^[0-9]+(\\/[0-9]+)*$/))" + }, + "aoe_type": { + ".validate": "newData.isString() && newData.val().matches(/^(cone|cube|cylinder|line|sphere|square|square feet)$/)" + }, + "aoe_size": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 999" + }, + "versatile": { + ".validate": "newData.isBoolean()" + }, + "versatile_one": { + ".validate": "newData.isString() && newData.val().length <= 25" + }, + "versatile_two": { + ".validate": "newData.isString() && newData.val().length <= 25" + }, + "options": { + "$optionIndex": { + ".validate": "newData.isString() && newData.val().length <= 30" + } + }, + "action_list": { + "$listIndex": { + "type": { + ".validate": "newData.isString() && newData.val().matches(/^(melee_weapon|ranged_weapon|spell_attack|save|damage|healing|other)$/)" + }, + "attack_bonus": { + ".validate": "newData.isNumber() && newData.val() >= -10 && newData.val() <= 99" + }, + "save_ability": { + ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" + }, + "save_dc": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "rolls": { + "$rollIndex": { + "damage_type": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + }, + "magical": { + ".validate": "newData.isBoolean()" + }, + "dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "dice_type": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "versatile_damage_type": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + }, + "versatile_magical": { + ".validate": "newData.isBoolean()" + }, + "versatile_dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "versatile_dice_type": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "versatile_fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "options": { + "$optionKey": { + "damage_type": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + }, + "magical": { + ".validate": "newData.isBoolean()" + }, + "dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "dice_type": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "ignore": { + ".validate": "newData.isBoolean()" + } + } + }, + "projectile_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "miss_mod": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" + }, + "save_fail_mod": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" + }, + "special": { + "$specialIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(siphon_full|siphon_half|drain)$/)" + } + }, + "$other": { ".validate": false } + } + }, + "$other": { ".validate": false } + } + }, + "$other": { ".validate": false } + } + }, + "$other": { ".validate": false } + }, + ".write": "root.child('users').child(auth.uid).child('admin').exists()", + ".read": true, + ".indexOn": ["name", "harmless_key"] + }, + ".read": "root.child('users').child(auth.uid).child('admin').exists()" + }, + "search_npcs": { + ".read": true, + "$uid": { + ".write": "$uid === auth.uid", + "results": { + ".indexOn": ["name", "challenge_rating", "type"] + } + } + }, + "custom_items": { + "$uid": { + ".write": "$uid === auth.uid", + ".read": true + }, + ".read": "root.child('users').child(auth.uid).child('admin').exists()" + }, + "search_custom_items": { + ".read": true, + "$uid": { + ".write": "$uid === auth.uid", + "results": { + ".indexOn": ["name"] + } + } + }, + "encounters": { + "$uid": { + ".write": "$uid === auth.uid || root.child('users').child(auth.uid).child('admin').exists()", + ".read": true, + + "$campaignId": { + ".indexOn": "entities/id", + "$encounterId": { + "requests": { + ".write": true + } + } + } + }, + ".read": "root.child('users').child(auth.uid).child('admin').exists()" + }, + "search_encounters": { + ".read": true, + "$uid": { + ".write": "$uid === auth.uid", + "results": { + "$campaignId": { + ".indexOn": ["name", "finished"] + } + } + } + }, "meters": { - "$uid": { - ".write": "$uid === auth.uid", - ".read": true - } - }, - "track": { - "$uid": { - ".write": true - }, - ".read": true - }, - "broadcast": { - "$uid": { - ".write": "$uid === auth.uid" - }, - ".read": true - }, - "conditions": { - ".write": false, - ".read": true - }, - "items": { - ".write": false, - ".read": true - }, - "abilities": { - ".write": false, - ".read": true - }, - "monsters": { - ".write": "root.child('users').child(auth.uid).child('admin').exists() || root.child('users').child(auth.uid).child('contribute').exists()", - ".read": true, - ".indexOn": "metadata/tagged" - }, - "new_monsters": { - ".write": "root.child('users').child(auth.uid).child('admin').exists() || root.child('users').child(auth.uid).child('contribute').exists()", - ".read": true, - ".indexOn": ["metadata/tagged", "metadata/finished"] - }, - "spells": { - ".write": "root.child('users').child(auth.uid).child('admin').exists() || root.child('users').child(auth.uid).child('contribute').exists()", - ".read": true, - ".indexOn": ["metadata/tagged", "name"] - }, - "new_spells": { - ".write": "root.child('users').child(auth.uid).child('admin').exists() || root.child('users').child(auth.uid).child('contribute').exists()", - ".read": true, - ".indexOn": ["metadata/tagged", "metadata/finished"] - }, - "challenge": { - ".write": false, - ".read": true - }, - "reminders": { - "$uid": { - ".write": "$uid === auth.uid", - ".read": true - }, - ".read": "root.child('users').child(auth.uid).child('admin').exists()" - }, - "search_reminders": { - ".read": true, - "$uid": { - ".write": "$uid === auth.uid", - "results": { - ".indexOn": ["name"] - } - } - } - } -} \ No newline at end of file + "$uid": { + ".write": "$uid === auth.uid", + ".read": true + } + }, + "track": { + "$uid": { + ".write": true + }, + ".read": true + }, + "broadcast": { + "$uid": { + ".write": "$uid === auth.uid" + }, + ".read": true + }, + "conditions": { + ".write": false, + ".read": true + }, + "items": { + ".write": false, + ".read": true + }, + "abilities": { + ".write": false, + ".read": true + }, + "spells": { + "$uid": { + "$spellId": { + ".validate": "newData.hasChildren(['name', 'level', 'school', 'cast_time', 'cast_time_type', 'range_type', 'duration_type', 'aoe_type', 'scaling'])", + "harmless_key": { + ".validate": "newData.isString() && newData.val().length <= 100" + }, + "created": { + ".validate": "newData.isNumber()" + }, + "updated": { + ".validate": "newData.isNumber()" + }, + "name": { + ".validate": "newData.isString() && newData.val().length <= 100" + }, + "source": { + ".validate": "newData.isString() && newData.val().length <= 30" + }, + "level": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 9" + }, + "school": { + ".validate": "newData.isString() && newData.val().matches(/^(abjuration|conjuration|divination|enchantment|evocation|illusion|necromancy|transmutation)$/i)" + }, + "cast_time": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 999" + }, + "cast_time_type": { + ".validate": "newData.isString() && newData.val().matches(/^(action|bonus_action|reaction|minute|hour|no_action|special)$/i)" + }, + "cast_time_react_desc": { + ".validate": "newData.isString() && newData.val().length <= 200" + }, + "components": { + "$componentIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(verbal|somatic|material)$/i)" + } + }, + "material_description": { + ".validate": "newData.isString() && newData.val().length <= 500" + }, + "range_type": { + ".validate": "newData.isString() && newData.val().matches(/^(self|touch|ranged|sight|unlimited|special)$/i)" + }, + "range": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 9999999" + }, + "classes": { + "$classIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(bard|barbarian|cleric|druid|fighter|monk|paladin|ranger|rogue|sorcerer|warlock|wizard)$/i)" + } + }, + "duration_type": { + ".validate": "newData.isString() && newData.val().matches(/^(concentration|instantaneous|special|time|until_dispelled|until_dispelled_or_triggered)$/i)" + }, + "duration": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 999" + }, + "duration_scale": { + ".validate": "newData.isString() && newData.val().matches(/^(round|minute|hour|day)$/i)" + }, + "aoe_type": { + ".validate": "newData.isString() && newData.val().matches(/^(none|cone|cube|cylinder|line|radius|sphere|square|square feet)$/i)" + }, + "aoe_size": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99999" + }, + "ritual": { + ".validate": "newData.isBoolean()" + }, + "scaling": { + ".validate": "newData.isString() && newData.val().matches(/^(none|character_level|spell_scale|spell_level)$/i)" + }, + "description": { + ".validate": "newData.isString() && newData.val().length <= 5000" + }, + "higher_level": { + ".validate": "newData.isString() && newData.val().length <= 1000" + }, + "projectiles": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "projectile_scaling": { + "$scalingIndex": { + ".validate": "newData.hasChildren(['level'])", + "level": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "projectile_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 25" + }, + "$other": { ".validate": false } + } + }, + "options": { + "$optionIndex": { + ".validate": "newData.isString() && newData.val().length <= 30" + } + }, + "actions": { + "$actionIndex": { + "name": { + ".validate": "newData.isString() && newData.val().length <= 100" + }, + "type": { + ".validate": "newData.isString() && newData.val().matches(/^(melee_weapon|ranged_weapon|spell_attack|save|damage|healing|other)$/)" + }, + "save_ability": { + ".validate": "newData.isString() && newData.val().matches(/^(strength|dexterity|constitution|intelligence|wisdom|charisma)$/)" + }, + "optional": { + ".validate": "newData.isBoolean()" + }, + "rolls": { + "$rollIndex": { + "damage_type": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + }, + "magical": { + ".validate": "newData.isBoolean()" + }, + "dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "dice_type": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "options": { + "$optionKey": { + "damage_type": { + ".validate": "newData.isString() && newData.val().matches(/^(acid|bludgeoning|cold|fire|force|lightning|necrotic|piercing|poison|psychic|radiant|slashing|thunder|non_magical_bludgeoning|non_magical_piercing|non_magical_slashing)$/)" + }, + "magical": { + ".validate": "newData.isBoolean()" + }, + "dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "dice_type": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "ignore": { + ".validate": "newData.isBoolean()" + } + } + }, + "primary": { + ".validate": "newData.isBoolean()" + }, + "miss_mod": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" + }, + "save_fail_mod": { + ".validate": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 2" + }, + "special": { + "$specialIndex": { + ".validate": "newData.isString() && newData.val().matches(/^(siphon_full|siphon_half|drain)$/)" + } + }, + "scaling": { + "$scalingIndex": { + ".validate": "newData.hasChildren(['level'])", + "level": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 20" + }, + "dice_count": { + ".validate": "newData.isNumber() && newData.val() >= 1 && newData.val() <= 99" + }, + "fixed_val": { + ".validate": "newData.isNumber() && newData.val() >= -99 && newData.val() <= 99" + }, + "$other": { ".validate": false } + } + }, + "$other": { ".validate": false } + } + }, + "$other": { ".validate": false } + } + }, + "$other": { ".validate": false }, + ".write": "$uid === auth.uid" + }, + ".write": "root.child('users').child(auth.uid).child('admin').exists()", + ".read": true, + ".indexOn": ["metadata/tagged", "metadata/finished"] + } + }, + "search_spells": { + ".read": true, + "$uid": { + ".write": "$uid === auth.uid", + "results": { + ".indexOn": ["name"] + } + } + }, + "reminders": { + "$uid": { + ".write": "$uid === auth.uid", + ".read": true + }, + ".read": "root.child('users').child(auth.uid).child('admin').exists()" + }, + "search_reminders": { + ".read": true, + "$uid": { + ".write": "$uid === auth.uid", + "results": { + ".indexOn": ["name"] + } + } + }, + "vouchers": { + "$voucherId": { + "times_used": { + ".write": true + } + }, + ".read": true, + ".write": "root.child('users').child(auth.uid).child('admin').exists()" + }, + "voucher_history": { + "$uid": { + ".read": "$uid === auth.uid", + ".write": "$uid === auth.uid" + } + } + } +} diff --git a/package-lock.json b/package-lock.json index c88c459ab..68e82b6d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "harmless_key", - "version": "2.9.2", + "version": "2.12.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "harmless_key", - "version": "2.9.2", + "version": "2.12.0", "dependencies": { "@octokit/rest": "^19.0.5", "@quasar/extras": "^1.0.0", diff --git a/package.json b/package.json index e9b502792..34d1ab459 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "2.9.2", + "version": "2.12.0", "name": "harmless_key", "description": "A Dungeons and Dragons Combat Tracker", "productName": "Harmless Key", diff --git a/public/sitemap.xml b/public/sitemap.xml index dc84c6252..af1236ab2 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -1 +1 @@ -https://harmlesskey.com2022-10-19https://harmlesskey.com/demo2022-10-19https://harmlesskey.com/documentation2022-10-19https://harmlesskey.com/about-us2022-10-19https://harmlesskey.com/sign-up2022-10-19https://harmlesskey.com/sign-in2022-10-19https://harmlesskey.com/privacy-policy2022-10-19https://harmlesskey.com/changelog2022-10-19https://harmlesskey.com/feedback2022-10-19https://harmlesskey.com/patreon2022-10-19https://harmlesskey.com/compendium2022-10-19https://harmlesskey.com/compendium/conditions2022-10-19https://harmlesskey.com/compendium/monsters2022-10-19https://harmlesskey.com/compendium/spells2022-10-19https://harmlesskey.com/compendium/items2022-10-19https://harmlesskey.com/tools2022-10-19https://harmlesskey.com/tools/combat-tracker2022-10-19https://harmlesskey.com/tools/encounter-builder2022-10-19https://harmlesskey.com/tools/encounter-builder/build-encounter2022-10-19https://harmlesskey.com/tools/monster-creator2022-10-19https://harmlesskey.com/tools/monster-creator/create-monster2022-10-19https://harmlesskey.com/tools/character-builder2022-10-19https://harmlesskey.com/compendium/conditions/blinded2022-10-19https://harmlesskey.com/compendium/conditions/charmed2022-10-19https://harmlesskey.com/compendium/conditions/deafened2022-10-19https://harmlesskey.com/compendium/conditions/exhaustion2022-10-19https://harmlesskey.com/compendium/conditions/frightened2022-10-19https://harmlesskey.com/compendium/conditions/grappled2022-10-19https://harmlesskey.com/compendium/conditions/incapacitated2022-10-19https://harmlesskey.com/compendium/conditions/invisible2022-10-19https://harmlesskey.com/compendium/conditions/paralyzed2022-10-19https://harmlesskey.com/compendium/conditions/petrified2022-10-19https://harmlesskey.com/compendium/conditions/poisoned2022-10-19https://harmlesskey.com/compendium/conditions/prone2022-10-19https://harmlesskey.com/compendium/conditions/restrained2022-10-19https://harmlesskey.com/compendium/conditions/stunned2022-10-19https://harmlesskey.com/compendium/conditions/unconscious2022-10-19https://harmlesskey.com/compendium/items/adamantine-armor2022-10-19https://harmlesskey.com/compendium/items/amulet-of-health2022-10-19https://harmlesskey.com/compendium/items/amulet-of-proof-against-detection-and-location2022-10-19https://harmlesskey.com/compendium/items/amulet-of-the-planes2022-10-19https://harmlesskey.com/compendium/items/animated-shield2022-10-19https://harmlesskey.com/compendium/items/apparatus-of-the-crab2022-10-19https://harmlesskey.com/compendium/items/armor-of-invulnerability2022-10-19https://harmlesskey.com/compendium/items/armor-of-resistance2022-10-19https://harmlesskey.com/compendium/items/armor-of-vulnerability2022-10-19https://harmlesskey.com/compendium/items/arrow-of-slaying2022-10-19https://harmlesskey.com/compendium/items/arrow-catching-shield2022-10-19https://harmlesskey.com/compendium/items/bag-of-beans2022-10-19https://harmlesskey.com/compendium/items/bag-of-devouring2022-10-19https://harmlesskey.com/compendium/items/bag-of-holding2022-10-19https://harmlesskey.com/compendium/items/bag-of-tricks2022-10-19https://harmlesskey.com/compendium/items/bead-of-force2022-10-19https://harmlesskey.com/compendium/items/belt-of-dwarvenkind2022-10-19https://harmlesskey.com/compendium/items/belt-of-giant-strength2022-10-19https://harmlesskey.com/compendium/items/berserker-axe2022-10-19https://harmlesskey.com/compendium/items/boots-of-elvenkind2022-10-19https://harmlesskey.com/compendium/items/boots-of-levitation2022-10-19https://harmlesskey.com/compendium/items/boots-of-speed2022-10-19https://harmlesskey.com/compendium/items/boots-of-striding-and-springing2022-10-19https://harmlesskey.com/compendium/items/boots-of-the-winterlands2022-10-19https://harmlesskey.com/compendium/items/bowl-of-commanding-water-elementals2022-10-19https://harmlesskey.com/compendium/items/bracers-of-archery2022-10-19https://harmlesskey.com/compendium/items/bracers-of-defense2022-10-19https://harmlesskey.com/compendium/items/brazier-of-commanding-fire-elementals2022-10-19https://harmlesskey.com/compendium/items/brooch-of-shielding2022-10-19https://harmlesskey.com/compendium/items/broom-of-flying2022-10-19https://harmlesskey.com/compendium/items/candle-of-invocation2022-10-19https://harmlesskey.com/compendium/items/cape-of-the-mountebank2022-10-19https://harmlesskey.com/compendium/items/carpet-of-flying2022-10-19https://harmlesskey.com/compendium/items/censer-of-controlling-air-elementals2022-10-19https://harmlesskey.com/compendium/items/chime-of-opening2022-10-19https://harmlesskey.com/compendium/items/circlet-of-blasting2022-10-19https://harmlesskey.com/compendium/items/cloak-of-arachnida2022-10-19https://harmlesskey.com/compendium/items/cloak-of-displacement2022-10-19https://harmlesskey.com/compendium/items/cloak-of-elvenkind2022-10-19https://harmlesskey.com/compendium/items/cloak-of-protection2022-10-19https://harmlesskey.com/compendium/items/cloak-of-the-bat2022-10-19https://harmlesskey.com/compendium/items/cloak-of-the-manta-ray2022-10-19https://harmlesskey.com/compendium/items/crystal-ball2022-10-19https://harmlesskey.com/compendium/items/cube-of-force2022-10-19https://harmlesskey.com/compendium/items/cubic-gate2022-10-19https://harmlesskey.com/compendium/items/dagger-of-venom2022-10-19https://harmlesskey.com/compendium/items/dancing-sword2022-10-19https://harmlesskey.com/compendium/items/decanter-of-endless-water2022-10-19https://harmlesskey.com/compendium/items/deck-of-illusions2022-10-19https://harmlesskey.com/compendium/items/deck-of-many-things2022-10-19https://harmlesskey.com/compendium/items/defender2022-10-19https://harmlesskey.com/compendium/items/demon-armor2022-10-19https://harmlesskey.com/compendium/items/dimensional-shackles2022-10-19https://harmlesskey.com/compendium/items/dragon-scale-mail2022-10-19https://harmlesskey.com/compendium/items/dragon-slayer2022-10-19https://harmlesskey.com/compendium/items/dust-of-disappearance2022-10-19https://harmlesskey.com/compendium/items/dust-of-dryness2022-10-19https://harmlesskey.com/compendium/items/dust-of-sneezing-and-choking2022-10-19https://harmlesskey.com/compendium/items/dwarven-plate2022-10-19https://harmlesskey.com/compendium/items/dwarven-thrower2022-10-19https://harmlesskey.com/compendium/items/efficient-quiver2022-10-19https://harmlesskey.com/compendium/items/efreeti-bottle2022-10-19https://harmlesskey.com/compendium/items/elemental-gem2022-10-19https://harmlesskey.com/compendium/items/elven-chain2022-10-19https://harmlesskey.com/compendium/items/eversmoking-bottle2022-10-19https://harmlesskey.com/compendium/items/eyes-of-charming2022-10-19https://harmlesskey.com/compendium/items/eyes-of-minute-seeing2022-10-19https://harmlesskey.com/compendium/items/eyes-of-the-eagle2022-10-19https://harmlesskey.com/compendium/items/figurine-of-wondrous-power2022-10-19https://harmlesskey.com/compendium/items/flame-tongue2022-10-19https://harmlesskey.com/compendium/items/folding-boat2022-10-19https://harmlesskey.com/compendium/items/frost-brand2022-10-19https://harmlesskey.com/compendium/items/gauntlets-of-ogre-power2022-10-19https://harmlesskey.com/compendium/items/gem-of-brightness2022-10-19https://harmlesskey.com/compendium/items/gem-of-seeing2022-10-19https://harmlesskey.com/compendium/items/giant-slayer2022-10-19https://harmlesskey.com/compendium/items/glamoured-studded-leather2022-10-19https://harmlesskey.com/compendium/items/gloves-of-missile-snaring2022-10-19https://harmlesskey.com/compendium/items/gloves-of-swimming-and-climbing2022-10-19https://harmlesskey.com/compendium/items/goggles-of-night2022-10-19https://harmlesskey.com/compendium/items/hammer-of-thunderbolts2022-10-19https://harmlesskey.com/compendium/items/handy-haversack2022-10-19https://harmlesskey.com/compendium/items/hat-of-disguise2022-10-19https://harmlesskey.com/compendium/items/headband-of-intellect2022-10-19https://harmlesskey.com/compendium/items/helm-of-brilliance2022-10-19https://harmlesskey.com/compendium/items/helm-of-comprehending-languages2022-10-19https://harmlesskey.com/compendium/items/helm-of-telepathy2022-10-19https://harmlesskey.com/compendium/items/helm-of-teleportation2022-10-19https://harmlesskey.com/compendium/items/holy-avenger2022-10-19https://harmlesskey.com/compendium/items/horn-of-blasting2022-10-19https://harmlesskey.com/compendium/items/horn-of-valhalla2022-10-19https://harmlesskey.com/compendium/items/horseshoes-of-speed2022-10-19https://harmlesskey.com/compendium/items/horseshoes-of-a-zephyr2022-10-19https://harmlesskey.com/compendium/items/immovable-rod2022-10-19https://harmlesskey.com/compendium/items/instant-fortress2022-10-19https://harmlesskey.com/compendium/items/ioun-stone2022-10-19https://harmlesskey.com/compendium/items/iron-bands-of-binding2022-10-19https://harmlesskey.com/compendium/items/iron-flask2022-10-19https://harmlesskey.com/compendium/items/javelin-of-lightning2022-10-19https://harmlesskey.com/compendium/items/lantern-of-revealing2022-10-19https://harmlesskey.com/compendium/items/luck-blade2022-10-19https://harmlesskey.com/compendium/items/mace-of-disruption2022-10-19https://harmlesskey.com/compendium/items/mace-of-smiting2022-10-19https://harmlesskey.com/compendium/items/mace-of-terror2022-10-19https://harmlesskey.com/compendium/items/mantle-of-spell-resistance2022-10-19https://harmlesskey.com/compendium/items/manual-of-bodily-health2022-10-19https://harmlesskey.com/compendium/items/manual-of-gainful-exercise2022-10-19https://harmlesskey.com/compendium/items/manual-of-golems2022-10-19https://harmlesskey.com/compendium/items/manual-of-quickness-of-action2022-10-19https://harmlesskey.com/compendium/items/marvelous-pigments2022-10-19https://harmlesskey.com/compendium/items/medallion-of-thoughts2022-10-19https://harmlesskey.com/compendium/items/mirror-of-life-trapping2022-10-19https://harmlesskey.com/compendium/items/mithral-armor2022-10-19https://harmlesskey.com/compendium/items/necklace-of-adaptation2022-10-19https://harmlesskey.com/compendium/items/necklace-of-fireballs2022-10-19https://harmlesskey.com/compendium/items/necklace-of-prayer-beads2022-10-19https://harmlesskey.com/compendium/items/nine-lives-stealer2022-10-19https://harmlesskey.com/compendium/items/oathbow2022-10-19https://harmlesskey.com/compendium/items/oil-of-etherealness2022-10-19https://harmlesskey.com/compendium/items/oil-of-sharpness2022-10-19https://harmlesskey.com/compendium/items/oil-of-slipperiness2022-10-19https://harmlesskey.com/compendium/items/orb-of-dragonkind2022-10-19https://harmlesskey.com/compendium/items/pearl-of-power2022-10-19https://harmlesskey.com/compendium/items/periapt-of-health2022-10-19https://harmlesskey.com/compendium/items/periapt-of-proof-against-poison2022-10-19https://harmlesskey.com/compendium/items/periapt-of-wound-closure2022-10-19https://harmlesskey.com/compendium/items/philter-of-love2022-10-19https://harmlesskey.com/compendium/items/pipes-of-haunting2022-10-19https://harmlesskey.com/compendium/items/pipes-of-the-sewers2022-10-19https://harmlesskey.com/compendium/items/plate-armor-of-etherealness2022-10-19https://harmlesskey.com/compendium/items/portable-hole2022-10-19https://harmlesskey.com/compendium/items/potion-of-animal-friendship2022-10-19https://harmlesskey.com/compendium/items/potion-of-clairvoyance2022-10-19https://harmlesskey.com/compendium/items/potion-of-climbing2022-10-19https://harmlesskey.com/compendium/items/potion-of-diminution2022-10-19https://harmlesskey.com/compendium/items/potion-of-flying2022-10-19https://harmlesskey.com/compendium/items/potion-of-gaseous-form2022-10-19https://harmlesskey.com/compendium/items/potion-of-giant-strength2022-10-19https://harmlesskey.com/compendium/items/potion-of-growth2022-10-19https://harmlesskey.com/compendium/items/potion-of-healing2022-10-19https://harmlesskey.com/compendium/items/potion-of-heroism2022-10-19https://harmlesskey.com/compendium/items/potion-of-invisibility2022-10-19https://harmlesskey.com/compendium/items/potion-of-mind-reading2022-10-19https://harmlesskey.com/compendium/items/potion-of-poison2022-10-19https://harmlesskey.com/compendium/items/potion-of-resistance2022-10-19https://harmlesskey.com/compendium/items/potion-of-speed2022-10-19https://harmlesskey.com/compendium/items/potion-of-water-breathing2022-10-19https://harmlesskey.com/compendium/items/quaals-feather-token2022-10-19https://harmlesskey.com/compendium/items/restorative-ointment2022-10-19https://harmlesskey.com/compendium/items/ring-of-animal-influence2022-10-19https://harmlesskey.com/compendium/items/ring-of-djinni-summoning2022-10-19https://harmlesskey.com/compendium/items/ring-of-elemental-command2022-10-19https://harmlesskey.com/compendium/items/ring-of-evasion2022-10-19https://harmlesskey.com/compendium/items/ring-of-feather-falling2022-10-19https://harmlesskey.com/compendium/items/ring-of-free-action2022-10-19https://harmlesskey.com/compendium/items/ring-of-invisibility2022-10-19https://harmlesskey.com/compendium/items/ring-of-jumping2022-10-19https://harmlesskey.com/compendium/items/ring-of-mind-shielding2022-10-19https://harmlesskey.com/compendium/items/ring-of-protection2022-10-19https://harmlesskey.com/compendium/items/ring-of-regeneration2022-10-19https://harmlesskey.com/compendium/items/ring-of-resistance2022-10-19https://harmlesskey.com/compendium/items/ring-of-shooting-stars2022-10-19https://harmlesskey.com/compendium/items/ring-of-spell-storing2022-10-19https://harmlesskey.com/compendium/items/ring-of-spell-turning2022-10-19https://harmlesskey.com/compendium/items/ring-of-swimming2022-10-19https://harmlesskey.com/compendium/items/ring-of-telekinesis2022-10-19https://harmlesskey.com/compendium/items/ring-of-three-wishes2022-10-19https://harmlesskey.com/compendium/items/ring-of-warmth2022-10-19https://harmlesskey.com/compendium/items/ring-of-water-walking2022-10-19https://harmlesskey.com/compendium/items/ring-of-x-ray-vision2022-10-19https://harmlesskey.com/compendium/items/ring-of-the-ram2022-10-19https://harmlesskey.com/compendium/items/robe-of-eyes2022-10-19https://harmlesskey.com/compendium/items/robe-of-scintillating-colors2022-10-19https://harmlesskey.com/compendium/items/robe-of-stars2022-10-19https://harmlesskey.com/compendium/items/robe-of-useful-items2022-10-19https://harmlesskey.com/compendium/items/robe-of-the-archmagi2022-10-19https://harmlesskey.com/compendium/items/rod-of-absorption2022-10-19https://harmlesskey.com/compendium/items/rod-of-alertness2022-10-19https://harmlesskey.com/compendium/items/rod-of-lordly-might2022-10-19https://harmlesskey.com/compendium/items/rod-of-rulership2022-10-19https://harmlesskey.com/compendium/items/rod-of-security2022-10-19https://harmlesskey.com/compendium/items/rope-of-climbing2022-10-19https://harmlesskey.com/compendium/items/rope-of-entanglement2022-10-19https://harmlesskey.com/compendium/items/scarab-of-protection2022-10-19https://harmlesskey.com/compendium/items/scimitar-of-speed2022-10-19https://harmlesskey.com/compendium/items/shield-of-missile-attraction2022-10-19https://harmlesskey.com/compendium/items/slippers-of-spider-climbing2022-10-19https://harmlesskey.com/compendium/items/sovereign-glue2022-10-19https://harmlesskey.com/compendium/items/spell-scroll2022-10-19https://harmlesskey.com/compendium/items/spellguard-shield2022-10-19https://harmlesskey.com/compendium/items/sphere-of-annihilation2022-10-19https://harmlesskey.com/compendium/items/staff-of-charming2022-10-19https://harmlesskey.com/compendium/items/staff-of-fire2022-10-19https://harmlesskey.com/compendium/items/staff-of-frost2022-10-19https://harmlesskey.com/compendium/items/staff-of-healing2022-10-19https://harmlesskey.com/compendium/items/staff-of-power2022-10-19https://harmlesskey.com/compendium/items/staff-of-striking2022-10-19https://harmlesskey.com/compendium/items/staff-of-swarming-insects2022-10-19https://harmlesskey.com/compendium/items/staff-of-thunder-and-lightning2022-10-19https://harmlesskey.com/compendium/items/staff-of-withering2022-10-19https://harmlesskey.com/compendium/items/staff-of-the-magi2022-10-19https://harmlesskey.com/compendium/items/staff-of-the-python2022-10-19https://harmlesskey.com/compendium/items/staff-of-the-woodlands2022-10-19https://harmlesskey.com/compendium/items/stone-of-controlling-earth-elementals2022-10-19https://harmlesskey.com/compendium/items/stone-of-good-luck-luckstone2022-10-19https://harmlesskey.com/compendium/items/sun-blade2022-10-19https://harmlesskey.com/compendium/items/sword-of-life-stealing2022-10-19https://harmlesskey.com/compendium/items/sword-of-sharpness2022-10-19https://harmlesskey.com/compendium/items/sword-of-wounding2022-10-19https://harmlesskey.com/compendium/items/talisman-of-pure-good2022-10-19https://harmlesskey.com/compendium/items/talisman-of-ultimate-evil2022-10-19https://harmlesskey.com/compendium/items/talisman-of-the-sphere2022-10-19https://harmlesskey.com/compendium/items/tome-of-clear-thought2022-10-19https://harmlesskey.com/compendium/items/tome-of-leadership-and-influence2022-10-19https://harmlesskey.com/compendium/items/tome-of-understanding2022-10-19https://harmlesskey.com/compendium/items/trident-of-fish-command2022-10-19https://harmlesskey.com/compendium/items/universal-solvent2022-10-19https://harmlesskey.com/compendium/items/vicious-weapon2022-10-19https://harmlesskey.com/compendium/items/vorpal-sword2022-10-19https://harmlesskey.com/compendium/items/wand-of-binding2022-10-19https://harmlesskey.com/compendium/items/wand-of-enemy-detection2022-10-19https://harmlesskey.com/compendium/items/wand-of-fear2022-10-19https://harmlesskey.com/compendium/items/wand-of-fireballs2022-10-19https://harmlesskey.com/compendium/items/wand-of-lightning-bolts2022-10-19https://harmlesskey.com/compendium/items/wand-of-magic-detection2022-10-19https://harmlesskey.com/compendium/items/wand-of-magic-missiles2022-10-19https://harmlesskey.com/compendium/items/wand-of-paralysis2022-10-19https://harmlesskey.com/compendium/items/wand-of-polymorph2022-10-19https://harmlesskey.com/compendium/items/wand-of-secrets2022-10-19https://harmlesskey.com/compendium/items/wand-of-web2022-10-19https://harmlesskey.com/compendium/items/wand-of-wonder2022-10-19https://harmlesskey.com/compendium/items/wand-of-the-war-mage2022-10-19https://harmlesskey.com/compendium/items/weapon2022-10-19https://harmlesskey.com/compendium/items/well-of-many-worlds2022-10-19https://harmlesskey.com/compendium/items/wind-fan2022-10-19https://harmlesskey.com/compendium/items/winged-boots2022-10-19https://harmlesskey.com/compendium/items/wings-of-flying2022-10-19https://harmlesskey.com/compendium/monsters/aboleth2022-10-19https://harmlesskey.com/compendium/monsters/acolyte2022-10-19https://harmlesskey.com/compendium/monsters/adult-black-dragon2022-10-19https://harmlesskey.com/compendium/monsters/adult-blue-dracolich2022-10-19https://harmlesskey.com/compendium/monsters/adult-blue-dragon2022-10-19https://harmlesskey.com/compendium/monsters/adult-brass-dragon2022-10-19https://harmlesskey.com/compendium/monsters/adult-bronze-dragon2022-10-19https://harmlesskey.com/compendium/monsters/adult-copper-dragon2022-10-19https://harmlesskey.com/compendium/monsters/adult-gold-dragon2022-10-19https://harmlesskey.com/compendium/monsters/adult-green-dragon2022-10-19https://harmlesskey.com/compendium/monsters/adult-red-dragon2022-10-19https://harmlesskey.com/compendium/monsters/adult-silver-dragon2022-10-19https://harmlesskey.com/compendium/monsters/adult-white-dragon2022-10-19https://harmlesskey.com/compendium/monsters/air-elemental2022-10-19https://harmlesskey.com/compendium/monsters/ancient-black-dragon2022-10-19https://harmlesskey.com/compendium/monsters/ancient-blue-dragon2022-10-19https://harmlesskey.com/compendium/monsters/ancient-brass-dragon2022-10-19https://harmlesskey.com/compendium/monsters/ancient-bronze-dragon2022-10-19https://harmlesskey.com/compendium/monsters/ancient-copper-dragon2022-10-19https://harmlesskey.com/compendium/monsters/ancient-gold-dragon2022-10-19https://harmlesskey.com/compendium/monsters/ancient-green-dragon2022-10-19https://harmlesskey.com/compendium/monsters/ancient-red-dragon2022-10-19https://harmlesskey.com/compendium/monsters/ancient-silver-dragon2022-10-19https://harmlesskey.com/compendium/monsters/ancient-white-dragon2022-10-19https://harmlesskey.com/compendium/monsters/androsphinx2022-10-19https://harmlesskey.com/compendium/monsters/animated-armor2022-10-19https://harmlesskey.com/compendium/monsters/ankheg2022-10-19https://harmlesskey.com/compendium/monsters/ape2022-10-19https://harmlesskey.com/compendium/monsters/archmage2022-10-19https://harmlesskey.com/compendium/monsters/assassin2022-10-19https://harmlesskey.com/compendium/monsters/awakened-shrub2022-10-19https://harmlesskey.com/compendium/monsters/awakened-tree2022-10-19https://harmlesskey.com/compendium/monsters/axe-beak2022-10-19https://harmlesskey.com/compendium/monsters/azer2022-10-19https://harmlesskey.com/compendium/monsters/baboon2022-10-19https://harmlesskey.com/compendium/monsters/badger2022-10-19https://harmlesskey.com/compendium/monsters/balor2022-10-19https://harmlesskey.com/compendium/monsters/bandit2022-10-19https://harmlesskey.com/compendium/monsters/bandit-captain2022-10-19https://harmlesskey.com/compendium/monsters/barbed-devil2022-10-19https://harmlesskey.com/compendium/monsters/basilisk2022-10-19https://harmlesskey.com/compendium/monsters/bat2022-10-19https://harmlesskey.com/compendium/monsters/bearded-devil2022-10-19https://harmlesskey.com/compendium/monsters/behir2022-10-19https://harmlesskey.com/compendium/monsters/berserker2022-10-19https://harmlesskey.com/compendium/monsters/black-bear2022-10-19https://harmlesskey.com/compendium/monsters/black-dragon-wyrmling2022-10-19https://harmlesskey.com/compendium/monsters/black-pudding2022-10-19https://harmlesskey.com/compendium/monsters/blink-dog2022-10-19https://harmlesskey.com/compendium/monsters/blood-hawk2022-10-19https://harmlesskey.com/compendium/monsters/blue-dragon-wyrmling2022-10-19https://harmlesskey.com/compendium/monsters/boar2022-10-19https://harmlesskey.com/compendium/monsters/bone-devil2022-10-19https://harmlesskey.com/compendium/monsters/brass-dragon-wyrmling2022-10-19https://harmlesskey.com/compendium/monsters/bronze-dragon-wyrmling2022-10-19https://harmlesskey.com/compendium/monsters/brown-bear2022-10-19https://harmlesskey.com/compendium/monsters/bugbear2022-10-19https://harmlesskey.com/compendium/monsters/bulette2022-10-19https://harmlesskey.com/compendium/monsters/camel2022-10-19https://harmlesskey.com/compendium/monsters/carrion-crawler2022-10-19https://harmlesskey.com/compendium/monsters/cat2022-10-19https://harmlesskey.com/compendium/monsters/cave-bear2022-10-19https://harmlesskey.com/compendium/monsters/centaur2022-10-19https://harmlesskey.com/compendium/monsters/chain-devil2022-10-19https://harmlesskey.com/compendium/monsters/chimera2022-10-19https://harmlesskey.com/compendium/monsters/chuul2022-10-19https://harmlesskey.com/compendium/monsters/clay-golem2022-10-19https://harmlesskey.com/compendium/monsters/cloaker2022-10-19https://harmlesskey.com/compendium/monsters/cloud-giant2022-10-19https://harmlesskey.com/compendium/monsters/cockatrice2022-10-19https://harmlesskey.com/compendium/monsters/commoner2022-10-19https://harmlesskey.com/compendium/monsters/constrictor-snake2022-10-19https://harmlesskey.com/compendium/monsters/copper-dragon-wyrmling2022-10-19https://harmlesskey.com/compendium/monsters/couatl2022-10-19https://harmlesskey.com/compendium/monsters/crab2022-10-19https://harmlesskey.com/compendium/monsters/crocodile2022-10-19https://harmlesskey.com/compendium/monsters/cult-fanatic2022-10-19https://harmlesskey.com/compendium/monsters/cultist2022-10-19https://harmlesskey.com/compendium/monsters/darkmantle2022-10-19https://harmlesskey.com/compendium/monsters/death-dog2022-10-19https://harmlesskey.com/compendium/monsters/deep-gnome-svirfneblin2022-10-19https://harmlesskey.com/compendium/monsters/deer2022-10-19https://harmlesskey.com/compendium/monsters/deva2022-10-19https://harmlesskey.com/compendium/monsters/dire-wolf2022-10-19https://harmlesskey.com/compendium/monsters/diseased-giant-rat2022-10-19https://harmlesskey.com/compendium/monsters/djinni2022-10-19https://harmlesskey.com/compendium/monsters/doppelganger2022-10-19https://harmlesskey.com/compendium/monsters/draft-horse2022-10-19https://harmlesskey.com/compendium/monsters/dragon-turtle2022-10-19https://harmlesskey.com/compendium/monsters/dretch2022-10-19https://harmlesskey.com/compendium/monsters/drider2022-10-19https://harmlesskey.com/compendium/monsters/drow2022-10-19https://harmlesskey.com/compendium/monsters/druid2022-10-19https://harmlesskey.com/compendium/monsters/dryad2022-10-19https://harmlesskey.com/compendium/monsters/duergar2022-10-19https://harmlesskey.com/compendium/monsters/dust-mephit2022-10-19https://harmlesskey.com/compendium/monsters/eagle2022-10-19https://harmlesskey.com/compendium/monsters/earth-elemental2022-10-19https://harmlesskey.com/compendium/monsters/efreeti2022-10-19https://harmlesskey.com/compendium/monsters/elephant2022-10-19https://harmlesskey.com/compendium/monsters/elk2022-10-19https://harmlesskey.com/compendium/monsters/erinyes2022-10-19https://harmlesskey.com/compendium/monsters/ettercap2022-10-19https://harmlesskey.com/compendium/monsters/ettin2022-10-19https://harmlesskey.com/compendium/monsters/fire-elemental2022-10-19https://harmlesskey.com/compendium/monsters/fire-giant2022-10-19https://harmlesskey.com/compendium/monsters/flesh-golem2022-10-19https://harmlesskey.com/compendium/monsters/flying-snake2022-10-19https://harmlesskey.com/compendium/monsters/flying-sword2022-10-19https://harmlesskey.com/compendium/monsters/frog2022-10-19https://harmlesskey.com/compendium/monsters/frost-giant2022-10-19https://harmlesskey.com/compendium/monsters/gargoyle2022-10-19https://harmlesskey.com/compendium/monsters/gelatinous-cube2022-10-19https://harmlesskey.com/compendium/monsters/ghast2022-10-19https://harmlesskey.com/compendium/monsters/ghost2022-10-19https://harmlesskey.com/compendium/monsters/ghoul2022-10-19https://harmlesskey.com/compendium/monsters/giant-ape2022-10-19https://harmlesskey.com/compendium/monsters/giant-badger2022-10-19https://harmlesskey.com/compendium/monsters/giant-bat2022-10-19https://harmlesskey.com/compendium/monsters/giant-boar2022-10-19https://harmlesskey.com/compendium/monsters/giant-centipede2022-10-19https://harmlesskey.com/compendium/monsters/giant-constrictor-snake2022-10-19https://harmlesskey.com/compendium/monsters/giant-crab2022-10-19https://harmlesskey.com/compendium/monsters/giant-crocodile2022-10-19https://harmlesskey.com/compendium/monsters/giant-eagle2022-10-19https://harmlesskey.com/compendium/monsters/giant-elk2022-10-19https://harmlesskey.com/compendium/monsters/giant-fire-beetle2022-10-19https://harmlesskey.com/compendium/monsters/giant-frog2022-10-19https://harmlesskey.com/compendium/monsters/giant-goat2022-10-19https://harmlesskey.com/compendium/monsters/giant-hyena2022-10-19https://harmlesskey.com/compendium/monsters/giant-lizard2022-10-19https://harmlesskey.com/compendium/monsters/giant-octopus2022-10-19https://harmlesskey.com/compendium/monsters/giant-owl2022-10-19https://harmlesskey.com/compendium/monsters/giant-poisonous-snake2022-10-19https://harmlesskey.com/compendium/monsters/giant-rat2022-10-19https://harmlesskey.com/compendium/monsters/giant-scorpion2022-10-19https://harmlesskey.com/compendium/monsters/giant-sea-horse2022-10-19https://harmlesskey.com/compendium/monsters/giant-shark2022-10-19https://harmlesskey.com/compendium/monsters/giant-spider2022-10-19https://harmlesskey.com/compendium/monsters/giant-toad2022-10-19https://harmlesskey.com/compendium/monsters/giant-vulture2022-10-19https://harmlesskey.com/compendium/monsters/giant-wasp2022-10-19https://harmlesskey.com/compendium/monsters/giant-weasel2022-10-19https://harmlesskey.com/compendium/monsters/giant-wolf-spider2022-10-19https://harmlesskey.com/compendium/monsters/gibbering-mouther2022-10-19https://harmlesskey.com/compendium/monsters/glabrezu2022-10-19https://harmlesskey.com/compendium/monsters/gladiator2022-10-19https://harmlesskey.com/compendium/monsters/gnoll2022-10-19https://harmlesskey.com/compendium/monsters/goat2022-10-19https://harmlesskey.com/compendium/monsters/goblin2022-10-19https://harmlesskey.com/compendium/monsters/gold-dragon-wyrmling2022-10-19https://harmlesskey.com/compendium/monsters/gorgon2022-10-19https://harmlesskey.com/compendium/monsters/gray-ooze2022-10-19https://harmlesskey.com/compendium/monsters/green-dragon-wyrmling2022-10-19https://harmlesskey.com/compendium/monsters/green-hag2022-10-19https://harmlesskey.com/compendium/monsters/grick2022-10-19https://harmlesskey.com/compendium/monsters/griffon2022-10-19https://harmlesskey.com/compendium/monsters/grimlock2022-10-19https://harmlesskey.com/compendium/monsters/guard2022-10-19https://harmlesskey.com/compendium/monsters/guardian-naga2022-10-19https://harmlesskey.com/compendium/monsters/gynosphinx2022-10-19https://harmlesskey.com/compendium/monsters/half-red-dragon-veteran2022-10-19https://harmlesskey.com/compendium/monsters/harpy2022-10-19https://harmlesskey.com/compendium/monsters/hawk2022-10-19https://harmlesskey.com/compendium/monsters/hell-hound2022-10-19https://harmlesskey.com/compendium/monsters/hezrou2022-10-19https://harmlesskey.com/compendium/monsters/hill-giant2022-10-19https://harmlesskey.com/compendium/monsters/hippogriff2022-10-19https://harmlesskey.com/compendium/monsters/hobgoblin2022-10-19https://harmlesskey.com/compendium/monsters/homunculus2022-10-19https://harmlesskey.com/compendium/monsters/horned-devil2022-10-19https://harmlesskey.com/compendium/monsters/hunter-shark2022-10-19https://harmlesskey.com/compendium/monsters/hydra2022-10-19https://harmlesskey.com/compendium/monsters/hyena2022-10-19https://harmlesskey.com/compendium/monsters/ice-devil2022-10-19https://harmlesskey.com/compendium/monsters/ice-mephit2022-10-19https://harmlesskey.com/compendium/monsters/imp2022-10-19https://harmlesskey.com/compendium/monsters/invisible-stalker2022-10-19https://harmlesskey.com/compendium/monsters/iron-golem2022-10-19https://harmlesskey.com/compendium/monsters/jackal2022-10-19https://harmlesskey.com/compendium/monsters/killer-whale2022-10-19https://harmlesskey.com/compendium/monsters/knight2022-10-19https://harmlesskey.com/compendium/monsters/kobold2022-10-19https://harmlesskey.com/compendium/monsters/kraken2022-10-19https://harmlesskey.com/compendium/monsters/lamia2022-10-19https://harmlesskey.com/compendium/monsters/lemure2022-10-19https://harmlesskey.com/compendium/monsters/lich2022-10-19https://harmlesskey.com/compendium/monsters/lion2022-10-19https://harmlesskey.com/compendium/monsters/lizard2022-10-19https://harmlesskey.com/compendium/monsters/lizardfolk2022-10-19https://harmlesskey.com/compendium/monsters/mage2022-10-19https://harmlesskey.com/compendium/monsters/magma-mephit2022-10-19https://harmlesskey.com/compendium/monsters/magmin2022-10-19https://harmlesskey.com/compendium/monsters/mammoth2022-10-19https://harmlesskey.com/compendium/monsters/manticore2022-10-19https://harmlesskey.com/compendium/monsters/marilith2022-10-19https://harmlesskey.com/compendium/monsters/mastiff2022-10-19https://harmlesskey.com/compendium/monsters/medusa2022-10-19https://harmlesskey.com/compendium/monsters/merfolk2022-10-19https://harmlesskey.com/compendium/monsters/merrow2022-10-19https://harmlesskey.com/compendium/monsters/mimic2022-10-19https://harmlesskey.com/compendium/monsters/minotaur2022-10-19https://harmlesskey.com/compendium/monsters/minotaur-skeleton2022-10-19https://harmlesskey.com/compendium/monsters/mule2022-10-19https://harmlesskey.com/compendium/monsters/mummy2022-10-19https://harmlesskey.com/compendium/monsters/mummy-lord2022-10-19https://harmlesskey.com/compendium/monsters/nalfeshnee2022-10-19https://harmlesskey.com/compendium/monsters/night-hag2022-10-19https://harmlesskey.com/compendium/monsters/nightmare2022-10-19https://harmlesskey.com/compendium/monsters/noble2022-10-19https://harmlesskey.com/compendium/monsters/ochre-jelly2022-10-19https://harmlesskey.com/compendium/monsters/octopus2022-10-19https://harmlesskey.com/compendium/monsters/ogre2022-10-19https://harmlesskey.com/compendium/monsters/ogre-zombie2022-10-19https://harmlesskey.com/compendium/monsters/oni2022-10-19https://harmlesskey.com/compendium/monsters/orc2022-10-19https://harmlesskey.com/compendium/monsters/otyugh2022-10-19https://harmlesskey.com/compendium/monsters/owl2022-10-19https://harmlesskey.com/compendium/monsters/owlbear2022-10-19https://harmlesskey.com/compendium/monsters/panther2022-10-19https://harmlesskey.com/compendium/monsters/pegasus2022-10-19https://harmlesskey.com/compendium/monsters/phase-spider2022-10-19https://harmlesskey.com/compendium/monsters/pit-fiend2022-10-19https://harmlesskey.com/compendium/monsters/planetar2022-10-19https://harmlesskey.com/compendium/monsters/plesiosaurus2022-10-19https://harmlesskey.com/compendium/monsters/poisonous-snake2022-10-19https://harmlesskey.com/compendium/monsters/polar-bear2022-10-19https://harmlesskey.com/compendium/monsters/pony2022-10-19https://harmlesskey.com/compendium/monsters/priest2022-10-19https://harmlesskey.com/compendium/monsters/pseudodragon2022-10-19https://harmlesskey.com/compendium/monsters/purple-worm2022-10-19https://harmlesskey.com/compendium/monsters/quasit2022-10-19https://harmlesskey.com/compendium/monsters/quipper2022-10-19https://harmlesskey.com/compendium/monsters/rakshasa2022-10-19https://harmlesskey.com/compendium/monsters/rat2022-10-19https://harmlesskey.com/compendium/monsters/raven2022-10-19https://harmlesskey.com/compendium/monsters/red-dragon-wyrmling2022-10-19https://harmlesskey.com/compendium/monsters/reef-shark2022-10-19https://harmlesskey.com/compendium/monsters/remorhaz2022-10-19https://harmlesskey.com/compendium/monsters/rhinoceros2022-10-19https://harmlesskey.com/compendium/monsters/riding-horse2022-10-19https://harmlesskey.com/compendium/monsters/roc2022-10-19https://harmlesskey.com/compendium/monsters/roper2022-10-19https://harmlesskey.com/compendium/monsters/rug-of-smothering2022-10-19https://harmlesskey.com/compendium/monsters/rust-monster2022-10-19https://harmlesskey.com/compendium/monsters/saber-toothed-tiger2022-10-19https://harmlesskey.com/compendium/monsters/sahuagin2022-10-19https://harmlesskey.com/compendium/monsters/salamander2022-10-19https://harmlesskey.com/compendium/monsters/satyr2022-10-19https://harmlesskey.com/compendium/monsters/scorpion2022-10-19https://harmlesskey.com/compendium/monsters/scout2022-10-19https://harmlesskey.com/compendium/monsters/sea-hag2022-10-19https://harmlesskey.com/compendium/monsters/sea-horse2022-10-19https://harmlesskey.com/compendium/monsters/shadow2022-10-19https://harmlesskey.com/compendium/monsters/shambling-mound2022-10-19https://harmlesskey.com/compendium/monsters/shield-guardian2022-10-19https://harmlesskey.com/compendium/monsters/shrieker2022-10-19https://harmlesskey.com/compendium/monsters/silver-dragon-wyrmling2022-10-19https://harmlesskey.com/compendium/monsters/skeleton2022-10-19https://harmlesskey.com/compendium/monsters/solar2022-10-19https://harmlesskey.com/compendium/monsters/specter2022-10-19https://harmlesskey.com/compendium/monsters/spider2022-10-19https://harmlesskey.com/compendium/monsters/spirit-naga2022-10-19https://harmlesskey.com/compendium/monsters/sprite2022-10-19https://harmlesskey.com/compendium/monsters/spy2022-10-19https://harmlesskey.com/compendium/monsters/steam-mephit2022-10-19https://harmlesskey.com/compendium/monsters/stirge2022-10-19https://harmlesskey.com/compendium/monsters/stone-giant2022-10-19https://harmlesskey.com/compendium/monsters/stone-golem2022-10-19https://harmlesskey.com/compendium/monsters/storm-giant2022-10-19https://harmlesskey.com/compendium/monsters/succubus-incubus2022-10-19https://harmlesskey.com/compendium/monsters/swarm-of-bats2022-10-19https://harmlesskey.com/compendium/monsters/swarm-of-beetles2022-10-19https://harmlesskey.com/compendium/monsters/swarm-of-centipedes2022-10-19https://harmlesskey.com/compendium/monsters/swarm-of-insects2022-10-19https://harmlesskey.com/compendium/monsters/swarm-of-poisonous-snakes2022-10-19https://harmlesskey.com/compendium/monsters/swarm-of-quippers2022-10-19https://harmlesskey.com/compendium/monsters/swarm-of-rats2022-10-19https://harmlesskey.com/compendium/monsters/swarm-of-ravens2022-10-19https://harmlesskey.com/compendium/monsters/swarm-of-spiders2022-10-19https://harmlesskey.com/compendium/monsters/swarm-of-wasps2022-10-19https://harmlesskey.com/compendium/monsters/tarrasque2022-10-19https://harmlesskey.com/compendium/monsters/thug2022-10-19https://harmlesskey.com/compendium/monsters/tiger2022-10-19https://harmlesskey.com/compendium/monsters/treant2022-10-19https://harmlesskey.com/compendium/monsters/tribal-warrior2022-10-19https://harmlesskey.com/compendium/monsters/triceratops2022-10-19https://harmlesskey.com/compendium/monsters/troll2022-10-19https://harmlesskey.com/compendium/monsters/tyrannosaurus-rex2022-10-19https://harmlesskey.com/compendium/monsters/unicorn2022-10-19https://harmlesskey.com/compendium/monsters/vampire2022-10-19https://harmlesskey.com/compendium/monsters/vampire-spawn2022-10-19https://harmlesskey.com/compendium/monsters/veteran2022-10-19https://harmlesskey.com/compendium/monsters/violet-fungus2022-10-19https://harmlesskey.com/compendium/monsters/vrock2022-10-19https://harmlesskey.com/compendium/monsters/vulture2022-10-19https://harmlesskey.com/compendium/monsters/warhorse2022-10-19https://harmlesskey.com/compendium/monsters/warhorse-skeleton2022-10-19https://harmlesskey.com/compendium/monsters/water-elemental2022-10-19https://harmlesskey.com/compendium/monsters/weasel2022-10-19https://harmlesskey.com/compendium/monsters/werebear2022-10-19https://harmlesskey.com/compendium/monsters/wereboar2022-10-19https://harmlesskey.com/compendium/monsters/wererat2022-10-19https://harmlesskey.com/compendium/monsters/weretiger2022-10-19https://harmlesskey.com/compendium/monsters/werewolf2022-10-19https://harmlesskey.com/compendium/monsters/white-dragon-wyrmling2022-10-19https://harmlesskey.com/compendium/monsters/wight2022-10-19https://harmlesskey.com/compendium/monsters/will-o-wisp2022-10-19https://harmlesskey.com/compendium/monsters/winter-wolf2022-10-19https://harmlesskey.com/compendium/monsters/wolf2022-10-19https://harmlesskey.com/compendium/monsters/worg2022-10-19https://harmlesskey.com/compendium/monsters/wraith2022-10-19https://harmlesskey.com/compendium/monsters/wyvern2022-10-19https://harmlesskey.com/compendium/monsters/xorn2022-10-19https://harmlesskey.com/compendium/monsters/young-black-dragon2022-10-19https://harmlesskey.com/compendium/monsters/young-blue-dragon2022-10-19https://harmlesskey.com/compendium/monsters/young-brass-dragon2022-10-19https://harmlesskey.com/compendium/monsters/young-bronze-dragon2022-10-19https://harmlesskey.com/compendium/monsters/young-copper-dragon2022-10-19https://harmlesskey.com/compendium/monsters/young-gold-dragon2022-10-19https://harmlesskey.com/compendium/monsters/young-green-dragon2022-10-19https://harmlesskey.com/compendium/monsters/young-red-dragon2022-10-19https://harmlesskey.com/compendium/monsters/young-silver-dragon2022-10-19https://harmlesskey.com/compendium/monsters/young-white-dragon2022-10-19https://harmlesskey.com/compendium/monsters/zombie2022-10-19https://harmlesskey.com/compendium/spells/acid-arrow2022-10-19https://harmlesskey.com/compendium/spells/acid-splash2022-10-19https://harmlesskey.com/compendium/spells/aid2022-10-19https://harmlesskey.com/compendium/spells/alarm2022-10-19https://harmlesskey.com/compendium/spells/alter-self2022-10-19https://harmlesskey.com/compendium/spells/animal-friendship2022-10-19https://harmlesskey.com/compendium/spells/animal-messenger2022-10-19https://harmlesskey.com/compendium/spells/animal-shapes2022-10-19https://harmlesskey.com/compendium/spells/animate-dead2022-10-19https://harmlesskey.com/compendium/spells/animate-objects2022-10-19https://harmlesskey.com/compendium/spells/antilife-shell2022-10-19https://harmlesskey.com/compendium/spells/antimagic-field2022-10-19https://harmlesskey.com/compendium/spells/antipathy-sympathy2022-10-19https://harmlesskey.com/compendium/spells/arcane-eye2022-10-19https://harmlesskey.com/compendium/spells/arcane-hand2022-10-19https://harmlesskey.com/compendium/spells/arcane-lock2022-10-19https://harmlesskey.com/compendium/spells/arcane-sword2022-10-19https://harmlesskey.com/compendium/spells/arcanists-magic-aura2022-10-19https://harmlesskey.com/compendium/spells/astral-projection2022-10-19https://harmlesskey.com/compendium/spells/augury2022-10-19https://harmlesskey.com/compendium/spells/awaken2022-10-19https://harmlesskey.com/compendium/spells/bane2022-10-19https://harmlesskey.com/compendium/spells/banishment2022-10-19https://harmlesskey.com/compendium/spells/barkskin2022-10-19https://harmlesskey.com/compendium/spells/beacon-of-hope2022-10-19https://harmlesskey.com/compendium/spells/bestow-curse2022-10-19https://harmlesskey.com/compendium/spells/black-tentacles2022-10-19https://harmlesskey.com/compendium/spells/blade-barrier2022-10-19https://harmlesskey.com/compendium/spells/bless2022-10-19https://harmlesskey.com/compendium/spells/blight2022-10-19https://harmlesskey.com/compendium/spells/blindness-deafness2022-10-19https://harmlesskey.com/compendium/spells/blink2022-10-19https://harmlesskey.com/compendium/spells/blur2022-10-19https://harmlesskey.com/compendium/spells/branding-smite2022-10-19https://harmlesskey.com/compendium/spells/burning-hands2022-10-19https://harmlesskey.com/compendium/spells/call-lightning2022-10-19https://harmlesskey.com/compendium/spells/calm-emotions2022-10-19https://harmlesskey.com/compendium/spells/chain-lightning2022-10-19https://harmlesskey.com/compendium/spells/charm-person2022-10-19https://harmlesskey.com/compendium/spells/chill-touch2022-10-19https://harmlesskey.com/compendium/spells/circle-of-death2022-10-19https://harmlesskey.com/compendium/spells/clairvoyance2022-10-19https://harmlesskey.com/compendium/spells/clone2022-10-19https://harmlesskey.com/compendium/spells/cloudkill2022-10-19https://harmlesskey.com/compendium/spells/color-spray2022-10-19https://harmlesskey.com/compendium/spells/command2022-10-19https://harmlesskey.com/compendium/spells/commune2022-10-19https://harmlesskey.com/compendium/spells/commune-with-nature2022-10-19https://harmlesskey.com/compendium/spells/comprehend-languages2022-10-19https://harmlesskey.com/compendium/spells/compulsion2022-10-19https://harmlesskey.com/compendium/spells/cone-of-cold2022-10-19https://harmlesskey.com/compendium/spells/confusion2022-10-19https://harmlesskey.com/compendium/spells/conjure-animals2022-10-19https://harmlesskey.com/compendium/spells/conjure-celestial2022-10-19https://harmlesskey.com/compendium/spells/conjure-elemental2022-10-19https://harmlesskey.com/compendium/spells/conjure-fey2022-10-19https://harmlesskey.com/compendium/spells/conjure-minor-elementals2022-10-19https://harmlesskey.com/compendium/spells/conjure-woodland-beings2022-10-19https://harmlesskey.com/compendium/spells/contact-other-plane2022-10-19https://harmlesskey.com/compendium/spells/contagion2022-10-19https://harmlesskey.com/compendium/spells/contingency2022-10-19https://harmlesskey.com/compendium/spells/continual-flame2022-10-19https://harmlesskey.com/compendium/spells/control-water2022-10-19https://harmlesskey.com/compendium/spells/control-weather2022-10-19https://harmlesskey.com/compendium/spells/counterspell2022-10-19https://harmlesskey.com/compendium/spells/create-food-and-water2022-10-19https://harmlesskey.com/compendium/spells/create-undead2022-10-19https://harmlesskey.com/compendium/spells/create-or-destroy-water2022-10-19https://harmlesskey.com/compendium/spells/creation2022-10-19https://harmlesskey.com/compendium/spells/cure-wounds2022-10-19https://harmlesskey.com/compendium/spells/dancing-lights2022-10-19https://harmlesskey.com/compendium/spells/darkness2022-10-19https://harmlesskey.com/compendium/spells/darkvision2022-10-19https://harmlesskey.com/compendium/spells/daylight2022-10-19https://harmlesskey.com/compendium/spells/death-ward2022-10-19https://harmlesskey.com/compendium/spells/delayed-blast-fireball2022-10-19https://harmlesskey.com/compendium/spells/demiplane2022-10-19https://harmlesskey.com/compendium/spells/detect-evil-and-good2022-10-19https://harmlesskey.com/compendium/spells/detect-magic2022-10-19https://harmlesskey.com/compendium/spells/detect-poison-and-disease2022-10-19https://harmlesskey.com/compendium/spells/detect-thoughts2022-10-19https://harmlesskey.com/compendium/spells/dimension-door2022-10-19https://harmlesskey.com/compendium/spells/disguise-self2022-10-19https://harmlesskey.com/compendium/spells/disintegrate2022-10-19https://harmlesskey.com/compendium/spells/dispel-evil-and-good2022-10-19https://harmlesskey.com/compendium/spells/dispel-magic2022-10-19https://harmlesskey.com/compendium/spells/divination2022-10-19https://harmlesskey.com/compendium/spells/divine-favor2022-10-19https://harmlesskey.com/compendium/spells/divine-word2022-10-19https://harmlesskey.com/compendium/spells/dominate-beast2022-10-19https://harmlesskey.com/compendium/spells/dominate-monster2022-10-19https://harmlesskey.com/compendium/spells/dominate-person2022-10-19https://harmlesskey.com/compendium/spells/dream2022-10-19https://harmlesskey.com/compendium/spells/druidcraft2022-10-19https://harmlesskey.com/compendium/spells/earthquake2022-10-19https://harmlesskey.com/compendium/spells/eldritch-blast2022-10-19https://harmlesskey.com/compendium/spells/enhance-ability2022-10-19https://harmlesskey.com/compendium/spells/enlarge-reduce2022-10-19https://harmlesskey.com/compendium/spells/entangle2022-10-19https://harmlesskey.com/compendium/spells/enthrall2022-10-19https://harmlesskey.com/compendium/spells/etherealness2022-10-19https://harmlesskey.com/compendium/spells/expeditious-retreat2022-10-19https://harmlesskey.com/compendium/spells/eyebite2022-10-19https://harmlesskey.com/compendium/spells/fabricate2022-10-19https://harmlesskey.com/compendium/spells/faerie-fire2022-10-19https://harmlesskey.com/compendium/spells/faithful-hound2022-10-19https://harmlesskey.com/compendium/spells/false-life2022-10-19https://harmlesskey.com/compendium/spells/fear2022-10-19https://harmlesskey.com/compendium/spells/feather-fall2022-10-19https://harmlesskey.com/compendium/spells/feeblemind2022-10-19https://harmlesskey.com/compendium/spells/find-familiar2022-10-19https://harmlesskey.com/compendium/spells/find-steed2022-10-19https://harmlesskey.com/compendium/spells/find-traps2022-10-19https://harmlesskey.com/compendium/spells/find-the-path2022-10-19https://harmlesskey.com/compendium/spells/finger-of-death2022-10-19https://harmlesskey.com/compendium/spells/fire-bolt2022-10-19https://harmlesskey.com/compendium/spells/fire-shield2022-10-19https://harmlesskey.com/compendium/spells/fire-storm2022-10-19https://harmlesskey.com/compendium/spells/fireball2022-10-19https://harmlesskey.com/compendium/spells/flame-blade2022-10-19https://harmlesskey.com/compendium/spells/flame-strike2022-10-19https://harmlesskey.com/compendium/spells/flaming-sphere2022-10-19https://harmlesskey.com/compendium/spells/flesh-to-stone2022-10-19https://harmlesskey.com/compendium/spells/floating-disk2022-10-19https://harmlesskey.com/compendium/spells/fly2022-10-19https://harmlesskey.com/compendium/spells/fog-cloud2022-10-19https://harmlesskey.com/compendium/spells/forbiddance2022-10-19https://harmlesskey.com/compendium/spells/forcecage2022-10-19https://harmlesskey.com/compendium/spells/foresight2022-10-19https://harmlesskey.com/compendium/spells/freedom-of-movement2022-10-19https://harmlesskey.com/compendium/spells/freezing-sphere2022-10-19https://harmlesskey.com/compendium/spells/gaseous-form2022-10-19https://harmlesskey.com/compendium/spells/gate2022-10-19https://harmlesskey.com/compendium/spells/geas2022-10-19https://harmlesskey.com/compendium/spells/gentle-repose2022-10-19https://harmlesskey.com/compendium/spells/giant-insect2022-10-19https://harmlesskey.com/compendium/spells/glibness2022-10-19https://harmlesskey.com/compendium/spells/globe-of-invulnerability2022-10-19https://harmlesskey.com/compendium/spells/glyph-of-warding2022-10-19https://harmlesskey.com/compendium/spells/goodberry2022-10-19https://harmlesskey.com/compendium/spells/grease2022-10-19https://harmlesskey.com/compendium/spells/greater-invisibility2022-10-19https://harmlesskey.com/compendium/spells/greater-restoration2022-10-19https://harmlesskey.com/compendium/spells/guardian-of-faith2022-10-19https://harmlesskey.com/compendium/spells/guards-and-wards2022-10-19https://harmlesskey.com/compendium/spells/guidance2022-10-19https://harmlesskey.com/compendium/spells/guiding-bolt2022-10-19https://harmlesskey.com/compendium/spells/gust-of-wind2022-10-19https://harmlesskey.com/compendium/spells/hallow2022-10-19https://harmlesskey.com/compendium/spells/hallucinatory-terrain2022-10-19https://harmlesskey.com/compendium/spells/harm2022-10-19https://harmlesskey.com/compendium/spells/haste2022-10-19https://harmlesskey.com/compendium/spells/heal2022-10-19https://harmlesskey.com/compendium/spells/healing-word2022-10-19https://harmlesskey.com/compendium/spells/heat-metal2022-10-19https://harmlesskey.com/compendium/spells/hellish-rebuke2022-10-19https://harmlesskey.com/compendium/spells/heroes-feast2022-10-19https://harmlesskey.com/compendium/spells/heroism2022-10-19https://harmlesskey.com/compendium/spells/hideous-laughter2022-10-19https://harmlesskey.com/compendium/spells/hold-monster2022-10-19https://harmlesskey.com/compendium/spells/hold-person2022-10-19https://harmlesskey.com/compendium/spells/holy-aura2022-10-19https://harmlesskey.com/compendium/spells/hunters-mark2022-10-19https://harmlesskey.com/compendium/spells/hypnotic-pattern2022-10-19https://harmlesskey.com/compendium/spells/ice-storm2022-10-19https://harmlesskey.com/compendium/spells/identify2022-10-19https://harmlesskey.com/compendium/spells/illusory-script2022-10-19https://harmlesskey.com/compendium/spells/imprisonment2022-10-19https://harmlesskey.com/compendium/spells/incendiary-cloud2022-10-19https://harmlesskey.com/compendium/spells/inflict-wounds2022-10-19https://harmlesskey.com/compendium/spells/insect-plague2022-10-19https://harmlesskey.com/compendium/spells/instant-summons2022-10-19https://harmlesskey.com/compendium/spells/invisibility2022-10-19https://harmlesskey.com/compendium/spells/irresistible-dance2022-10-19https://harmlesskey.com/compendium/spells/jump2022-10-19https://harmlesskey.com/compendium/spells/knock2022-10-19https://harmlesskey.com/compendium/spells/legend-lore2022-10-19https://harmlesskey.com/compendium/spells/lesser-restoration2022-10-19https://harmlesskey.com/compendium/spells/levitate2022-10-19https://harmlesskey.com/compendium/spells/light2022-10-19https://harmlesskey.com/compendium/spells/lightning-bolt2022-10-19https://harmlesskey.com/compendium/spells/locate-animals-or-plants2022-10-19https://harmlesskey.com/compendium/spells/locate-creature2022-10-19https://harmlesskey.com/compendium/spells/locate-object2022-10-19https://harmlesskey.com/compendium/spells/longstrider2022-10-19https://harmlesskey.com/compendium/spells/mage-armor2022-10-19https://harmlesskey.com/compendium/spells/mage-hand2022-10-19https://harmlesskey.com/compendium/spells/magic-circle2022-10-19https://harmlesskey.com/compendium/spells/magic-jar2022-10-19https://harmlesskey.com/compendium/spells/magic-missile2022-10-19https://harmlesskey.com/compendium/spells/magic-mouth2022-10-19https://harmlesskey.com/compendium/spells/magic-weapon2022-10-19https://harmlesskey.com/compendium/spells/magnificent-mansion2022-10-19https://harmlesskey.com/compendium/spells/major-image2022-10-19https://harmlesskey.com/compendium/spells/mass-cure-wounds2022-10-19https://harmlesskey.com/compendium/spells/mass-heal2022-10-19https://harmlesskey.com/compendium/spells/mass-healing-word2022-10-19https://harmlesskey.com/compendium/spells/mass-suggestion2022-10-19https://harmlesskey.com/compendium/spells/maze2022-10-19https://harmlesskey.com/compendium/spells/meld-into-stone2022-10-19https://harmlesskey.com/compendium/spells/mending2022-10-19https://harmlesskey.com/compendium/spells/message2022-10-19https://harmlesskey.com/compendium/spells/meteor-swarm2022-10-19https://harmlesskey.com/compendium/spells/mind-blank2022-10-19https://harmlesskey.com/compendium/spells/minor-illusion2022-10-19https://harmlesskey.com/compendium/spells/mirage-arcane2022-10-19https://harmlesskey.com/compendium/spells/mirror-image2022-10-19https://harmlesskey.com/compendium/spells/mislead2022-10-19https://harmlesskey.com/compendium/spells/misty-step2022-10-19https://harmlesskey.com/compendium/spells/modify-memory2022-10-19https://harmlesskey.com/compendium/spells/moonbeam2022-10-19https://harmlesskey.com/compendium/spells/move-earth2022-10-19https://harmlesskey.com/compendium/spells/nondetection2022-10-19https://harmlesskey.com/compendium/spells/pass-without-trace2022-10-19https://harmlesskey.com/compendium/spells/passwall2022-10-19https://harmlesskey.com/compendium/spells/phantasmal-killer2022-10-19https://harmlesskey.com/compendium/spells/phantom-steed2022-10-19https://harmlesskey.com/compendium/spells/planar-ally2022-10-19https://harmlesskey.com/compendium/spells/planar-binding2022-10-19https://harmlesskey.com/compendium/spells/plane-shift2022-10-19https://harmlesskey.com/compendium/spells/plant-growth2022-10-19https://harmlesskey.com/compendium/spells/poison-spray2022-10-19https://harmlesskey.com/compendium/spells/polymorph2022-10-19https://harmlesskey.com/compendium/spells/power-word-kill2022-10-19https://harmlesskey.com/compendium/spells/power-word-stun2022-10-19https://harmlesskey.com/compendium/spells/prayer-of-healing2022-10-19https://harmlesskey.com/compendium/spells/prestidigitation2022-10-19https://harmlesskey.com/compendium/spells/prismatic-spray2022-10-19https://harmlesskey.com/compendium/spells/prismatic-wall2022-10-19https://harmlesskey.com/compendium/spells/private-sanctum2022-10-19https://harmlesskey.com/compendium/spells/produce-flame2022-10-19https://harmlesskey.com/compendium/spells/programmed-illusion2022-10-19https://harmlesskey.com/compendium/spells/project-image2022-10-19https://harmlesskey.com/compendium/spells/protection-from-energy2022-10-19https://harmlesskey.com/compendium/spells/protection-from-evil-and-good2022-10-19https://harmlesskey.com/compendium/spells/protection-from-poison2022-10-19https://harmlesskey.com/compendium/spells/purify-food-and-drink2022-10-19https://harmlesskey.com/compendium/spells/raise-dead2022-10-19https://harmlesskey.com/compendium/spells/ray-of-enfeeblement2022-10-19https://harmlesskey.com/compendium/spells/ray-of-frost2022-10-19https://harmlesskey.com/compendium/spells/regenerate2022-10-19https://harmlesskey.com/compendium/spells/reincarnate2022-10-19https://harmlesskey.com/compendium/spells/remove-curse2022-10-19https://harmlesskey.com/compendium/spells/resilient-sphere2022-10-19https://harmlesskey.com/compendium/spells/resistance2022-10-19https://harmlesskey.com/compendium/spells/resurrection2022-10-19https://harmlesskey.com/compendium/spells/reverse-gravity2022-10-19https://harmlesskey.com/compendium/spells/revivify2022-10-19https://harmlesskey.com/compendium/spells/rope-trick2022-10-19https://harmlesskey.com/compendium/spells/sacred-flame2022-10-19https://harmlesskey.com/compendium/spells/sanctuary2022-10-19https://harmlesskey.com/compendium/spells/scorching-ray2022-10-19https://harmlesskey.com/compendium/spells/scrying2022-10-19https://harmlesskey.com/compendium/spells/secret-chest2022-10-19https://harmlesskey.com/compendium/spells/see-invisibility2022-10-19https://harmlesskey.com/compendium/spells/seeming2022-10-19https://harmlesskey.com/compendium/spells/sending2022-10-19https://harmlesskey.com/compendium/spells/sequester2022-10-19https://harmlesskey.com/compendium/spells/shapechange2022-10-19https://harmlesskey.com/compendium/spells/shatter2022-10-19https://harmlesskey.com/compendium/spells/shield2022-10-19https://harmlesskey.com/compendium/spells/shield-of-faith2022-10-19https://harmlesskey.com/compendium/spells/shillelagh2022-10-19https://harmlesskey.com/compendium/spells/shocking-grasp2022-10-19https://harmlesskey.com/compendium/spells/silence2022-10-19https://harmlesskey.com/compendium/spells/silent-image2022-10-19https://harmlesskey.com/compendium/spells/simulacrum2022-10-19https://harmlesskey.com/compendium/spells/sleep2022-10-19https://harmlesskey.com/compendium/spells/sleet-storm2022-10-19https://harmlesskey.com/compendium/spells/slow2022-10-19https://harmlesskey.com/compendium/spells/spare-the-dying2022-10-19https://harmlesskey.com/compendium/spells/speak-with-animals2022-10-19https://harmlesskey.com/compendium/spells/speak-with-dead2022-10-19https://harmlesskey.com/compendium/spells/speak-with-plants2022-10-19https://harmlesskey.com/compendium/spells/spider-climb2022-10-19https://harmlesskey.com/compendium/spells/spike-growth2022-10-19https://harmlesskey.com/compendium/spells/spirit-guardians2022-10-19https://harmlesskey.com/compendium/spells/spiritual-weapon2022-10-19https://harmlesskey.com/compendium/spells/stinking-cloud2022-10-19https://harmlesskey.com/compendium/spells/stone-shape2022-10-19https://harmlesskey.com/compendium/spells/stoneskin2022-10-19https://harmlesskey.com/compendium/spells/storm-of-vengeance2022-10-19https://harmlesskey.com/compendium/spells/suggestion2022-10-19https://harmlesskey.com/compendium/spells/sunbeam2022-10-19https://harmlesskey.com/compendium/spells/sunburst2022-10-19https://harmlesskey.com/compendium/spells/symbol2022-10-19https://harmlesskey.com/compendium/spells/telekinesis2022-10-19https://harmlesskey.com/compendium/spells/telepathic-bond2022-10-19https://harmlesskey.com/compendium/spells/teleport2022-10-19https://harmlesskey.com/compendium/spells/teleportation-circle2022-10-19https://harmlesskey.com/compendium/spells/thaumaturgy2022-10-19https://harmlesskey.com/compendium/spells/thunderwave2022-10-19https://harmlesskey.com/compendium/spells/time-stop2022-10-19https://harmlesskey.com/compendium/spells/tiny-hut2022-10-19https://harmlesskey.com/compendium/spells/tongues2022-10-19https://harmlesskey.com/compendium/spells/transport-via-plants2022-10-19https://harmlesskey.com/compendium/spells/tree-stride2022-10-19https://harmlesskey.com/compendium/spells/true-polymorph2022-10-19https://harmlesskey.com/compendium/spells/true-resurrection2022-10-19https://harmlesskey.com/compendium/spells/true-seeing2022-10-19https://harmlesskey.com/compendium/spells/true-strike2022-10-19https://harmlesskey.com/compendium/spells/unseen-servant2022-10-19https://harmlesskey.com/compendium/spells/vampiric-touch2022-10-19https://harmlesskey.com/compendium/spells/vicious-mockery2022-10-19https://harmlesskey.com/compendium/spells/wall-of-fire2022-10-19https://harmlesskey.com/compendium/spells/wall-of-force2022-10-19https://harmlesskey.com/compendium/spells/wall-of-ice2022-10-19https://harmlesskey.com/compendium/spells/wall-of-stone2022-10-19https://harmlesskey.com/compendium/spells/wall-of-thorns2022-10-19https://harmlesskey.com/compendium/spells/warding-bond2022-10-19https://harmlesskey.com/compendium/spells/water-breathing2022-10-19https://harmlesskey.com/compendium/spells/water-walk2022-10-19https://harmlesskey.com/compendium/spells/web2022-10-19https://harmlesskey.com/compendium/spells/weird2022-10-19https://harmlesskey.com/compendium/spells/wind-walk2022-10-19https://harmlesskey.com/compendium/spells/wind-wall2022-10-19https://harmlesskey.com/compendium/spells/wish2022-10-19https://harmlesskey.com/compendium/spells/word-of-recall2022-10-19https://harmlesskey.com/compendium/spells/zone-of-truth2022-10-19 +https://harmlesskey.com2023-03-11https://harmlesskey.com/demo2023-03-11https://harmlesskey.com/documentation2023-03-11https://harmlesskey.com/about-us2023-03-11https://harmlesskey.com/sign-up2023-03-11https://harmlesskey.com/sign-in2023-03-11https://harmlesskey.com/privacy-policy2023-03-11https://harmlesskey.com/changelog2023-03-11https://harmlesskey.com/feedback2023-03-11https://harmlesskey.com/patreon2023-03-11https://harmlesskey.com/compendium2023-03-11https://harmlesskey.com/compendium/conditions2023-03-11https://harmlesskey.com/compendium/monsters2023-03-11https://harmlesskey.com/compendium/spells2023-03-11https://harmlesskey.com/compendium/items2023-03-11https://harmlesskey.com/tools2023-03-11https://harmlesskey.com/tools/combat-tracker2023-03-11https://harmlesskey.com/tools/encounter-builder2023-03-11https://harmlesskey.com/tools/encounter-builder/build-encounter2023-03-11https://harmlesskey.com/tools/monster-creator2023-03-11https://harmlesskey.com/tools/monster-creator/create-monster2023-03-11https://harmlesskey.com/tools/spell-creator2023-03-11https://harmlesskey.com/tools/spell-creator/create-spell2023-03-11https://harmlesskey.com/tools/character-builder2023-03-11https://harmlesskey.com/compendium/conditions/blinded2023-03-11https://harmlesskey.com/compendium/conditions/charmed2023-03-11https://harmlesskey.com/compendium/conditions/deafened2023-03-11https://harmlesskey.com/compendium/conditions/exhaustion2023-03-11https://harmlesskey.com/compendium/conditions/frightened2023-03-11https://harmlesskey.com/compendium/conditions/grappled2023-03-11https://harmlesskey.com/compendium/conditions/incapacitated2023-03-11https://harmlesskey.com/compendium/conditions/invisible2023-03-11https://harmlesskey.com/compendium/conditions/paralyzed2023-03-11https://harmlesskey.com/compendium/conditions/petrified2023-03-11https://harmlesskey.com/compendium/conditions/poisoned2023-03-11https://harmlesskey.com/compendium/conditions/prone2023-03-11https://harmlesskey.com/compendium/conditions/restrained2023-03-11https://harmlesskey.com/compendium/conditions/stunned2023-03-11https://harmlesskey.com/compendium/conditions/unconscious2023-03-11https://harmlesskey.com/compendium/items/adamantine-armor2023-03-11https://harmlesskey.com/compendium/items/amulet-of-health2023-03-11https://harmlesskey.com/compendium/items/amulet-of-proof-against-detection-and-location2023-03-11https://harmlesskey.com/compendium/items/amulet-of-the-planes2023-03-11https://harmlesskey.com/compendium/items/animated-shield2023-03-11https://harmlesskey.com/compendium/items/apparatus-of-the-crab2023-03-11https://harmlesskey.com/compendium/items/armor-of-invulnerability2023-03-11https://harmlesskey.com/compendium/items/armor-of-resistance2023-03-11https://harmlesskey.com/compendium/items/armor-of-vulnerability2023-03-11https://harmlesskey.com/compendium/items/arrow-of-slaying2023-03-11https://harmlesskey.com/compendium/items/arrow-catching-shield2023-03-11https://harmlesskey.com/compendium/items/bag-of-beans2023-03-11https://harmlesskey.com/compendium/items/bag-of-devouring2023-03-11https://harmlesskey.com/compendium/items/bag-of-holding2023-03-11https://harmlesskey.com/compendium/items/bag-of-tricks2023-03-11https://harmlesskey.com/compendium/items/bead-of-force2023-03-11https://harmlesskey.com/compendium/items/belt-of-dwarvenkind2023-03-11https://harmlesskey.com/compendium/items/belt-of-giant-strength2023-03-11https://harmlesskey.com/compendium/items/berserker-axe2023-03-11https://harmlesskey.com/compendium/items/boots-of-elvenkind2023-03-11https://harmlesskey.com/compendium/items/boots-of-levitation2023-03-11https://harmlesskey.com/compendium/items/boots-of-speed2023-03-11https://harmlesskey.com/compendium/items/boots-of-striding-and-springing2023-03-11https://harmlesskey.com/compendium/items/boots-of-the-winterlands2023-03-11https://harmlesskey.com/compendium/items/bowl-of-commanding-water-elementals2023-03-11https://harmlesskey.com/compendium/items/bracers-of-archery2023-03-11https://harmlesskey.com/compendium/items/bracers-of-defense2023-03-11https://harmlesskey.com/compendium/items/brazier-of-commanding-fire-elementals2023-03-11https://harmlesskey.com/compendium/items/brooch-of-shielding2023-03-11https://harmlesskey.com/compendium/items/broom-of-flying2023-03-11https://harmlesskey.com/compendium/items/candle-of-invocation2023-03-11https://harmlesskey.com/compendium/items/cape-of-the-mountebank2023-03-11https://harmlesskey.com/compendium/items/carpet-of-flying2023-03-11https://harmlesskey.com/compendium/items/censer-of-controlling-air-elementals2023-03-11https://harmlesskey.com/compendium/items/chime-of-opening2023-03-11https://harmlesskey.com/compendium/items/circlet-of-blasting2023-03-11https://harmlesskey.com/compendium/items/cloak-of-arachnida2023-03-11https://harmlesskey.com/compendium/items/cloak-of-displacement2023-03-11https://harmlesskey.com/compendium/items/cloak-of-elvenkind2023-03-11https://harmlesskey.com/compendium/items/cloak-of-protection2023-03-11https://harmlesskey.com/compendium/items/cloak-of-the-bat2023-03-11https://harmlesskey.com/compendium/items/cloak-of-the-manta-ray2023-03-11https://harmlesskey.com/compendium/items/crystal-ball2023-03-11https://harmlesskey.com/compendium/items/cube-of-force2023-03-11https://harmlesskey.com/compendium/items/cubic-gate2023-03-11https://harmlesskey.com/compendium/items/dagger-of-venom2023-03-11https://harmlesskey.com/compendium/items/dancing-sword2023-03-11https://harmlesskey.com/compendium/items/decanter-of-endless-water2023-03-11https://harmlesskey.com/compendium/items/deck-of-illusions2023-03-11https://harmlesskey.com/compendium/items/deck-of-many-things2023-03-11https://harmlesskey.com/compendium/items/defender2023-03-11https://harmlesskey.com/compendium/items/demon-armor2023-03-11https://harmlesskey.com/compendium/items/dimensional-shackles2023-03-11https://harmlesskey.com/compendium/items/dragon-scale-mail2023-03-11https://harmlesskey.com/compendium/items/dragon-slayer2023-03-11https://harmlesskey.com/compendium/items/dust-of-disappearance2023-03-11https://harmlesskey.com/compendium/items/dust-of-dryness2023-03-11https://harmlesskey.com/compendium/items/dust-of-sneezing-and-choking2023-03-11https://harmlesskey.com/compendium/items/dwarven-plate2023-03-11https://harmlesskey.com/compendium/items/dwarven-thrower2023-03-11https://harmlesskey.com/compendium/items/efficient-quiver2023-03-11https://harmlesskey.com/compendium/items/efreeti-bottle2023-03-11https://harmlesskey.com/compendium/items/elemental-gem2023-03-11https://harmlesskey.com/compendium/items/elven-chain2023-03-11https://harmlesskey.com/compendium/items/eversmoking-bottle2023-03-11https://harmlesskey.com/compendium/items/eyes-of-charming2023-03-11https://harmlesskey.com/compendium/items/eyes-of-minute-seeing2023-03-11https://harmlesskey.com/compendium/items/eyes-of-the-eagle2023-03-11https://harmlesskey.com/compendium/items/figurine-of-wondrous-power2023-03-11https://harmlesskey.com/compendium/items/flame-tongue2023-03-11https://harmlesskey.com/compendium/items/folding-boat2023-03-11https://harmlesskey.com/compendium/items/frost-brand2023-03-11https://harmlesskey.com/compendium/items/gauntlets-of-ogre-power2023-03-11https://harmlesskey.com/compendium/items/gem-of-brightness2023-03-11https://harmlesskey.com/compendium/items/gem-of-seeing2023-03-11https://harmlesskey.com/compendium/items/giant-slayer2023-03-11https://harmlesskey.com/compendium/items/glamoured-studded-leather2023-03-11https://harmlesskey.com/compendium/items/gloves-of-missile-snaring2023-03-11https://harmlesskey.com/compendium/items/gloves-of-swimming-and-climbing2023-03-11https://harmlesskey.com/compendium/items/goggles-of-night2023-03-11https://harmlesskey.com/compendium/items/hammer-of-thunderbolts2023-03-11https://harmlesskey.com/compendium/items/handy-haversack2023-03-11https://harmlesskey.com/compendium/items/hat-of-disguise2023-03-11https://harmlesskey.com/compendium/items/headband-of-intellect2023-03-11https://harmlesskey.com/compendium/items/helm-of-brilliance2023-03-11https://harmlesskey.com/compendium/items/helm-of-comprehending-languages2023-03-11https://harmlesskey.com/compendium/items/helm-of-telepathy2023-03-11https://harmlesskey.com/compendium/items/helm-of-teleportation2023-03-11https://harmlesskey.com/compendium/items/holy-avenger2023-03-11https://harmlesskey.com/compendium/items/horn-of-blasting2023-03-11https://harmlesskey.com/compendium/items/horn-of-valhalla2023-03-11https://harmlesskey.com/compendium/items/horseshoes-of-speed2023-03-11https://harmlesskey.com/compendium/items/horseshoes-of-a-zephyr2023-03-11https://harmlesskey.com/compendium/items/immovable-rod2023-03-11https://harmlesskey.com/compendium/items/instant-fortress2023-03-11https://harmlesskey.com/compendium/items/ioun-stone2023-03-11https://harmlesskey.com/compendium/items/iron-bands-of-binding2023-03-11https://harmlesskey.com/compendium/items/iron-flask2023-03-11https://harmlesskey.com/compendium/items/javelin-of-lightning2023-03-11https://harmlesskey.com/compendium/items/lantern-of-revealing2023-03-11https://harmlesskey.com/compendium/items/luck-blade2023-03-11https://harmlesskey.com/compendium/items/mace-of-disruption2023-03-11https://harmlesskey.com/compendium/items/mace-of-smiting2023-03-11https://harmlesskey.com/compendium/items/mace-of-terror2023-03-11https://harmlesskey.com/compendium/items/mantle-of-spell-resistance2023-03-11https://harmlesskey.com/compendium/items/manual-of-bodily-health2023-03-11https://harmlesskey.com/compendium/items/manual-of-gainful-exercise2023-03-11https://harmlesskey.com/compendium/items/manual-of-golems2023-03-11https://harmlesskey.com/compendium/items/manual-of-quickness-of-action2023-03-11https://harmlesskey.com/compendium/items/marvelous-pigments2023-03-11https://harmlesskey.com/compendium/items/medallion-of-thoughts2023-03-11https://harmlesskey.com/compendium/items/mirror-of-life-trapping2023-03-11https://harmlesskey.com/compendium/items/mithral-armor2023-03-11https://harmlesskey.com/compendium/items/necklace-of-adaptation2023-03-11https://harmlesskey.com/compendium/items/necklace-of-fireballs2023-03-11https://harmlesskey.com/compendium/items/necklace-of-prayer-beads2023-03-11https://harmlesskey.com/compendium/items/nine-lives-stealer2023-03-11https://harmlesskey.com/compendium/items/oathbow2023-03-11https://harmlesskey.com/compendium/items/oil-of-etherealness2023-03-11https://harmlesskey.com/compendium/items/oil-of-sharpness2023-03-11https://harmlesskey.com/compendium/items/oil-of-slipperiness2023-03-11https://harmlesskey.com/compendium/items/orb-of-dragonkind2023-03-11https://harmlesskey.com/compendium/items/pearl-of-power2023-03-11https://harmlesskey.com/compendium/items/periapt-of-health2023-03-11https://harmlesskey.com/compendium/items/periapt-of-proof-against-poison2023-03-11https://harmlesskey.com/compendium/items/periapt-of-wound-closure2023-03-11https://harmlesskey.com/compendium/items/philter-of-love2023-03-11https://harmlesskey.com/compendium/items/pipes-of-haunting2023-03-11https://harmlesskey.com/compendium/items/pipes-of-the-sewers2023-03-11https://harmlesskey.com/compendium/items/plate-armor-of-etherealness2023-03-11https://harmlesskey.com/compendium/items/portable-hole2023-03-11https://harmlesskey.com/compendium/items/potion-of-animal-friendship2023-03-11https://harmlesskey.com/compendium/items/potion-of-clairvoyance2023-03-11https://harmlesskey.com/compendium/items/potion-of-climbing2023-03-11https://harmlesskey.com/compendium/items/potion-of-diminution2023-03-11https://harmlesskey.com/compendium/items/potion-of-flying2023-03-11https://harmlesskey.com/compendium/items/potion-of-gaseous-form2023-03-11https://harmlesskey.com/compendium/items/potion-of-giant-strength2023-03-11https://harmlesskey.com/compendium/items/potion-of-growth2023-03-11https://harmlesskey.com/compendium/items/potion-of-healing2023-03-11https://harmlesskey.com/compendium/items/potion-of-heroism2023-03-11https://harmlesskey.com/compendium/items/potion-of-invisibility2023-03-11https://harmlesskey.com/compendium/items/potion-of-mind-reading2023-03-11https://harmlesskey.com/compendium/items/potion-of-poison2023-03-11https://harmlesskey.com/compendium/items/potion-of-resistance2023-03-11https://harmlesskey.com/compendium/items/potion-of-speed2023-03-11https://harmlesskey.com/compendium/items/potion-of-water-breathing2023-03-11https://harmlesskey.com/compendium/items/quaals-feather-token2023-03-11https://harmlesskey.com/compendium/items/restorative-ointment2023-03-11https://harmlesskey.com/compendium/items/ring-of-animal-influence2023-03-11https://harmlesskey.com/compendium/items/ring-of-djinni-summoning2023-03-11https://harmlesskey.com/compendium/items/ring-of-elemental-command2023-03-11https://harmlesskey.com/compendium/items/ring-of-evasion2023-03-11https://harmlesskey.com/compendium/items/ring-of-feather-falling2023-03-11https://harmlesskey.com/compendium/items/ring-of-free-action2023-03-11https://harmlesskey.com/compendium/items/ring-of-invisibility2023-03-11https://harmlesskey.com/compendium/items/ring-of-jumping2023-03-11https://harmlesskey.com/compendium/items/ring-of-mind-shielding2023-03-11https://harmlesskey.com/compendium/items/ring-of-protection2023-03-11https://harmlesskey.com/compendium/items/ring-of-regeneration2023-03-11https://harmlesskey.com/compendium/items/ring-of-resistance2023-03-11https://harmlesskey.com/compendium/items/ring-of-shooting-stars2023-03-11https://harmlesskey.com/compendium/items/ring-of-spell-storing2023-03-11https://harmlesskey.com/compendium/items/ring-of-spell-turning2023-03-11https://harmlesskey.com/compendium/items/ring-of-swimming2023-03-11https://harmlesskey.com/compendium/items/ring-of-telekinesis2023-03-11https://harmlesskey.com/compendium/items/ring-of-three-wishes2023-03-11https://harmlesskey.com/compendium/items/ring-of-warmth2023-03-11https://harmlesskey.com/compendium/items/ring-of-water-walking2023-03-11https://harmlesskey.com/compendium/items/ring-of-x-ray-vision2023-03-11https://harmlesskey.com/compendium/items/ring-of-the-ram2023-03-11https://harmlesskey.com/compendium/items/robe-of-eyes2023-03-11https://harmlesskey.com/compendium/items/robe-of-scintillating-colors2023-03-11https://harmlesskey.com/compendium/items/robe-of-stars2023-03-11https://harmlesskey.com/compendium/items/robe-of-useful-items2023-03-11https://harmlesskey.com/compendium/items/robe-of-the-archmagi2023-03-11https://harmlesskey.com/compendium/items/rod-of-absorption2023-03-11https://harmlesskey.com/compendium/items/rod-of-alertness2023-03-11https://harmlesskey.com/compendium/items/rod-of-lordly-might2023-03-11https://harmlesskey.com/compendium/items/rod-of-rulership2023-03-11https://harmlesskey.com/compendium/items/rod-of-security2023-03-11https://harmlesskey.com/compendium/items/rope-of-climbing2023-03-11https://harmlesskey.com/compendium/items/rope-of-entanglement2023-03-11https://harmlesskey.com/compendium/items/scarab-of-protection2023-03-11https://harmlesskey.com/compendium/items/scimitar-of-speed2023-03-11https://harmlesskey.com/compendium/items/shield-of-missile-attraction2023-03-11https://harmlesskey.com/compendium/items/slippers-of-spider-climbing2023-03-11https://harmlesskey.com/compendium/items/sovereign-glue2023-03-11https://harmlesskey.com/compendium/items/spell-scroll2023-03-11https://harmlesskey.com/compendium/items/spellguard-shield2023-03-11https://harmlesskey.com/compendium/items/sphere-of-annihilation2023-03-11https://harmlesskey.com/compendium/items/staff-of-charming2023-03-11https://harmlesskey.com/compendium/items/staff-of-fire2023-03-11https://harmlesskey.com/compendium/items/staff-of-frost2023-03-11https://harmlesskey.com/compendium/items/staff-of-healing2023-03-11https://harmlesskey.com/compendium/items/staff-of-power2023-03-11https://harmlesskey.com/compendium/items/staff-of-striking2023-03-11https://harmlesskey.com/compendium/items/staff-of-swarming-insects2023-03-11https://harmlesskey.com/compendium/items/staff-of-thunder-and-lightning2023-03-11https://harmlesskey.com/compendium/items/staff-of-withering2023-03-11https://harmlesskey.com/compendium/items/staff-of-the-magi2023-03-11https://harmlesskey.com/compendium/items/staff-of-the-python2023-03-11https://harmlesskey.com/compendium/items/staff-of-the-woodlands2023-03-11https://harmlesskey.com/compendium/items/stone-of-controlling-earth-elementals2023-03-11https://harmlesskey.com/compendium/items/stone-of-good-luck-luckstone2023-03-11https://harmlesskey.com/compendium/items/sun-blade2023-03-11https://harmlesskey.com/compendium/items/sword-of-life-stealing2023-03-11https://harmlesskey.com/compendium/items/sword-of-sharpness2023-03-11https://harmlesskey.com/compendium/items/sword-of-wounding2023-03-11https://harmlesskey.com/compendium/items/talisman-of-pure-good2023-03-11https://harmlesskey.com/compendium/items/talisman-of-ultimate-evil2023-03-11https://harmlesskey.com/compendium/items/talisman-of-the-sphere2023-03-11https://harmlesskey.com/compendium/items/tome-of-clear-thought2023-03-11https://harmlesskey.com/compendium/items/tome-of-leadership-and-influence2023-03-11https://harmlesskey.com/compendium/items/tome-of-understanding2023-03-11https://harmlesskey.com/compendium/items/trident-of-fish-command2023-03-11https://harmlesskey.com/compendium/items/universal-solvent2023-03-11https://harmlesskey.com/compendium/items/vicious-weapon2023-03-11https://harmlesskey.com/compendium/items/vorpal-sword2023-03-11https://harmlesskey.com/compendium/items/wand-of-binding2023-03-11https://harmlesskey.com/compendium/items/wand-of-enemy-detection2023-03-11https://harmlesskey.com/compendium/items/wand-of-fear2023-03-11https://harmlesskey.com/compendium/items/wand-of-fireballs2023-03-11https://harmlesskey.com/compendium/items/wand-of-lightning-bolts2023-03-11https://harmlesskey.com/compendium/items/wand-of-magic-detection2023-03-11https://harmlesskey.com/compendium/items/wand-of-magic-missiles2023-03-11https://harmlesskey.com/compendium/items/wand-of-paralysis2023-03-11https://harmlesskey.com/compendium/items/wand-of-polymorph2023-03-11https://harmlesskey.com/compendium/items/wand-of-secrets2023-03-11https://harmlesskey.com/compendium/items/wand-of-web2023-03-11https://harmlesskey.com/compendium/items/wand-of-wonder2023-03-11https://harmlesskey.com/compendium/items/wand-of-the-war-mage2023-03-11https://harmlesskey.com/compendium/items/weapon2023-03-11https://harmlesskey.com/compendium/items/well-of-many-worlds2023-03-11https://harmlesskey.com/compendium/items/wind-fan2023-03-11https://harmlesskey.com/compendium/items/winged-boots2023-03-11https://harmlesskey.com/compendium/items/wings-of-flying2023-03-11https://harmlesskey.com/compendium/monsters/aboleth2023-03-11https://harmlesskey.com/compendium/monsters/acolyte2023-03-11https://harmlesskey.com/compendium/monsters/adult-black-dragon2023-03-11https://harmlesskey.com/compendium/monsters/adult-blue-dracolich2023-03-11https://harmlesskey.com/compendium/monsters/adult-blue-dragon2023-03-11https://harmlesskey.com/compendium/monsters/adult-brass-dragon2023-03-11https://harmlesskey.com/compendium/monsters/adult-bronze-dragon2023-03-11https://harmlesskey.com/compendium/monsters/adult-copper-dragon2023-03-11https://harmlesskey.com/compendium/monsters/adult-gold-dragon2023-03-11https://harmlesskey.com/compendium/monsters/adult-green-dragon2023-03-11https://harmlesskey.com/compendium/monsters/adult-red-dragon2023-03-11https://harmlesskey.com/compendium/monsters/adult-silver-dragon2023-03-11https://harmlesskey.com/compendium/monsters/adult-white-dragon2023-03-11https://harmlesskey.com/compendium/monsters/air-elemental2023-03-11https://harmlesskey.com/compendium/monsters/ancient-black-dragon2023-03-11https://harmlesskey.com/compendium/monsters/ancient-blue-dragon2023-03-11https://harmlesskey.com/compendium/monsters/ancient-brass-dragon2023-03-11https://harmlesskey.com/compendium/monsters/ancient-bronze-dragon2023-03-11https://harmlesskey.com/compendium/monsters/ancient-copper-dragon2023-03-11https://harmlesskey.com/compendium/monsters/ancient-gold-dragon2023-03-11https://harmlesskey.com/compendium/monsters/ancient-green-dragon2023-03-11https://harmlesskey.com/compendium/monsters/ancient-red-dragon2023-03-11https://harmlesskey.com/compendium/monsters/ancient-silver-dragon2023-03-11https://harmlesskey.com/compendium/monsters/ancient-white-dragon2023-03-11https://harmlesskey.com/compendium/monsters/androsphinx2023-03-11https://harmlesskey.com/compendium/monsters/animated-armor2023-03-11https://harmlesskey.com/compendium/monsters/ankheg2023-03-11https://harmlesskey.com/compendium/monsters/ape2023-03-11https://harmlesskey.com/compendium/monsters/archmage2023-03-11https://harmlesskey.com/compendium/monsters/assassin2023-03-11https://harmlesskey.com/compendium/monsters/awakened-shrub2023-03-11https://harmlesskey.com/compendium/monsters/awakened-tree2023-03-11https://harmlesskey.com/compendium/monsters/axe-beak2023-03-11https://harmlesskey.com/compendium/monsters/azer2023-03-11https://harmlesskey.com/compendium/monsters/baboon2023-03-11https://harmlesskey.com/compendium/monsters/badger2023-03-11https://harmlesskey.com/compendium/monsters/balor2023-03-11https://harmlesskey.com/compendium/monsters/bandit2023-03-11https://harmlesskey.com/compendium/monsters/bandit-captain2023-03-11https://harmlesskey.com/compendium/monsters/barbed-devil2023-03-11https://harmlesskey.com/compendium/monsters/basilisk2023-03-11https://harmlesskey.com/compendium/monsters/bat2023-03-11https://harmlesskey.com/compendium/monsters/bearded-devil2023-03-11https://harmlesskey.com/compendium/monsters/behir2023-03-11https://harmlesskey.com/compendium/monsters/berserker2023-03-11https://harmlesskey.com/compendium/monsters/black-bear2023-03-11https://harmlesskey.com/compendium/monsters/black-dragon-wyrmling2023-03-11https://harmlesskey.com/compendium/monsters/black-pudding2023-03-11https://harmlesskey.com/compendium/monsters/blink-dog2023-03-11https://harmlesskey.com/compendium/monsters/blood-hawk2023-03-11https://harmlesskey.com/compendium/monsters/blue-dragon-wyrmling2023-03-11https://harmlesskey.com/compendium/monsters/boar2023-03-11https://harmlesskey.com/compendium/monsters/bone-devil2023-03-11https://harmlesskey.com/compendium/monsters/brass-dragon-wyrmling2023-03-11https://harmlesskey.com/compendium/monsters/bronze-dragon-wyrmling2023-03-11https://harmlesskey.com/compendium/monsters/brown-bear2023-03-11https://harmlesskey.com/compendium/monsters/bugbear2023-03-11https://harmlesskey.com/compendium/monsters/bulette2023-03-11https://harmlesskey.com/compendium/monsters/camel2023-03-11https://harmlesskey.com/compendium/monsters/carrion-crawler2023-03-11https://harmlesskey.com/compendium/monsters/cat2023-03-11https://harmlesskey.com/compendium/monsters/cave-bear2023-03-11https://harmlesskey.com/compendium/monsters/centaur2023-03-11https://harmlesskey.com/compendium/monsters/chain-devil2023-03-11https://harmlesskey.com/compendium/monsters/chimera2023-03-11https://harmlesskey.com/compendium/monsters/chuul2023-03-11https://harmlesskey.com/compendium/monsters/clay-golem2023-03-11https://harmlesskey.com/compendium/monsters/cloaker2023-03-11https://harmlesskey.com/compendium/monsters/cloud-giant2023-03-11https://harmlesskey.com/compendium/monsters/cockatrice2023-03-11https://harmlesskey.com/compendium/monsters/commoner2023-03-11https://harmlesskey.com/compendium/monsters/constrictor-snake2023-03-11https://harmlesskey.com/compendium/monsters/copper-dragon-wyrmling2023-03-11https://harmlesskey.com/compendium/monsters/couatl2023-03-11https://harmlesskey.com/compendium/monsters/crab2023-03-11https://harmlesskey.com/compendium/monsters/crocodile2023-03-11https://harmlesskey.com/compendium/monsters/cult-fanatic2023-03-11https://harmlesskey.com/compendium/monsters/cultist2023-03-11https://harmlesskey.com/compendium/monsters/darkmantle2023-03-11https://harmlesskey.com/compendium/monsters/death-dog2023-03-11https://harmlesskey.com/compendium/monsters/deep-gnome-svirfneblin2023-03-11https://harmlesskey.com/compendium/monsters/deer2023-03-11https://harmlesskey.com/compendium/monsters/deva2023-03-11https://harmlesskey.com/compendium/monsters/dire-wolf2023-03-11https://harmlesskey.com/compendium/monsters/diseased-giant-rat2023-03-11https://harmlesskey.com/compendium/monsters/djinni2023-03-11https://harmlesskey.com/compendium/monsters/doppelganger2023-03-11https://harmlesskey.com/compendium/monsters/draft-horse2023-03-11https://harmlesskey.com/compendium/monsters/dragon-turtle2023-03-11https://harmlesskey.com/compendium/monsters/dretch2023-03-11https://harmlesskey.com/compendium/monsters/drider2023-03-11https://harmlesskey.com/compendium/monsters/drow2023-03-11https://harmlesskey.com/compendium/monsters/druid2023-03-11https://harmlesskey.com/compendium/monsters/dryad2023-03-11https://harmlesskey.com/compendium/monsters/duergar2023-03-11https://harmlesskey.com/compendium/monsters/dust-mephit2023-03-11https://harmlesskey.com/compendium/monsters/eagle2023-03-11https://harmlesskey.com/compendium/monsters/earth-elemental2023-03-11https://harmlesskey.com/compendium/monsters/efreeti2023-03-11https://harmlesskey.com/compendium/monsters/elephant2023-03-11https://harmlesskey.com/compendium/monsters/elk2023-03-11https://harmlesskey.com/compendium/monsters/erinyes2023-03-11https://harmlesskey.com/compendium/monsters/ettercap2023-03-11https://harmlesskey.com/compendium/monsters/ettin2023-03-11https://harmlesskey.com/compendium/monsters/fire-elemental2023-03-11https://harmlesskey.com/compendium/monsters/fire-giant2023-03-11https://harmlesskey.com/compendium/monsters/flesh-golem2023-03-11https://harmlesskey.com/compendium/monsters/flying-snake2023-03-11https://harmlesskey.com/compendium/monsters/flying-sword2023-03-11https://harmlesskey.com/compendium/monsters/frog2023-03-11https://harmlesskey.com/compendium/monsters/frost-giant2023-03-11https://harmlesskey.com/compendium/monsters/gargoyle2023-03-11https://harmlesskey.com/compendium/monsters/gelatinous-cube2023-03-11https://harmlesskey.com/compendium/monsters/ghast2023-03-11https://harmlesskey.com/compendium/monsters/ghost2023-03-11https://harmlesskey.com/compendium/monsters/ghoul2023-03-11https://harmlesskey.com/compendium/monsters/giant-ape2023-03-11https://harmlesskey.com/compendium/monsters/giant-badger2023-03-11https://harmlesskey.com/compendium/monsters/giant-bat2023-03-11https://harmlesskey.com/compendium/monsters/giant-boar2023-03-11https://harmlesskey.com/compendium/monsters/giant-centipede2023-03-11https://harmlesskey.com/compendium/monsters/giant-constrictor-snake2023-03-11https://harmlesskey.com/compendium/monsters/giant-crab2023-03-11https://harmlesskey.com/compendium/monsters/giant-crocodile2023-03-11https://harmlesskey.com/compendium/monsters/giant-eagle2023-03-11https://harmlesskey.com/compendium/monsters/giant-elk2023-03-11https://harmlesskey.com/compendium/monsters/giant-fire-beetle2023-03-11https://harmlesskey.com/compendium/monsters/giant-frog2023-03-11https://harmlesskey.com/compendium/monsters/giant-goat2023-03-11https://harmlesskey.com/compendium/monsters/giant-hyena2023-03-11https://harmlesskey.com/compendium/monsters/giant-lizard2023-03-11https://harmlesskey.com/compendium/monsters/giant-octopus2023-03-11https://harmlesskey.com/compendium/monsters/giant-owl2023-03-11https://harmlesskey.com/compendium/monsters/giant-poisonous-snake2023-03-11https://harmlesskey.com/compendium/monsters/giant-rat2023-03-11https://harmlesskey.com/compendium/monsters/giant-scorpion2023-03-11https://harmlesskey.com/compendium/monsters/giant-sea-horse2023-03-11https://harmlesskey.com/compendium/monsters/giant-shark2023-03-11https://harmlesskey.com/compendium/monsters/giant-spider2023-03-11https://harmlesskey.com/compendium/monsters/giant-toad2023-03-11https://harmlesskey.com/compendium/monsters/giant-vulture2023-03-11https://harmlesskey.com/compendium/monsters/giant-wasp2023-03-11https://harmlesskey.com/compendium/monsters/giant-weasel2023-03-11https://harmlesskey.com/compendium/monsters/giant-wolf-spider2023-03-11https://harmlesskey.com/compendium/monsters/gibbering-mouther2023-03-11https://harmlesskey.com/compendium/monsters/glabrezu2023-03-11https://harmlesskey.com/compendium/monsters/gladiator2023-03-11https://harmlesskey.com/compendium/monsters/gnoll2023-03-11https://harmlesskey.com/compendium/monsters/goat2023-03-11https://harmlesskey.com/compendium/monsters/goblin2023-03-11https://harmlesskey.com/compendium/monsters/gold-dragon-wyrmling2023-03-11https://harmlesskey.com/compendium/monsters/gorgon2023-03-11https://harmlesskey.com/compendium/monsters/gray-ooze2023-03-11https://harmlesskey.com/compendium/monsters/green-dragon-wyrmling2023-03-11https://harmlesskey.com/compendium/monsters/green-hag2023-03-11https://harmlesskey.com/compendium/monsters/grick2023-03-11https://harmlesskey.com/compendium/monsters/griffon2023-03-11https://harmlesskey.com/compendium/monsters/grimlock2023-03-11https://harmlesskey.com/compendium/monsters/guard2023-03-11https://harmlesskey.com/compendium/monsters/guardian-naga2023-03-11https://harmlesskey.com/compendium/monsters/gynosphinx2023-03-11https://harmlesskey.com/compendium/monsters/half-red-dragon-veteran2023-03-11https://harmlesskey.com/compendium/monsters/harpy2023-03-11https://harmlesskey.com/compendium/monsters/hawk2023-03-11https://harmlesskey.com/compendium/monsters/hell-hound2023-03-11https://harmlesskey.com/compendium/monsters/hezrou2023-03-11https://harmlesskey.com/compendium/monsters/hill-giant2023-03-11https://harmlesskey.com/compendium/monsters/hippogriff2023-03-11https://harmlesskey.com/compendium/monsters/hobgoblin2023-03-11https://harmlesskey.com/compendium/monsters/homunculus2023-03-11https://harmlesskey.com/compendium/monsters/horned-devil2023-03-11https://harmlesskey.com/compendium/monsters/hunter-shark2023-03-11https://harmlesskey.com/compendium/monsters/hydra2023-03-11https://harmlesskey.com/compendium/monsters/hyena2023-03-11https://harmlesskey.com/compendium/monsters/ice-devil2023-03-11https://harmlesskey.com/compendium/monsters/ice-mephit2023-03-11https://harmlesskey.com/compendium/monsters/imp2023-03-11https://harmlesskey.com/compendium/monsters/invisible-stalker2023-03-11https://harmlesskey.com/compendium/monsters/iron-golem2023-03-11https://harmlesskey.com/compendium/monsters/jackal2023-03-11https://harmlesskey.com/compendium/monsters/killer-whale2023-03-11https://harmlesskey.com/compendium/monsters/knight2023-03-11https://harmlesskey.com/compendium/monsters/kobold2023-03-11https://harmlesskey.com/compendium/monsters/kraken2023-03-11https://harmlesskey.com/compendium/monsters/lamia2023-03-11https://harmlesskey.com/compendium/monsters/lemure2023-03-11https://harmlesskey.com/compendium/monsters/lich2023-03-11https://harmlesskey.com/compendium/monsters/lion2023-03-11https://harmlesskey.com/compendium/monsters/lizard2023-03-11https://harmlesskey.com/compendium/monsters/lizardfolk2023-03-11https://harmlesskey.com/compendium/monsters/mage2023-03-11https://harmlesskey.com/compendium/monsters/magma-mephit2023-03-11https://harmlesskey.com/compendium/monsters/magmin2023-03-11https://harmlesskey.com/compendium/monsters/mammoth2023-03-11https://harmlesskey.com/compendium/monsters/manticore2023-03-11https://harmlesskey.com/compendium/monsters/marilith2023-03-11https://harmlesskey.com/compendium/monsters/mastiff2023-03-11https://harmlesskey.com/compendium/monsters/medusa2023-03-11https://harmlesskey.com/compendium/monsters/merfolk2023-03-11https://harmlesskey.com/compendium/monsters/merrow2023-03-11https://harmlesskey.com/compendium/monsters/mimic2023-03-11https://harmlesskey.com/compendium/monsters/minotaur2023-03-11https://harmlesskey.com/compendium/monsters/minotaur-skeleton2023-03-11https://harmlesskey.com/compendium/monsters/mule2023-03-11https://harmlesskey.com/compendium/monsters/mummy2023-03-11https://harmlesskey.com/compendium/monsters/mummy-lord2023-03-11https://harmlesskey.com/compendium/monsters/nalfeshnee2023-03-11https://harmlesskey.com/compendium/monsters/night-hag2023-03-11https://harmlesskey.com/compendium/monsters/nightmare2023-03-11https://harmlesskey.com/compendium/monsters/noble2023-03-11https://harmlesskey.com/compendium/monsters/ochre-jelly2023-03-11https://harmlesskey.com/compendium/monsters/octopus2023-03-11https://harmlesskey.com/compendium/monsters/ogre2023-03-11https://harmlesskey.com/compendium/monsters/ogre-zombie2023-03-11https://harmlesskey.com/compendium/monsters/oni2023-03-11https://harmlesskey.com/compendium/monsters/orc2023-03-11https://harmlesskey.com/compendium/monsters/otyugh2023-03-11https://harmlesskey.com/compendium/monsters/owl2023-03-11https://harmlesskey.com/compendium/monsters/owlbear2023-03-11https://harmlesskey.com/compendium/monsters/panther2023-03-11https://harmlesskey.com/compendium/monsters/pegasus2023-03-11https://harmlesskey.com/compendium/monsters/phase-spider2023-03-11https://harmlesskey.com/compendium/monsters/pit-fiend2023-03-11https://harmlesskey.com/compendium/monsters/planetar2023-03-11https://harmlesskey.com/compendium/monsters/plesiosaurus2023-03-11https://harmlesskey.com/compendium/monsters/poisonous-snake2023-03-11https://harmlesskey.com/compendium/monsters/polar-bear2023-03-11https://harmlesskey.com/compendium/monsters/pony2023-03-11https://harmlesskey.com/compendium/monsters/priest2023-03-11https://harmlesskey.com/compendium/monsters/pseudodragon2023-03-11https://harmlesskey.com/compendium/monsters/purple-worm2023-03-11https://harmlesskey.com/compendium/monsters/quasit2023-03-11https://harmlesskey.com/compendium/monsters/quipper2023-03-11https://harmlesskey.com/compendium/monsters/rakshasa2023-03-11https://harmlesskey.com/compendium/monsters/rat2023-03-11https://harmlesskey.com/compendium/monsters/raven2023-03-11https://harmlesskey.com/compendium/monsters/red-dragon-wyrmling2023-03-11https://harmlesskey.com/compendium/monsters/reef-shark2023-03-11https://harmlesskey.com/compendium/monsters/remorhaz2023-03-11https://harmlesskey.com/compendium/monsters/rhinoceros2023-03-11https://harmlesskey.com/compendium/monsters/riding-horse2023-03-11https://harmlesskey.com/compendium/monsters/roc2023-03-11https://harmlesskey.com/compendium/monsters/roper2023-03-11https://harmlesskey.com/compendium/monsters/rug-of-smothering2023-03-11https://harmlesskey.com/compendium/monsters/rust-monster2023-03-11https://harmlesskey.com/compendium/monsters/saber-toothed-tiger2023-03-11https://harmlesskey.com/compendium/monsters/sahuagin2023-03-11https://harmlesskey.com/compendium/monsters/salamander2023-03-11https://harmlesskey.com/compendium/monsters/satyr2023-03-11https://harmlesskey.com/compendium/monsters/scorpion2023-03-11https://harmlesskey.com/compendium/monsters/scout2023-03-11https://harmlesskey.com/compendium/monsters/sea-hag2023-03-11https://harmlesskey.com/compendium/monsters/sea-horse2023-03-11https://harmlesskey.com/compendium/monsters/shadow2023-03-11https://harmlesskey.com/compendium/monsters/shambling-mound2023-03-11https://harmlesskey.com/compendium/monsters/shield-guardian2023-03-11https://harmlesskey.com/compendium/monsters/shrieker2023-03-11https://harmlesskey.com/compendium/monsters/silver-dragon-wyrmling2023-03-11https://harmlesskey.com/compendium/monsters/skeleton2023-03-11https://harmlesskey.com/compendium/monsters/solar2023-03-11https://harmlesskey.com/compendium/monsters/specter2023-03-11https://harmlesskey.com/compendium/monsters/spider2023-03-11https://harmlesskey.com/compendium/monsters/spirit-naga2023-03-11https://harmlesskey.com/compendium/monsters/sprite2023-03-11https://harmlesskey.com/compendium/monsters/spy2023-03-11https://harmlesskey.com/compendium/monsters/steam-mephit2023-03-11https://harmlesskey.com/compendium/monsters/stirge2023-03-11https://harmlesskey.com/compendium/monsters/stone-giant2023-03-11https://harmlesskey.com/compendium/monsters/stone-golem2023-03-11https://harmlesskey.com/compendium/monsters/storm-giant2023-03-11https://harmlesskey.com/compendium/monsters/succubus-incubus2023-03-11https://harmlesskey.com/compendium/monsters/swarm-of-bats2023-03-11https://harmlesskey.com/compendium/monsters/swarm-of-beetles2023-03-11https://harmlesskey.com/compendium/monsters/swarm-of-centipedes2023-03-11https://harmlesskey.com/compendium/monsters/swarm-of-insects2023-03-11https://harmlesskey.com/compendium/monsters/swarm-of-poisonous-snakes2023-03-11https://harmlesskey.com/compendium/monsters/swarm-of-quippers2023-03-11https://harmlesskey.com/compendium/monsters/swarm-of-rats2023-03-11https://harmlesskey.com/compendium/monsters/swarm-of-ravens2023-03-11https://harmlesskey.com/compendium/monsters/swarm-of-spiders2023-03-11https://harmlesskey.com/compendium/monsters/swarm-of-wasps2023-03-11https://harmlesskey.com/compendium/monsters/tarrasque2023-03-11https://harmlesskey.com/compendium/monsters/thug2023-03-11https://harmlesskey.com/compendium/monsters/tiger2023-03-11https://harmlesskey.com/compendium/monsters/treant2023-03-11https://harmlesskey.com/compendium/monsters/tribal-warrior2023-03-11https://harmlesskey.com/compendium/monsters/triceratops2023-03-11https://harmlesskey.com/compendium/monsters/troll2023-03-11https://harmlesskey.com/compendium/monsters/tyrannosaurus-rex2023-03-11https://harmlesskey.com/compendium/monsters/unicorn2023-03-11https://harmlesskey.com/compendium/monsters/vampire2023-03-11https://harmlesskey.com/compendium/monsters/vampire-spawn2023-03-11https://harmlesskey.com/compendium/monsters/veteran2023-03-11https://harmlesskey.com/compendium/monsters/violet-fungus2023-03-11https://harmlesskey.com/compendium/monsters/vrock2023-03-11https://harmlesskey.com/compendium/monsters/vulture2023-03-11https://harmlesskey.com/compendium/monsters/warhorse2023-03-11https://harmlesskey.com/compendium/monsters/warhorse-skeleton2023-03-11https://harmlesskey.com/compendium/monsters/water-elemental2023-03-11https://harmlesskey.com/compendium/monsters/weasel2023-03-11https://harmlesskey.com/compendium/monsters/werebear2023-03-11https://harmlesskey.com/compendium/monsters/wereboar2023-03-11https://harmlesskey.com/compendium/monsters/wererat2023-03-11https://harmlesskey.com/compendium/monsters/weretiger2023-03-11https://harmlesskey.com/compendium/monsters/werewolf2023-03-11https://harmlesskey.com/compendium/monsters/white-dragon-wyrmling2023-03-11https://harmlesskey.com/compendium/monsters/wight2023-03-11https://harmlesskey.com/compendium/monsters/will-o-wisp2023-03-11https://harmlesskey.com/compendium/monsters/winter-wolf2023-03-11https://harmlesskey.com/compendium/monsters/wolf2023-03-11https://harmlesskey.com/compendium/monsters/worg2023-03-11https://harmlesskey.com/compendium/monsters/wraith2023-03-11https://harmlesskey.com/compendium/monsters/wyvern2023-03-11https://harmlesskey.com/compendium/monsters/xorn2023-03-11https://harmlesskey.com/compendium/monsters/young-black-dragon2023-03-11https://harmlesskey.com/compendium/monsters/young-blue-dragon2023-03-11https://harmlesskey.com/compendium/monsters/young-brass-dragon2023-03-11https://harmlesskey.com/compendium/monsters/young-bronze-dragon2023-03-11https://harmlesskey.com/compendium/monsters/young-copper-dragon2023-03-11https://harmlesskey.com/compendium/monsters/young-gold-dragon2023-03-11https://harmlesskey.com/compendium/monsters/young-green-dragon2023-03-11https://harmlesskey.com/compendium/monsters/young-red-dragon2023-03-11https://harmlesskey.com/compendium/monsters/young-silver-dragon2023-03-11https://harmlesskey.com/compendium/monsters/young-white-dragon2023-03-11https://harmlesskey.com/compendium/monsters/zombie2023-03-11https://harmlesskey.com/compendium/spells/acid-arrow2023-03-11https://harmlesskey.com/compendium/spells/acid-splash2023-03-11https://harmlesskey.com/compendium/spells/aid2023-03-11https://harmlesskey.com/compendium/spells/alarm2023-03-11https://harmlesskey.com/compendium/spells/alter-self2023-03-11https://harmlesskey.com/compendium/spells/animal-friendship2023-03-11https://harmlesskey.com/compendium/spells/animal-messenger2023-03-11https://harmlesskey.com/compendium/spells/animal-shapes2023-03-11https://harmlesskey.com/compendium/spells/animate-dead2023-03-11https://harmlesskey.com/compendium/spells/animate-objects2023-03-11https://harmlesskey.com/compendium/spells/antilife-shell2023-03-11https://harmlesskey.com/compendium/spells/antimagic-field2023-03-11https://harmlesskey.com/compendium/spells/antipathy-sympathy2023-03-11https://harmlesskey.com/compendium/spells/arcane-eye2023-03-11https://harmlesskey.com/compendium/spells/arcane-hand2023-03-11https://harmlesskey.com/compendium/spells/arcane-lock2023-03-11https://harmlesskey.com/compendium/spells/arcane-sword2023-03-11https://harmlesskey.com/compendium/spells/arcanists-magic-aura2023-03-11https://harmlesskey.com/compendium/spells/astral-projection2023-03-11https://harmlesskey.com/compendium/spells/augury2023-03-11https://harmlesskey.com/compendium/spells/awaken2023-03-11https://harmlesskey.com/compendium/spells/bane2023-03-11https://harmlesskey.com/compendium/spells/banishment2023-03-11https://harmlesskey.com/compendium/spells/barkskin2023-03-11https://harmlesskey.com/compendium/spells/beacon-of-hope2023-03-11https://harmlesskey.com/compendium/spells/bestow-curse2023-03-11https://harmlesskey.com/compendium/spells/black-tentacles2023-03-11https://harmlesskey.com/compendium/spells/blade-barrier2023-03-11https://harmlesskey.com/compendium/spells/bless2023-03-11https://harmlesskey.com/compendium/spells/blight2023-03-11https://harmlesskey.com/compendium/spells/blindness-deafness2023-03-11https://harmlesskey.com/compendium/spells/blink2023-03-11https://harmlesskey.com/compendium/spells/blur2023-03-11https://harmlesskey.com/compendium/spells/branding-smite2023-03-11https://harmlesskey.com/compendium/spells/burning-hands2023-03-11https://harmlesskey.com/compendium/spells/call-lightning2023-03-11https://harmlesskey.com/compendium/spells/calm-emotions2023-03-11https://harmlesskey.com/compendium/spells/chain-lightning2023-03-11https://harmlesskey.com/compendium/spells/charm-person2023-03-11https://harmlesskey.com/compendium/spells/chill-touch2023-03-11https://harmlesskey.com/compendium/spells/circle-of-death2023-03-11https://harmlesskey.com/compendium/spells/clairvoyance2023-03-11https://harmlesskey.com/compendium/spells/clone2023-03-11https://harmlesskey.com/compendium/spells/cloudkill2023-03-11https://harmlesskey.com/compendium/spells/color-spray2023-03-11https://harmlesskey.com/compendium/spells/command2023-03-11https://harmlesskey.com/compendium/spells/commune2023-03-11https://harmlesskey.com/compendium/spells/commune-with-nature2023-03-11https://harmlesskey.com/compendium/spells/comprehend-languages2023-03-11https://harmlesskey.com/compendium/spells/compulsion2023-03-11https://harmlesskey.com/compendium/spells/cone-of-cold2023-03-11https://harmlesskey.com/compendium/spells/confusion2023-03-11https://harmlesskey.com/compendium/spells/conjure-animals2023-03-11https://harmlesskey.com/compendium/spells/conjure-celestial2023-03-11https://harmlesskey.com/compendium/spells/conjure-elemental2023-03-11https://harmlesskey.com/compendium/spells/conjure-fey2023-03-11https://harmlesskey.com/compendium/spells/conjure-minor-elementals2023-03-11https://harmlesskey.com/compendium/spells/conjure-woodland-beings2023-03-11https://harmlesskey.com/compendium/spells/contact-other-plane2023-03-11https://harmlesskey.com/compendium/spells/contagion2023-03-11https://harmlesskey.com/compendium/spells/contingency2023-03-11https://harmlesskey.com/compendium/spells/continual-flame2023-03-11https://harmlesskey.com/compendium/spells/control-water2023-03-11https://harmlesskey.com/compendium/spells/control-weather2023-03-11https://harmlesskey.com/compendium/spells/counterspell2023-03-11https://harmlesskey.com/compendium/spells/create-food-and-water2023-03-11https://harmlesskey.com/compendium/spells/create-undead2023-03-11https://harmlesskey.com/compendium/spells/create-or-destroy-water2023-03-11https://harmlesskey.com/compendium/spells/creation2023-03-11https://harmlesskey.com/compendium/spells/cure-wounds2023-03-11https://harmlesskey.com/compendium/spells/dancing-lights2023-03-11https://harmlesskey.com/compendium/spells/darkness2023-03-11https://harmlesskey.com/compendium/spells/darkvision2023-03-11https://harmlesskey.com/compendium/spells/daylight2023-03-11https://harmlesskey.com/compendium/spells/death-ward2023-03-11https://harmlesskey.com/compendium/spells/delayed-blast-fireball2023-03-11https://harmlesskey.com/compendium/spells/demiplane2023-03-11https://harmlesskey.com/compendium/spells/detect-evil-and-good2023-03-11https://harmlesskey.com/compendium/spells/detect-magic2023-03-11https://harmlesskey.com/compendium/spells/detect-poison-and-disease2023-03-11https://harmlesskey.com/compendium/spells/detect-thoughts2023-03-11https://harmlesskey.com/compendium/spells/dimension-door2023-03-11https://harmlesskey.com/compendium/spells/disguise-self2023-03-11https://harmlesskey.com/compendium/spells/disintegrate2023-03-11https://harmlesskey.com/compendium/spells/dispel-evil-and-good2023-03-11https://harmlesskey.com/compendium/spells/dispel-magic2023-03-11https://harmlesskey.com/compendium/spells/divination2023-03-11https://harmlesskey.com/compendium/spells/divine-favor2023-03-11https://harmlesskey.com/compendium/spells/divine-word2023-03-11https://harmlesskey.com/compendium/spells/dominate-beast2023-03-11https://harmlesskey.com/compendium/spells/dominate-monster2023-03-11https://harmlesskey.com/compendium/spells/dominate-person2023-03-11https://harmlesskey.com/compendium/spells/dream2023-03-11https://harmlesskey.com/compendium/spells/druidcraft2023-03-11https://harmlesskey.com/compendium/spells/earthquake2023-03-11https://harmlesskey.com/compendium/spells/eldritch-blast2023-03-11https://harmlesskey.com/compendium/spells/enhance-ability2023-03-11https://harmlesskey.com/compendium/spells/enlarge-reduce2023-03-11https://harmlesskey.com/compendium/spells/entangle2023-03-11https://harmlesskey.com/compendium/spells/enthrall2023-03-11https://harmlesskey.com/compendium/spells/etherealness2023-03-11https://harmlesskey.com/compendium/spells/expeditious-retreat2023-03-11https://harmlesskey.com/compendium/spells/eyebite2023-03-11https://harmlesskey.com/compendium/spells/fabricate2023-03-11https://harmlesskey.com/compendium/spells/faerie-fire2023-03-11https://harmlesskey.com/compendium/spells/faithful-hound2023-03-11https://harmlesskey.com/compendium/spells/false-life2023-03-11https://harmlesskey.com/compendium/spells/fear2023-03-11https://harmlesskey.com/compendium/spells/feather-fall2023-03-11https://harmlesskey.com/compendium/spells/feeblemind2023-03-11https://harmlesskey.com/compendium/spells/find-familiar2023-03-11https://harmlesskey.com/compendium/spells/find-steed2023-03-11https://harmlesskey.com/compendium/spells/find-traps2023-03-11https://harmlesskey.com/compendium/spells/find-the-path2023-03-11https://harmlesskey.com/compendium/spells/finger-of-death2023-03-11https://harmlesskey.com/compendium/spells/fire-bolt2023-03-11https://harmlesskey.com/compendium/spells/fire-shield2023-03-11https://harmlesskey.com/compendium/spells/fire-storm2023-03-11https://harmlesskey.com/compendium/spells/fireball2023-03-11https://harmlesskey.com/compendium/spells/flame-blade2023-03-11https://harmlesskey.com/compendium/spells/flame-strike2023-03-11https://harmlesskey.com/compendium/spells/flaming-sphere2023-03-11https://harmlesskey.com/compendium/spells/flesh-to-stone2023-03-11https://harmlesskey.com/compendium/spells/floating-disk2023-03-11https://harmlesskey.com/compendium/spells/fly2023-03-11https://harmlesskey.com/compendium/spells/fog-cloud2023-03-11https://harmlesskey.com/compendium/spells/forbiddance2023-03-11https://harmlesskey.com/compendium/spells/forcecage2023-03-11https://harmlesskey.com/compendium/spells/foresight2023-03-11https://harmlesskey.com/compendium/spells/freedom-of-movement2023-03-11https://harmlesskey.com/compendium/spells/freezing-sphere2023-03-11https://harmlesskey.com/compendium/spells/gaseous-form2023-03-11https://harmlesskey.com/compendium/spells/gate2023-03-11https://harmlesskey.com/compendium/spells/geas2023-03-11https://harmlesskey.com/compendium/spells/gentle-repose2023-03-11https://harmlesskey.com/compendium/spells/giant-insect2023-03-11https://harmlesskey.com/compendium/spells/glibness2023-03-11https://harmlesskey.com/compendium/spells/globe-of-invulnerability2023-03-11https://harmlesskey.com/compendium/spells/glyph-of-warding2023-03-11https://harmlesskey.com/compendium/spells/goodberry2023-03-11https://harmlesskey.com/compendium/spells/grease2023-03-11https://harmlesskey.com/compendium/spells/greater-invisibility2023-03-11https://harmlesskey.com/compendium/spells/greater-restoration2023-03-11https://harmlesskey.com/compendium/spells/guardian-of-faith2023-03-11https://harmlesskey.com/compendium/spells/guards-and-wards2023-03-11https://harmlesskey.com/compendium/spells/guidance2023-03-11https://harmlesskey.com/compendium/spells/guiding-bolt2023-03-11https://harmlesskey.com/compendium/spells/gust-of-wind2023-03-11https://harmlesskey.com/compendium/spells/hallow2023-03-11https://harmlesskey.com/compendium/spells/hallucinatory-terrain2023-03-11https://harmlesskey.com/compendium/spells/harm2023-03-11https://harmlesskey.com/compendium/spells/haste2023-03-11https://harmlesskey.com/compendium/spells/heal2023-03-11https://harmlesskey.com/compendium/spells/healing-word2023-03-11https://harmlesskey.com/compendium/spells/heat-metal2023-03-11https://harmlesskey.com/compendium/spells/hellish-rebuke2023-03-11https://harmlesskey.com/compendium/spells/heroes-feast2023-03-11https://harmlesskey.com/compendium/spells/heroism2023-03-11https://harmlesskey.com/compendium/spells/hideous-laughter2023-03-11https://harmlesskey.com/compendium/spells/hold-monster2023-03-11https://harmlesskey.com/compendium/spells/hold-person2023-03-11https://harmlesskey.com/compendium/spells/holy-aura2023-03-11https://harmlesskey.com/compendium/spells/hunters-mark2023-03-11https://harmlesskey.com/compendium/spells/hypnotic-pattern2023-03-11https://harmlesskey.com/compendium/spells/ice-storm2023-03-11https://harmlesskey.com/compendium/spells/identify2023-03-11https://harmlesskey.com/compendium/spells/illusory-script2023-03-11https://harmlesskey.com/compendium/spells/imprisonment2023-03-11https://harmlesskey.com/compendium/spells/incendiary-cloud2023-03-11https://harmlesskey.com/compendium/spells/inflict-wounds2023-03-11https://harmlesskey.com/compendium/spells/insect-plague2023-03-11https://harmlesskey.com/compendium/spells/instant-summons2023-03-11https://harmlesskey.com/compendium/spells/invisibility2023-03-11https://harmlesskey.com/compendium/spells/irresistible-dance2023-03-11https://harmlesskey.com/compendium/spells/jump2023-03-11https://harmlesskey.com/compendium/spells/knock2023-03-11https://harmlesskey.com/compendium/spells/legend-lore2023-03-11https://harmlesskey.com/compendium/spells/lesser-restoration2023-03-11https://harmlesskey.com/compendium/spells/levitate2023-03-11https://harmlesskey.com/compendium/spells/light2023-03-11https://harmlesskey.com/compendium/spells/lightning-bolt2023-03-11https://harmlesskey.com/compendium/spells/locate-animals-or-plants2023-03-11https://harmlesskey.com/compendium/spells/locate-creature2023-03-11https://harmlesskey.com/compendium/spells/locate-object2023-03-11https://harmlesskey.com/compendium/spells/longstrider2023-03-11https://harmlesskey.com/compendium/spells/mage-armor2023-03-11https://harmlesskey.com/compendium/spells/mage-hand2023-03-11https://harmlesskey.com/compendium/spells/magic-circle2023-03-11https://harmlesskey.com/compendium/spells/magic-jar2023-03-11https://harmlesskey.com/compendium/spells/magic-missile2023-03-11https://harmlesskey.com/compendium/spells/magic-mouth2023-03-11https://harmlesskey.com/compendium/spells/magic-weapon2023-03-11https://harmlesskey.com/compendium/spells/magnificent-mansion2023-03-11https://harmlesskey.com/compendium/spells/major-image2023-03-11https://harmlesskey.com/compendium/spells/mass-cure-wounds2023-03-11https://harmlesskey.com/compendium/spells/mass-heal2023-03-11https://harmlesskey.com/compendium/spells/mass-healing-word2023-03-11https://harmlesskey.com/compendium/spells/mass-suggestion2023-03-11https://harmlesskey.com/compendium/spells/maze2023-03-11https://harmlesskey.com/compendium/spells/meld-into-stone2023-03-11https://harmlesskey.com/compendium/spells/mending2023-03-11https://harmlesskey.com/compendium/spells/message2023-03-11https://harmlesskey.com/compendium/spells/meteor-swarm2023-03-11https://harmlesskey.com/compendium/spells/mind-blank2023-03-11https://harmlesskey.com/compendium/spells/minor-illusion2023-03-11https://harmlesskey.com/compendium/spells/mirage-arcane2023-03-11https://harmlesskey.com/compendium/spells/mirror-image2023-03-11https://harmlesskey.com/compendium/spells/mislead2023-03-11https://harmlesskey.com/compendium/spells/misty-step2023-03-11https://harmlesskey.com/compendium/spells/modify-memory2023-03-11https://harmlesskey.com/compendium/spells/moonbeam2023-03-11https://harmlesskey.com/compendium/spells/move-earth2023-03-11https://harmlesskey.com/compendium/spells/nondetection2023-03-11https://harmlesskey.com/compendium/spells/pass-without-trace2023-03-11https://harmlesskey.com/compendium/spells/passwall2023-03-11https://harmlesskey.com/compendium/spells/phantasmal-killer2023-03-11https://harmlesskey.com/compendium/spells/phantom-steed2023-03-11https://harmlesskey.com/compendium/spells/planar-ally2023-03-11https://harmlesskey.com/compendium/spells/planar-binding2023-03-11https://harmlesskey.com/compendium/spells/plane-shift2023-03-11https://harmlesskey.com/compendium/spells/plant-growth2023-03-11https://harmlesskey.com/compendium/spells/poison-spray2023-03-11https://harmlesskey.com/compendium/spells/polymorph2023-03-11https://harmlesskey.com/compendium/spells/power-word-kill2023-03-11https://harmlesskey.com/compendium/spells/power-word-stun2023-03-11https://harmlesskey.com/compendium/spells/prayer-of-healing2023-03-11https://harmlesskey.com/compendium/spells/prestidigitation2023-03-11https://harmlesskey.com/compendium/spells/prismatic-spray2023-03-11https://harmlesskey.com/compendium/spells/prismatic-wall2023-03-11https://harmlesskey.com/compendium/spells/private-sanctum2023-03-11https://harmlesskey.com/compendium/spells/produce-flame2023-03-11https://harmlesskey.com/compendium/spells/programmed-illusion2023-03-11https://harmlesskey.com/compendium/spells/project-image2023-03-11https://harmlesskey.com/compendium/spells/protection-from-energy2023-03-11https://harmlesskey.com/compendium/spells/protection-from-evil-and-good2023-03-11https://harmlesskey.com/compendium/spells/protection-from-poison2023-03-11https://harmlesskey.com/compendium/spells/purify-food-and-drink2023-03-11https://harmlesskey.com/compendium/spells/raise-dead2023-03-11https://harmlesskey.com/compendium/spells/ray-of-enfeeblement2023-03-11https://harmlesskey.com/compendium/spells/ray-of-frost2023-03-11https://harmlesskey.com/compendium/spells/regenerate2023-03-11https://harmlesskey.com/compendium/spells/reincarnate2023-03-11https://harmlesskey.com/compendium/spells/remove-curse2023-03-11https://harmlesskey.com/compendium/spells/resilient-sphere2023-03-11https://harmlesskey.com/compendium/spells/resistance2023-03-11https://harmlesskey.com/compendium/spells/resurrection2023-03-11https://harmlesskey.com/compendium/spells/reverse-gravity2023-03-11https://harmlesskey.com/compendium/spells/revivify2023-03-11https://harmlesskey.com/compendium/spells/rope-trick2023-03-11https://harmlesskey.com/compendium/spells/sacred-flame2023-03-11https://harmlesskey.com/compendium/spells/sanctuary2023-03-11https://harmlesskey.com/compendium/spells/scorching-ray2023-03-11https://harmlesskey.com/compendium/spells/scrying2023-03-11https://harmlesskey.com/compendium/spells/secret-chest2023-03-11https://harmlesskey.com/compendium/spells/see-invisibility2023-03-11https://harmlesskey.com/compendium/spells/seeming2023-03-11https://harmlesskey.com/compendium/spells/sending2023-03-11https://harmlesskey.com/compendium/spells/sequester2023-03-11https://harmlesskey.com/compendium/spells/shapechange2023-03-11https://harmlesskey.com/compendium/spells/shatter2023-03-11https://harmlesskey.com/compendium/spells/shield2023-03-11https://harmlesskey.com/compendium/spells/shield-of-faith2023-03-11https://harmlesskey.com/compendium/spells/shillelagh2023-03-11https://harmlesskey.com/compendium/spells/shocking-grasp2023-03-11https://harmlesskey.com/compendium/spells/silence2023-03-11https://harmlesskey.com/compendium/spells/silent-image2023-03-11https://harmlesskey.com/compendium/spells/simulacrum2023-03-11https://harmlesskey.com/compendium/spells/sleep2023-03-11https://harmlesskey.com/compendium/spells/sleet-storm2023-03-11https://harmlesskey.com/compendium/spells/slow2023-03-11https://harmlesskey.com/compendium/spells/spare-the-dying2023-03-11https://harmlesskey.com/compendium/spells/speak-with-animals2023-03-11https://harmlesskey.com/compendium/spells/speak-with-dead2023-03-11https://harmlesskey.com/compendium/spells/speak-with-plants2023-03-11https://harmlesskey.com/compendium/spells/spider-climb2023-03-11https://harmlesskey.com/compendium/spells/spike-growth2023-03-11https://harmlesskey.com/compendium/spells/spirit-guardians2023-03-11https://harmlesskey.com/compendium/spells/spiritual-weapon2023-03-11https://harmlesskey.com/compendium/spells/stinking-cloud2023-03-11https://harmlesskey.com/compendium/spells/stone-shape2023-03-11https://harmlesskey.com/compendium/spells/stoneskin2023-03-11https://harmlesskey.com/compendium/spells/storm-of-vengeance2023-03-11https://harmlesskey.com/compendium/spells/suggestion2023-03-11https://harmlesskey.com/compendium/spells/sunbeam2023-03-11https://harmlesskey.com/compendium/spells/sunburst2023-03-11https://harmlesskey.com/compendium/spells/symbol2023-03-11https://harmlesskey.com/compendium/spells/telekinesis2023-03-11https://harmlesskey.com/compendium/spells/telepathic-bond2023-03-11https://harmlesskey.com/compendium/spells/teleport2023-03-11https://harmlesskey.com/compendium/spells/teleportation-circle2023-03-11https://harmlesskey.com/compendium/spells/thaumaturgy2023-03-11https://harmlesskey.com/compendium/spells/thunderwave2023-03-11https://harmlesskey.com/compendium/spells/time-stop2023-03-11https://harmlesskey.com/compendium/spells/tiny-hut2023-03-11https://harmlesskey.com/compendium/spells/tongues2023-03-11https://harmlesskey.com/compendium/spells/transport-via-plants2023-03-11https://harmlesskey.com/compendium/spells/tree-stride2023-03-11https://harmlesskey.com/compendium/spells/true-polymorph2023-03-11https://harmlesskey.com/compendium/spells/true-resurrection2023-03-11https://harmlesskey.com/compendium/spells/true-seeing2023-03-11https://harmlesskey.com/compendium/spells/true-strike2023-03-11https://harmlesskey.com/compendium/spells/unseen-servant2023-03-11https://harmlesskey.com/compendium/spells/vampiric-touch2023-03-11https://harmlesskey.com/compendium/spells/vicious-mockery2023-03-11https://harmlesskey.com/compendium/spells/wall-of-fire2023-03-11https://harmlesskey.com/compendium/spells/wall-of-force2023-03-11https://harmlesskey.com/compendium/spells/wall-of-ice2023-03-11https://harmlesskey.com/compendium/spells/wall-of-stone2023-03-11https://harmlesskey.com/compendium/spells/wall-of-thorns2023-03-11https://harmlesskey.com/compendium/spells/warding-bond2023-03-11https://harmlesskey.com/compendium/spells/water-breathing2023-03-11https://harmlesskey.com/compendium/spells/water-walk2023-03-11https://harmlesskey.com/compendium/spells/web2023-03-11https://harmlesskey.com/compendium/spells/weird2023-03-11https://harmlesskey.com/compendium/spells/wind-walk2023-03-11https://harmlesskey.com/compendium/spells/wind-wall2023-03-11https://harmlesskey.com/compendium/spells/wish2023-03-11https://harmlesskey.com/compendium/spells/word-of-recall2023-03-11https://harmlesskey.com/compendium/spells/zone-of-truth2023-03-11 \ No newline at end of file diff --git a/quasar.conf.js b/quasar.conf.js index 35bcad80a..ac4c49fe5 100644 --- a/quasar.conf.js +++ b/quasar.conf.js @@ -6,7 +6,7 @@ // Configuration for your app // https://v1.quasar.dev/quasar-cli/quasar-conf-js /* eslint-env node */ -const ESLintPlugin = require('eslint-webpack-plugin'); +const ESLintPlugin = require("eslint-webpack-plugin"); module.exports = function (/* ctx */) { return { @@ -20,16 +20,16 @@ module.exports = function (/* ctx */) { // --> boot files are part of "main.js" // https://v1.quasar.dev/quasar-cli/boot-files boot: [ - { path: 'plugins', server: false }, - { path: 'hk-components', server: false }, - { path: 'vee-validate', server: false }, - { path: 'firebase-auth', server: false }, - { path: 'vue-shortkey', server: false }, - { path: 'vue-snotify', server: false }, + { path: "plugins", server: false }, + { path: "hk-components", server: false }, + { path: "vee-validate", server: false }, + { path: "firebase-auth", server: false }, + { path: "vue-shortkey", server: false }, + { path: "vue-snotify", server: false }, ], // https://v1.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-css - css: ['styles.scss'], + css: ["styles.scss"], // https://github.com/quasarframework/quasar/tree/dev/extras extras: [ @@ -41,24 +41,27 @@ module.exports = function (/* ctx */) { // 'line-awesome', // 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both! - 'roboto-font', // optional, you are not bound to it - 'material-icons', // optional, you are not bound to it + "roboto-font", // optional, you are not bound to it + "material-icons", // optional, you are not bound to it ], // Full list of options: https://v1.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-build build: { - vueRouterMode: 'history', // available values: 'hash', 'history' - env: require('dotenv').config({ path: `.env.${process.env.NODE_ENV}.local` }).parsed, + vueRouterMode: "history", // available values: 'hash', 'history' + env: require("dotenv").config({ path: `.env.${process.env.NODE_ENV}.local` }).parsed, scssLoaderOptions: { additionalData: '@import "src/css/variables.scss";', }, vueCompiler: true, transpile: true, + // debugger + devtool: "source-map", + // Add dependencies for transpiling with Babel (Array of string/regex) // (from node_modules, which are by default not transpiled). // Applies only if "transpile" is set to true. - transpileDependencies: ['vee-validate/dist/rules', 'vue-numeral-filter'], + transpileDependencies: ["vee-validate/dist/rules", "vue-numeral-filter"], // rtl: false, // https://v1.quasar.dev/options/rtl-support // preloadChunks: true, @@ -72,7 +75,7 @@ module.exports = function (/* ctx */) { // https://v1.quasar.dev/quasar-cli/handling-webpack // "chain" is a webpack-chain object https://github.com/neutrinojs/webpack-chain chainWebpack(chain) { - chain.plugin('eslint-webpack-plugin').use(ESLintPlugin, [{ extensions: ['js', 'vue'] }]); + chain.plugin("eslint-webpack-plugin").use(ESLintPlugin, [{ extensions: ["js", "vue"] }]); }, }, @@ -85,14 +88,14 @@ module.exports = function (/* ctx */) { // https://v1.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-framework framework: { - iconSet: 'material-icons', // Quasar icon set - lang: 'en-us', // Quasar language pack + iconSet: "material-icons", // Quasar icon set + lang: "en-us", // Quasar language pack config: {}, // Possible values for "importStrategy": // * 'auto' - (DEFAULT) Auto-import needed Quasar components & directives // * 'all' - Manually specify what to import - importStrategy: 'auto', + importStrategy: "auto", // For special cases outside of where "auto" importStrategy can have an impact // (like functional components as one of the examples), @@ -102,7 +105,7 @@ module.exports = function (/* ctx */) { // directives: [], // Quasar plugins - plugins: ['AppFullscreen', 'Notify', 'Cookies', 'Meta'], + plugins: ["AppFullscreen", "Notify", "Cookies", "Meta"], }, // animations: 'all', // --- includes all animations @@ -116,108 +119,108 @@ module.exports = function (/* ctx */) { // https://v1.quasar.dev/quasar-cli/developing-pwa/configuring-pwa pwa: { - workboxPluginMode: 'GenerateSW', + workboxPluginMode: "GenerateSW", workboxOptions: { skipWaiting: true, clientsClaim: true, }, manifest: { - name: 'Harmless Key', - short_name: 'Harmless Key', - start_url: '.', + name: "Harmless Key", + short_name: "Harmless Key", + start_url: ".", description: - 'Harmless Key is the initiative tracker for D&D 5e. We keep track of everything in encounters so even during combat you can give your players the attention they deserve.', - orientation: 'portrait', - theme_color: '#191a1c', - background_color: '#191a1c', - display: 'standalone', - categories: ['games', 'entertainment'], + "Harmless Key is the initiative tracker for D&D 5e. We keep track of everything in encounters so even during combat you can give your players the attention they deserve.", + orientation: "portrait", + theme_color: "#191a1c", + background_color: "#191a1c", + display: "standalone", + categories: ["games", "entertainment"], icons: [ { - src: 'img/icons/transparent-512x512.png', - sizes: '512x512', - type: 'image/png', - purpose: 'any', + src: "img/icons/transparent-512x512.png", + sizes: "512x512", + type: "image/png", + purpose: "any", }, { - src: 'img/icons/maskable-512x512.png', - sizes: '512x512', - type: 'image/png', - purpose: 'maskable', + src: "img/icons/maskable-512x512.png", + sizes: "512x512", + type: "image/png", + purpose: "maskable", }, { - src: 'img/icons/transparent-192x192.png', - sizes: '192x192', - type: 'image/png', - purpose: 'any', + src: "img/icons/transparent-192x192.png", + sizes: "192x192", + type: "image/png", + purpose: "any", }, { - src: 'img/icons/maskable-192x192.png', - sizes: '192x192', - type: 'image/png', - purpose: 'maskable', + src: "img/icons/maskable-192x192.png", + sizes: "192x192", + type: "image/png", + purpose: "maskable", }, { - src: 'img/icons/ms/app-icon-44x44.png', - sizes: '44x44', - type: 'image/png', - purpose: 'any', + src: "img/icons/ms/app-icon-44x44.png", + sizes: "44x44", + type: "image/png", + purpose: "any", }, { - src: 'img/icons/ms/small-tile-71x71.png', - sizes: '71x71', - type: 'image/png', - purpose: 'any', + src: "img/icons/ms/small-tile-71x71.png", + sizes: "71x71", + type: "image/png", + purpose: "any", }, { - src: 'img/icons/ms/wide-tile-350x150.png', - sizes: '350x150', - type: 'image/png', - purpose: 'any', + src: "img/icons/ms/wide-tile-350x150.png", + sizes: "350x150", + type: "image/png", + purpose: "any", }, { - src: 'img/icons/ms/large-tile-310x310.png', - sizes: '310x310', - type: 'image/png', - purpose: 'any', + src: "img/icons/ms/large-tile-310x310.png", + sizes: "310x310", + type: "image/png", + purpose: "any", }, { - src: 'img/icons/ms/store-logo-50x50.png', - sizes: '50x50', - type: 'image/png', - purpose: 'any', + src: "img/icons/ms/store-logo-50x50.png", + sizes: "50x50", + type: "image/png", + purpose: "any", }, { - src: 'img/icons/ms/splash-screen-620x300.png', - sizes: '620x300', - type: 'image/png', - purpose: 'any', + src: "img/icons/ms/splash-screen-620x300.png", + sizes: "620x300", + type: "image/png", + purpose: "any", }, ], shortcuts: [ { - name: 'Campaigns', - description: 'The campaigns you are running.', - url: '/content/campaigns', + name: "Campaigns", + description: "The campaigns you are running.", + url: "/content/campaigns", icons: [ { - src: '/img/icons/shortcuts/campaigns-512x512.png', - sizes: '512x512', - type: 'image/png', - purpose: 'any', + src: "/img/icons/shortcuts/campaigns-512x512.png", + sizes: "512x512", + type: "image/png", + purpose: "any", }, ], }, { - name: 'Characters', - description: 'Your player characters.', - url: '/content/characters', + name: "Characters", + description: "Your player characters.", + url: "/content/characters", icons: [ { - src: '/img/icons/shortcuts/characters-512x512.png', - sizes: '512x512', - type: 'image/png', - purpose: 'any', + src: "/img/icons/shortcuts/characters-512x512.png", + sizes: "512x512", + type: "image/png", + purpose: "any", }, ], }, @@ -237,7 +240,7 @@ module.exports = function (/* ctx */) { // Full list of options: https://v1.quasar.dev/quasar-cli/developing-electron-apps/configuring-electron electron: { - bundler: 'packager', // 'packager' or 'builder' + bundler: "packager", // 'packager' or 'builder' packager: { // https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options @@ -253,7 +256,7 @@ module.exports = function (/* ctx */) { builder: { // https://www.electron.build/configuration/configuration - appId: 'hkq', + appId: "hkq", }, // More info: https://v1.quasar.dev/quasar-cli/developing-electron-apps/node-integration diff --git a/src/App.vue b/src/App.vue index 08499c8b2..d62033b41 100644 --- a/src/App.vue +++ b/src/App.vue @@ -41,6 +41,7 @@ + @@ -51,7 +52,7 @@

Nothing to see here

- {{ makeDate('2022-02-18T09:00:00.000Z', true) }} + {{ makeDate("2022-02-18T09:00:00.000Z", true) }}

No announcement

- - - - - - -
-

Install our app

-

Would you like to install Harmless Key on your device?

- -
-
- -
- - Google Play - -
-
-
-
diff --git a/src/assets/_img/atmosphere/tool-header/spells-tool-header.png b/src/assets/_img/atmosphere/tool-header/spells-tool-header.png new file mode 100644 index 000000000..c5bc9620f Binary files /dev/null and b/src/assets/_img/atmosphere/tool-header/spells-tool-header.png differ diff --git a/src/boot/firebase-auth.js b/src/boot/firebase-auth.js index 2f15c7a00..6cfd80134 100644 --- a/src/boot/firebase-auth.js +++ b/src/boot/firebase-auth.js @@ -1,42 +1,45 @@ -import { auth, db, firebase } from '../firebase'; -import { Cookies } from 'quasar'; +import { auth, db, firebase } from "../firebase"; +import { Cookies } from "quasar"; -export default async ({ app, router, store, Vue }) => { +export default async ({ app, router, store, Vue }) => { // Check if user is connected - auth.onAuthStateChanged(user => { - if(user) { + auth.onAuthStateChanged((user) => { + if (user) { const uid = user.uid; const userStatusDatabaseRef = db.ref(`/status/${uid}`); const userLiveDatabaseRef = db.ref(`/broadcast/${uid}`); - + // Set Cookie - user.getIdToken(true).then(async token => { - Cookies.set('access_token', token, { expires: 31 }); + user.getIdToken(true).then(async (token) => { + Cookies.set("access_token", token, { expires: 31, path: "/" }); }); const isOfflineForDatabase = { - state: 'offline', - last_change: firebase.database.ServerValue.TIMESTAMP - } + state: "offline", + last_change: firebase.database.ServerValue.TIMESTAMP, + }; const isOnlineForDatabase = { - state: 'online', - lastt_changed: firebase.database.ServerValue.TIMESTAMP - } + state: "online", + last_changed: firebase.database.ServerValue.TIMESTAMP, + }; + + db.ref(".info/connected").on("value", function (snapshot) { + if (!snapshot.val()) return; + + userStatusDatabaseRef + .onDisconnect() + .set(isOfflineForDatabase) + .then(function () { + userStatusDatabaseRef.set(isOnlineForDatabase); + }); - db.ref('.info/connected').on('value', function(snapshot) { - if(!snapshot.val()) return; - - userStatusDatabaseRef.onDisconnect().set(isOfflineForDatabase).then(function() { - userStatusDatabaseRef.set(isOnlineForDatabase); - }); - // Stop broadcast when connection is lost userLiveDatabaseRef.onDisconnect().remove(); }); } else { // Delete the cookie - Cookies.remove('access_token'); + Cookies.remove("access_token", { path: "/" }); } }); -} \ No newline at end of file +}; diff --git a/src/boot/hk-components.js b/src/boot/hk-components.js index b298d5ea2..26ec7adf9 100644 --- a/src/boot/hk-components.js +++ b/src/boot/hk-components.js @@ -1,37 +1,45 @@ -import HkTable from '../components/hk-components/hk-table'; -import HkCard from '../components/hk-components/hk-card'; -import HkCardDeck from '../components/hk-components/hk-card-deck'; -import HkRoll from '../components/hk-components/hk-roll'; -import HkAnimatedInteger from '../components/hk-components/hk-animated-integer'; -import HkDiceText from '../components/hk-components/hk-dice-text'; -import HkPopover from '../components/hk-components/hk-popover'; -import HkLoader from '../components/hk-components/hk-loader'; -import HkDmgTypeSelect from '../components/hk-components/hk-dmg-type-select'; -import HkTip from '../components/hk-components/hk-tip'; -import HkTimer from '../components/hk-components/hk-timer'; -import HkShare from '../components/hk-components/hk-share-button'; -import HkImageUploader from '../components/hk-components/hk-image-uploader'; -import HkBackgroundSelect from '../components/hk-components/hk-background-select'; -import HkMarkdownEditor from '../components/hk-components/hk-markdown-editor'; -import HkXpBar from '../components/hk-components/hk-xp-bar'; -import HkLinkCharacter from '../components/hk-components/hk-link-character'; +import HkTable from "../components/hk-components/hk-table"; +import HkCard from "../components/hk-components/hk-card"; +import HkCardDeck from "../components/hk-components/hk-card-deck"; +import HkRoll from "../components/hk-components/hk-roll"; +import HkRollAction from "../components/hk-components/hk-action-rolls/hk-roll-action"; +import HkAnimatedInteger from "../components/hk-components/hk-animated-integer"; +import HkDiceText from "../components/hk-components/hk-dice-text"; +import HkPopover from "../components/hk-components/hk-popover"; +import HkLoader from "../components/hk-components/hk-loader"; +import HkDmgTypeSelect from "../components/hk-components/hk-dmg-type-select"; +import HkTip from "../components/hk-components/hk-tip"; +import HkTimer from "../components/hk-components/hk-timer"; +import HkShare from "../components/hk-components/hk-share-button"; +import HkImageUploader from "../components/hk-components/hk-image-uploader"; +import HkBackgroundSelect from "../components/hk-components/hk-background-select"; +import HkMarkdownEditor from "../components/hk-components/hk-markdown-editor"; +import HkXpBar from "../components/hk-components/hk-xp-bar"; +import HkLinkCharacter from "../components/hk-components/hk-link-character"; +import HkActionRollForm from "../components/hk-components/hk-action-rolls/hk-action-roll-form"; +import HkActionRollsTable from "../components/hk-components/hk-action-rolls/hk-action-rolls-table"; +import HkActionRollScaling from "../components/hk-components/hk-action-rolls/hk-action-roll-scaling"; export default async ({ Vue }) => { - Vue.component('hk-table', HkTable); - Vue.component('hk-card', HkCard); - Vue.component('hk-card-deck', HkCardDeck); - Vue.component('hk-animated-integer', HkAnimatedInteger); - Vue.component('hk-roll', HkRoll); - Vue.component('hk-loader', HkLoader); - Vue.component('hk-dice-text', HkDiceText); - Vue.component('hk-popover', HkPopover); - Vue.component('hk-dmg-type-select', HkDmgTypeSelect); - Vue.component('hk-tip', HkTip); - Vue.component('hk-timer', HkTimer); - Vue.component('hk-share', HkShare); - Vue.component('hk-image-uploader', HkImageUploader); - Vue.component('hk-background-select', HkBackgroundSelect); - Vue.component('hk-markdown-editor', HkMarkdownEditor); - Vue.component('hk-xp-bar', HkXpBar); - Vue.component('hk-link-character', HkLinkCharacter); -}; \ No newline at end of file + Vue.component("hk-table", HkTable); + Vue.component("hk-card", HkCard); + Vue.component("hk-card-deck", HkCardDeck); + Vue.component("hk-animated-integer", HkAnimatedInteger); + Vue.component("hk-roll", HkRoll); + Vue.component("hk-roll-action", HkRollAction); + Vue.component("hk-loader", HkLoader); + Vue.component("hk-dice-text", HkDiceText); + Vue.component("hk-popover", HkPopover); + Vue.component("hk-dmg-type-select", HkDmgTypeSelect); + Vue.component("hk-tip", HkTip); + Vue.component("hk-timer", HkTimer); + Vue.component("hk-share", HkShare); + Vue.component("hk-image-uploader", HkImageUploader); + Vue.component("hk-background-select", HkBackgroundSelect); + Vue.component("hk-markdown-editor", HkMarkdownEditor); + Vue.component("hk-xp-bar", HkXpBar); + Vue.component("hk-link-character", HkLinkCharacter); + Vue.component("hk-action-roll-form", HkActionRollForm); + Vue.component("hk-action-rolls-table", HkActionRollsTable); + Vue.component("hk-action-roll-scaling", HkActionRollScaling); +}; diff --git a/src/boot/plugins.js b/src/boot/plugins.js index a515deb7c..5fc7b921e 100644 --- a/src/boot/plugins.js +++ b/src/boot/plugins.js @@ -1,10 +1,10 @@ import VueFire from "vuefire"; import VueCookies from "vue-cookies"; -import VueAnalytics from "vue-analytics"; import VueGtag from "vue-gtag"; import numeral from "vue-numeral-filter"; import "animate.css"; import Croppa from "vue-croppa"; +import { Cookies } from "quasar"; export default async ({ router, Vue }) => { Vue.config.productionTip = false; @@ -16,14 +16,11 @@ export default async ({ router, Vue }) => { require("../functions.js"); - Vue.use(VueAnalytics, { - id: "UA-134177767-1", - router, - }); Vue.use( VueGtag, { config: { id: "G-KDSNCEK6X7" }, + bootstrap: !!Cookies.get("cookie_consent"), }, router ); diff --git a/src/components/ActionRoll.vue b/src/components/ActionRoll.vue deleted file mode 100644 index 9729c0949..000000000 --- a/src/components/ActionRoll.vue +++ /dev/null @@ -1,472 +0,0 @@ - - - - - diff --git a/src/components/CookieConsent.vue b/src/components/CookieConsent.vue new file mode 100644 index 000000000..a7824c583 --- /dev/null +++ b/src/components/CookieConsent.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/src/components/CopyContent.vue b/src/components/CopyContent.vue index 7bd23c398..f42ea1a0b 100644 --- a/src/components/CopyContent.vue +++ b/src/components/CopyContent.vue @@ -1,7 +1,7 @@ \ No newline at end of file +.q-item { + margin-bottom: 1px; +} + diff --git a/src/components/Footer.vue b/src/components/Footer.vue index 8a243bc51..8ff542050 100644 --- a/src/components/Footer.vue +++ b/src/components/Footer.vue @@ -16,12 +16,6 @@
  • Documentation
  • About us
  • -

    Tools

    -

    Follow us

    @@ -61,6 +55,7 @@
  • Campaigns
  • Players
  • NPC's
  • +
  • Spells
  • Reminders
  • Items
  • @@ -78,6 +73,15 @@
    +
    +

    Tools

    + +
    @@ -151,10 +155,11 @@ export default { display: flex; justify-content: flex-start; flex-wrap: wrap; + column-gap: 25px; + max-width: 450px; > div { width: max-content; - padding-right: 20px; &:last-child { padding: 0; @@ -163,7 +168,6 @@ export default { ul { padding: 0; list-style: none; - margin: 0 0 30px 0; a { font-size: 12px; @@ -193,7 +197,7 @@ export default { background-color: $neutral-10; } } -@media (max-width: 745px) { +@media (max-width: 772px) { .footer .top .content { justify-content: center; diff --git a/src/components/ImportContent.vue b/src/components/ImportContent.vue new file mode 100644 index 000000000..793f648b8 --- /dev/null +++ b/src/components/ImportContent.vue @@ -0,0 +1,542 @@ + + + + + diff --git a/src/components/ImportNPC.vue b/src/components/ImportNPC.vue deleted file mode 100644 index d58ff9474..000000000 --- a/src/components/ImportNPC.vue +++ /dev/null @@ -1,404 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/Sidebar.vue b/src/components/Sidebar.vue index cf366b021..9131e434f 100644 --- a/src/components/Sidebar.vue +++ b/src/components/Sidebar.vue @@ -46,13 +46,26 @@