-
\ No newline at end of file
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupAbilities = exports.updateAbilitiesWithServer = exports.getFormattedAbility = exports.getAbilityShortName = exports.getAbilityMod = exports.getAbilityNameFromShortName = exports.getMod = exports.getAbilityScore = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilityChecks = __webpack_require__(6);
+
+var _actions = __webpack_require__(4);
+
+var _equipment = __webpack_require__(10);
+
+var _hitDice = __webpack_require__(11);
+
+var _savingThrows = __webpack_require__(8);
+
+var _server = __webpack_require__(1);
+
+var _spells = __webpack_require__(5);
+
+var _utilities = __webpack_require__(0);
+
+var getAbilityScore = exports.getAbilityScore = function getAbilityScore(data, ability) {
+ var abilityScore = void 0;
+ ability = ability.toLowerCase();
+ if (ability === 'finesse') {
+ return Math.max(getAbilityScore(data, 'strength'), getAbilityScore(data, 'dexterity'));
+ } else if (!data || !ability || !data[ability]) {
+ abilityScore = 0;
+ } else {
+ abilityScore = parseFloat(data[ability]);
+ if ((0, _utilities.exists)(data[ability + '_score_modifier']) && !isNaN(data[ability + '_score_modifier'])) {
+ abilityScore += parseFloat(data[ability + '_score_modifier']);
+ }
+ if ((0, _utilities.exists)(data.ability_score_modifier) && !isNaN(data[ability + '_score_modifier'])) {
+ abilityScore += parseFloat(data.ability_score_modifier);
+ }
+ }
+ return abilityScore;
+}; /* global on:false */
+
+var getMod = exports.getMod = function getMod(score) {
+ return Math.floor((parseFloat(score) - 10) / 2);
+};
+
+var getAbilityNameFromShortName = exports.getAbilityNameFromShortName = function getAbilityNameFromShortName(varName) {
+ if ((0, _utilities.isZero)(varName)) {
+ varName = 0;
+ } else if (typeof varName === 'string') {
+ var longNames = {
+ CHA: 'charisma',
+ CON: 'constitution',
+ DEX: 'dexterity',
+ FIN: 'finesse',
+ HON: 'honor',
+ INT: 'intelligence',
+ SAN: 'sanity',
+ STR: 'strength',
+ WIS: 'wisdom'
+ };
+ varName = longNames[varName];
+ }
+ return varName;
+};
+
+var getAbilityMod = exports.getAbilityMod = function getAbilityMod(data, ability) {
+ if ((0, _utilities.isUndefinedOrZero)(ability)) {
+ return 0;
+ } else if (ability && ability.length === 3) {
+ return getAbilityMod(data, getAbilityNameFromShortName(ability));
+ }
+ return getMod(getAbilityScore(data, ability));
+};
+
+var getAbilityShortName = exports.getAbilityShortName = function getAbilityShortName(varName, capital) {
+ if (!varName) {
+ return 'Str';
+ }
+ if (typeof varName === 'string') {
+ varName = varName.replace(/\W/g, '');
+ }
+ if (capital) {
+ varName = (0, _utilities.capitalize)(varName);
+ }
+ return varName.substring(0, 3);
+};
+
+var getFormattedAbility = exports.getFormattedAbility = function getFormattedAbility(ability) {
+ if (!ability) {
+ return 'STR';
+ } else if (typeof ability === 'string') {
+ ability = ability.replace(/\W/g, '').toUpperCase().substring(0, 3);
+ }
+ return ability;
+};
+
+var updateAbilities = function updateAbilities(data) {
+ var originalValues = {};
+ var abilitiesUpdated = [];
+ _constants.ABILITIES.forEach(function (ability) {
+ originalValues[ability] = data[ability + '_calculated'];
+ data[ability + '_calculated'] = getAbilityScore(data, ability);
+ data[ability + '_mod'] = getAbilityMod(data, ability);
+
+ data[ability + '_mod_with_sign'] = (0, _utilities.showSign)(data[ability + '_mod']);
+
+ if (ability === 'strength' || ability === 'dexterity') {
+ data.finesse_mod = Math.max(getAbilityMod(data, 'strength'), getAbilityMod(data, 'dexterity'));
+ }
+ if (data[ability + '_calculated'] !== originalValues[ability]) {
+ abilitiesUpdated.push(ability);
+ }
+ });
+ return abilitiesUpdated;
+};
+
+var updateAbilitiesWithServer = exports.updateAbilitiesWithServer = function updateAbilitiesWithServer(callback) {
+ var abilitiesUpdated = void 0;
+ (0, _server.getSetItems)('updateAbilitiesWithServer', {
+ collectionArray: _constants.FIELDS.abilityScores.concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_calculated';
+ })).concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_mod';
+ })).concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_mod_with_sign';
+ })),
+ process: function process(data) {
+ abilitiesUpdated = updateAbilities(data);
+ },
+ processCallback: function processCallback() {
+ if (callback) {
+ callback();
+ }
+ if (abilitiesUpdated.length > 0) {
+ (0, _abilityChecks.updateSkill)();
+ (0, _abilityChecks.updateAbilityChecks)();
+ (0, _actions.updateAllActions)();
+ // updateProvidedAttacks();
+ (0, _equipment.updateArmor)();
+ if (abilitiesUpdated.includes('strength')) {
+ (0, _equipment.updateCarryingCapacity)();
+ }
+ if (abilitiesUpdated.includes('constitution')) {
+ (0, _hitDice.updateHitDice)();
+ }
+ (0, _spells.updateSpells)();
+ (0, _spells.updateDCAndAttack)();
+ (0, _savingThrows.updateAllSavingThrows)();
+ }
+ }
+ });
+};
+
+var setupAbilities = exports.setupAbilities = function setupAbilities() {
+ var abilityWatch = _constants.ABILITIES.map(function (ability) {
+ return 'change:' + ability;
+ }).join(' ');
+ on(abilityWatch, function () {
+ updateAbilitiesWithServer();
+ });
+};
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupActions = exports.updateProvidedAttacks = exports.updateChatMacroForAll = exports.updateAllActions = exports.updateAllActionsWithAttack = exports.updateActions = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilities = __webpack_require__(3);
+
+var _actionComponents = __webpack_require__(15);
+
+var _attack = __webpack_require__(12);
+
+var _equipment = __webpack_require__(10);
+
+var _heal = __webpack_require__(16);
+
+var _savingThrow = __webpack_require__(17);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+var updateChatMacro = function updateChatMacro(types) {
+ (0, _server.getSetItems)('updateChatMacro', {
+ collectionArray: types.map(function (type) {
+ return type + 's_macro_var';
+ }).concat(types.map(function (type) {
+ return type + 's_chat_var';
+ })),
+ collectionArrayRepeatingSections: types.map(function (type) {
+ return {
+ collectionArrayAddItems: ['name', 'content'].concat(_constants.REPEATING_FIELDS.uses).concat(_constants.REPEATING_FIELDS.recharge).concat(_constants.REPEATING_FIELDS.cost),
+ name: 'repeating_' + type
+ };
+ }),
+ process: function process(data, repStrings) {
+ var actions = {};
+
+ repStrings.forEach(function (repString) {
+ var section = (0, _utilities.getRepeatingSectionOfRepeatingString)(repString);
+ var action = {
+ name: data[repString + '_name']
+ };
+ if (section === 'lairaction') {
+ action.name = data[repString + '_content'];
+ } else if (section === 'regionaleffect') {
+ action.name = data[repString + '_content'];
+ }
+
+ if (action.name && action.name.length > 50) {
+ action.name = action.name.substring(0, 50) + '...';
+ }
+
+ (0, _actionComponents.updateUsesForChatMacro)(data, repString, action);
+
+ var buttonName = 'action';
+ if (section === 'trait') {
+ buttonName = section;
+ }
+ if (section === 'offense' || section === 'utility') {
+ buttonName = 'roll';
+ }
+ if (!actions[section]) {
+ actions[section] = [];
+ }
+ actions[section].push('[' + action.name + '](~' + repString + '_' + buttonName + ')');
+ });
+
+ types.forEach(function (type) {
+ var title = '';
+ var name = type + 's';
+ if (type === 'offense') {
+ title = 'Offense';
+ name = 'offense';
+ } else if (type === 'utility') {
+ title = 'Utility';
+ name = 'utility';
+ } else if (type === 'racialtrait') {
+ title = 'Racial Traits';
+ } else if (type === 'classfeature') {
+ title = 'Class Features';
+ } else if (type === 'feat') {
+ title = 'Feats';
+ } else if (type === 'trait') {
+ title = 'Traits';
+ } else if (type === 'action') {
+ title = 'Actions';
+ } else if (type === 'reaction') {
+ title = 'Reactions';
+ } else if (type === 'legendaryaction') {
+ title = 'Legendary Actions';
+ } else if (type === 'lairaction') {
+ title = 'Lair Actions';
+ } else if (type === 'regionaleffect') {
+ title = 'Regional Effects';
+ }
+
+ if ((0, _utilities.exists)(actions[type])) {
+ data[name + '_macro_var'] = actions[type].join(', ');
+ if (actions[type].length > 0) {
+ data[name + '_chat_var'] = '{{' + title + '=' + data[name + '_macro_var'] + '}}';
+ } else {
+ data[name + '_chat_var'] = '';
+ }
+ } else {
+ data[name + '_macro_var'] = '';
+ data[name + '_chat_var'] = '';
+ }
+ });
+ }
+ });
+}; /* global on:false, removeRepeatingRow:false, getTranslationByKey:false */
+
+var updateActions = exports.updateActions = function updateActions(types, repeatingInfo) {
+ var collectionArray = _constants.FIELDS.pb.concat(['distance_system']).concat(_constants.FIELDS.abilityScores).concat(_constants.FIELDS.d20).concat(_constants.FIELDS.savingThrow).concat(_constants.FIELDS.attackModifier).concat(_constants.FIELDS.weaponAttackModifier).concat(_constants.FIELDS.meleeWeaponAttackModifier).concat(_constants.FIELDS.rangedWeaponAttackModifier).concat(_constants.FIELDS.spellAttackModifier).concat(_constants.FIELDS.damageModifier).concat(_constants.FIELDS.weaponDamageModifier).concat(_constants.FIELDS.meleeWeaponDamageModifier).concat(_constants.FIELDS.rangedWeaponDamageModifier).concat(_constants.FIELDS.spellDamageModifier).concat(_constants.FIELDS.attacksVs).concat(_constants.FIELDS.automaticDamage).concat(['show_dice_modifiers', 'critical_damage_houserule', 'savage_attacks', 'class_feature_barbarian_brutal_critical_toggle', 'barbarian_level']).concat(['use_custom_saving_throws']).concat(['weight_system', 'weight_offense', 'weight_utility']);
+
+ _constants.CUSTOM_SAVING_THROWS.forEach(function (customSavingThrow) {
+ collectionArray = collectionArray.concat(_constants.ABILITIES.map(function (ability) {
+ return customSavingThrow + '_' + ability;
+ }));
+ });
+
+ var collectionArrayAddItems = _constants.REPEATING_FIELDS.default.concat(_constants.REPEATING_FIELDS.uses).concat(_constants.REPEATING_FIELDS.cost).concat(_constants.REPEATING_FIELDS.recharge).concat(_constants.REPEATING_FIELDS.content).concat(_constants.REPEATING_FIELDS.attack).concat(_constants.REPEATING_FIELDS.attackDamage).concat(_constants.REPEATING_FIELDS.attackSecondDamage).concat(_constants.REPEATING_FIELDS.savingThrow).concat(_constants.REPEATING_FIELDS.savingThrowDamage).concat(_constants.REPEATING_FIELDS.savingThrowSecondDamage).concat(_constants.REPEATING_FIELDS.otherDamage).concat(_constants.REPEATING_FIELDS.otherSecondDamage).concat(_constants.REPEATING_FIELDS.heal).concat(_constants.REPEATING_FIELDS.extras);
+
+ if (types.includes('trait')) {
+ collectionArray = collectionArray.concat(['spellcasting_class', 'innate_spellcasting', 'spellcasting']);
+ }
+ if (types.includes('offense') || types.includes('utility')) {
+ collectionArrayAddItems = collectionArrayAddItems.concat(_constants.REPEATING_FIELDS.weight).concat(['carried']);
+ }
+ if (types.includes('offense')) {
+ collectionArrayAddItems = collectionArrayAddItems.concat(_constants.REPEATING_FIELDS.ammo);
+ }
+
+ (0, _server.getSetItems)('update ' + types.join(', ') + ' ' + (repeatingInfo ? repeatingInfo.rowId : ''), {
+ collectionArray: collectionArray,
+ collectionArrayRepeatingSections: types.map(function (type) {
+ return {
+ collectionArrayAddItems: collectionArrayAddItems,
+ name: 'repeating_' + type,
+ repeatingInfo: repeatingInfo
+ };
+ }),
+ process: function process(data, repStrings) {
+ if (!repeatingInfo || !repeatingInfo.rowId) {
+ if (types.includes('offense')) {
+ data.weight_offense = 0;
+ }
+ if (types.includes('utility')) {
+ data.weight_utility = 0;
+ }
+ }
+ repStrings.forEach(function (repString) {
+ var section = (0, _utilities.getRepeatingSectionOfRepeatingString)(repString);
+ if (section !== 'lairaction' && section !== 'regionaleffect' && (0, _utilities.isUndefinedOrEmpty)(data[repString + '_name'])) {
+ removeRepeatingRow(repString);
+ } else {
+ data[repString + '_roll_formula'] = '';
+
+ (0, _actionComponents.parseActionComponents)(data, repString);
+ (0, _actionComponents.updateUses)(data, repString);
+ (0, _actionComponents.updateRecharge)(data, repString);
+ if (section === 'legendaryaction') {
+ (0, _actionComponents.updateCost)(data, repString);
+ }
+ if (section === 'offense' || section === 'action' || section === 'reaction' || section === 'legendaryaction' || section === 'lairaction' || section === 'regionaleffect') {
+ (0, _attack.updateAttack)({
+ data: data,
+ repeatingInfo: repeatingInfo,
+ repString: repString
+ });
+ }
+ (0, _savingThrow.updateSavingThrow)({
+ data: data,
+ repeatingInfo: repeatingInfo,
+ repString: repString
+ });
+ if (section === 'offense' || section === 'utility') {
+ if (section === 'offense') {
+ (0, _actionComponents.changeWeightSystem)(data, repString);
+ (0, _actionComponents.updateAmmo)(data, repString);
+ (0, _actionComponents.weighActionComponents)(data, repString, {
+ repeatingInfo: repeatingInfo,
+ repeatingSectionTotal: 'weight_offense',
+ toggle: 'carried'
+ });
+ } else if (section === 'utility') {
+ (0, _actionComponents.changeWeightSystem)(data, repString);
+ (0, _actionComponents.weighActionComponents)(data, repString, {
+ repeatingInfo: repeatingInfo,
+ repeatingSectionTotal: 'weight_utility',
+ toggle: 'carried'
+ });
+ }
+ }
+ if (section !== 'utility') {
+ (0, _actionComponents.updateOtherDamage)(data, repString, repeatingInfo);
+ }
+ if (section !== 'offense') {
+ (0, _heal.updateHeal)(data, repString);
+ }
+ (0, _actionComponents.updateContent)(data, repString);
+ (0, _actionComponents.updateExtras)(data, repString);
+ }
+ });
+ if (types.includes('offense')) {
+ data.weight_offense = (0, _utilities.round)(data.weight_offense);
+ }
+ if (types.includes('utility')) {
+ data.weight_utility = (0, _utilities.round)(data.weight_utility);
+ }
+ },
+ processCallback: function processCallback() {
+ updateChatMacro(types);
+ if (types.includes('offense') || types.includes('utility')) {
+ (0, _equipment.updateWeight)();
+ }
+ }
+ });
+};
+
+var updateAllActionsWithAttack = exports.updateAllActionsWithAttack = function updateAllActionsWithAttack() {
+ updateActions(['offense', 'action', 'reaction', 'legendaryaction', 'lairaction', 'regionaleffect']);
+};
+
+var updateAllActions = exports.updateAllActions = function updateAllActions() {
+ updateActions(_constants.ACTION_TYPES);
+};
+
+var updateChatMacroForAll = exports.updateChatMacroForAll = function updateChatMacroForAll() {
+ updateChatMacro(_constants.ACTION_TYPES);
+};
+
+var updateProvidedAttacks = exports.updateProvidedAttacks = function updateProvidedAttacks() {
+ (0, _server.getSetItems)('updateAttacks', {
+ collectionArray: _constants.FIELDS.pb.concat(_constants.FIELDS.abilityScores).concat(_constants.FIELDS.d20).concat(_constants.FIELDS.attackModifier).concat(_constants.FIELDS.weaponAttackModifier).concat(_constants.FIELDS.meleeWeaponAttackModifier).concat(_constants.FIELDS.rangedWeaponAttackModifier).concat(_constants.FIELDS.attacksVs).concat(['melee_attack_to_hit', 'ranged_attack_to_hit']),
+ process: function process(data) {
+ var pb = (0, _utilities.getPB)(data);
+ var strMod = (0, _abilities.getAbilityMod)(data, 'strength');
+ var dexMod = (0, _abilities.getAbilityMod)(data, 'dexterity');
+ data.melee_attack_roll_formula = strMod;
+ data.ranged_attack_roll_formula = dexMod;
+ if ((0, _utilities.exists)(pb) && !isNaN(pb)) {
+ data.melee_attack_to_hit += pb;
+ data.ranged_attack_to_hit += pb;
+ }
+ data.melee_attack_to_hit_formula = (0, _utilities.addTo)(data.melee_attack_to_hit_formula, pb + '[' + getTranslationByKey('PROFICIENT').toLowerCase() + ']');
+ data.ranged_attack_to_hit_formula = (0, _utilities.addTo)(data.ranged_attack_to_hit_formula, pb + '[' + getTranslationByKey('PROFICIENT').toLowerCase() + ']');
+ data.ranged_attack_to_hit_formula = (0, _utilities.addTo)(data.ranged_attack_to_hit_formula, pb + '[' + getTranslationByKey('PROFICIENT').toLowerCase() + ']');
+
+ (0, _utilities.addModifier)(data, data, 'attack', 'melee_attack_to_hit', 'melee_attack_to_hit_formula', '' + getTranslationByKey('ATTACK_MODIFIER').toLowerCase());
+ (0, _utilities.addModifier)(data, data, 'attack', 'ranged_attack_to_hit', 'ranged_attack_to_hit_formula', '' + getTranslationByKey('ATTACK_MODIFIER').toLowerCase());
+ (0, _utilities.addModifier)(data, data, 'weapon_attack', 'melee_attack_to_hit', 'melee_attack_to_hit_formula', '' + getTranslationByKey('WEAPON_ATTACK_MODIFIER').toLowerCase());
+ (0, _utilities.addModifier)(data, data, 'weapon_attack', 'ranged_attack_to_hit', 'ranged_attack_to_hit_formula', '' + getTranslationByKey('WEAPON_ATTACK_MODIFIER').toLowerCase());
+ (0, _utilities.addModifier)(data, data, 'melee_weapon_attack', 'melee_attack_to_hit', 'melee_attack_to_hit_formula', '' + getTranslationByKey('MELEE_WEAPON_ATTACK_MODIFIER').toLowerCase());
+ (0, _utilities.addModifier)(data, data, 'ranged_weapon_attack', 'ranged_attack_to_hit', 'ranged_attack_to_hit_formula', '' + getTranslationByKey('RANGED_WEAPON_ATTACK_MODIFIER').toLowerCase());
+
+ data.melee_attack_to_hit = (0, _utilities.showSign)(data.melee_attack_to_hit);
+ data.ranged_attack_to_hit = (0, _utilities.showSign)(data.ranged_attack_to_hit);
+ data.melee_attack_to_hit_formula = '{{attack1=[[@{shaped_d20}@{d20_mod} + ' + data.melee_attack_roll_formula + ']]}}';
+ data.ranged_attack_to_hit_formula = '{{attack1=[[@{shaped_d20}@{d20_mod} + ' + data.ranged_attack_roll_formula + ']]}}';
+ if (data.shaped_d20 === '1d20') {
+ data.melee_attack_to_hit_formula += ' {{attack2=[[@{shaped_d20}@{d20_mod} + ' + data.melee_attack_roll_formula + ']]}}';
+ data.ranged_attack_to_hit_formula += ' {{attack2=[[@{shaped_d20}@{d20_mod} + ' + data.ranged_attack_roll_formula + ']]}}';
+ }
+ if ((0, _utilities.exists)(data.attacks_vs_target_ac)) {
+ data.melee_attack_to_hit_formula += ' {{targetName=@{target|token_name}}}';
+ data.ranged_attack_to_hit_formula += ' {{targetName=@{target|token_name}}}';
+ }
+ if ((0, _utilities.exists)(data.attacks_vs_target_name)) {
+ data.melee_attack_to_hit_formula += ' {{targetName=@{target|token_name}}}';
+ data.ranged_attack_to_hit_formula += ' {{targetName=@{target|token_name}}}';
+ }
+ }
+ });
+};
+
+var setupActions = exports.setupActions = function setupActions() {
+ on('change:distance_system', function () {
+ updateAllActions();
+ });
+ on('change:ammo_auto_use change:weight_system', function () {
+ updateActions(['offense', 'utility']);
+ });
+ _constants.ACTION_TYPES.forEach(function (type) {
+ on('change:repeating_' + type, function (eventInfo) {
+ var repeatingInfo = (0, _utilities.getRepeatingInfo)('repeating_' + type, eventInfo);
+ if (repeatingInfo && repeatingInfo.field !== 'toggle_details') {
+ updateActions([type], repeatingInfo);
+ updateChatMacro([type]);
+ }
+ });
+ on('change:_reporder_repeating_' + type, function () {
+ updateChatMacro([type]);
+ });
+ on('remove:repeating_' + type, function () {
+ if (type === 'offense' || type === 'utility') {
+ updateActions([type]);
+ }
+ updateChatMacro([type]);
+ });
+ });
+};
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupSpells = exports.parseSpellFromSRDWithServer = exports.parseSpellFromSRD = exports.parseLevel = exports.cleanContent = exports.findSpellcasting = exports.updateHasSpellPoints = exports.updateHasWarlockSlots = exports.updateHasSpellSlots = exports.setSpellSlots = exports.updateSpellSlots = exports.generateHigherLevelQueries = exports.updateWarlockSlotsRemaining = exports.updateWarlockSlots = exports.updateSpellSlotsRemaining = exports.countSpells = exports.updateSpells = exports.updateSpellsChatMacro = exports.updateDCAndAttack = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilities = __webpack_require__(3);
+
+var _actionComponents = __webpack_require__(15);
+
+var _actions = __webpack_require__(4);
+
+var _attack = __webpack_require__(12);
+
+var _distance = __webpack_require__(9);
+
+var _heal = __webpack_require__(16);
+
+var _savingThrow = __webpack_require__(17);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+var _processing = __webpack_require__(7);
+
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } /* global on:false, generateRowID:false, removeRepeatingRow:false, getTranslationByKey:false */
+
+var updateSpellAbility = function updateSpellAbility() {
+ (0, _server.getSetItems)('updateSpellAbility', {
+ collectionArray: ['spell_ability'],
+ collectionArrayRepeatingSections: _constants.SPELL_LEVELS.map(function (spellLevel) {
+ return {
+ collectionArrayAddItems: ['name', 'attack_toggle', 'attack_ability', 'attack_damage_ability', 'attack_second_damage_ability', 'saving_throw_toggle', 'saving_throw_ability', 'saving_throw_damage_ability', 'saving_throw_second_damage_ability', 'other_damage_toggle', 'other_damage_ability', 'other_second_damage_ability', 'heal_toggle', 'heal_ability'],
+ name: 'repeating_spell' + spellLevel
+ };
+ }),
+ process: function process(data, repStrings) {
+ repStrings.forEach(function (repString) {
+ if ((0, _utilities.isUndefinedOrEmpty)(data[repString + '_name'])) {
+ removeRepeatingRow(repString);
+ } else if (data.spell_ability) {
+ var spellAbility = (0, _abilities.getFormattedAbility)(data.spell_ability);
+ if ((0, _utilities.exists)(data[repString + '_attack_toggle'])) {
+ data[repString + '_attack_ability'] = spellAbility;
+ data[repString + '_attack_damage_ability'] = spellAbility;
+ if ((0, _utilities.exists)(data[repString + '_attack_second_damage_ability'])) {
+ data[repString + '_attack_second_damage_ability'] = spellAbility;
+ }
+ }
+ if ((0, _utilities.exists)(data[repString + '_saving_throw_toggle'])) {
+ data[repString + '_saving_throw_ability'] = spellAbility;
+ if ((0, _utilities.exists)(data[repString + '_saving_throw_damage_ability'])) {
+ data[repString + '_saving_throw_damage_ability'] = spellAbility;
+ }
+ if ((0, _utilities.exists)(data[repString + '_saving_throw_second_damage_ability'])) {
+ data[repString + '_saving_throw_second_damage_ability'] = spellAbility;
+ }
+ }
+ if ((0, _utilities.exists)(data[repString + '_other_damage_toggle'])) {
+ if ((0, _utilities.exists)(data[repString + '_other_damage_ability'])) {
+ data[repString + '_other_damage_ability'] = spellAbility;
+ }
+ if ((0, _utilities.exists)(data[repString + '_other_second_damage_ability'])) {
+ data[repString + '_other_second_damage_ability'] = spellAbility;
+ }
+ }
+ if ((0, _utilities.exists)(data[repString + '_heal_toggle']) && (0, _utilities.exists)(data[repString + '_heal_ability'])) {
+ data[repString + '_heal_ability'] = spellAbility;
+ }
+ }
+ });
+ }
+ });
+};
+
+var updateConcentration = function updateConcentration(data, repString) {
+ if ((0, _utilities.exists)(data[repString + '_duration']) && data[repString + '_duration'].includes('CONCENTRATION')) {
+ data[repString + '_concentration'] = 'Yes';
+ } else {
+ data[repString + '_concentration'] = '';
+ }
+};
+
+var updateRitual = function updateRitual(data, repString) {
+ if (data[repString + '_ritual'] === 'Yes') {
+ data[repString + '_ritual_output'] = '?{Cast as|Ritual,{{ritual=1}}|Spell,}';
+ } else {
+ data[repString + '_ritual_output'] = '';
+ }
+};
+
+var updateMaterials = function updateMaterials(data, repString) {
+ if (!(0, _utilities.isUndefinedOrEmpty)(data[repString + '_materials'])) {
+ data[repString + '_materials_show'] = 1;
+ } else if (!(0, _utilities.isUndefinedOrEmpty)(data[repString + '_materials_show'])) {
+ data[repString + '_materials_show'] = 0;
+ }
+};
+
+var updateRange = function updateRange(data, repString) {
+ if ((0, _utilities.exists)(data[repString + '_range'])) {
+ (0, _distance.convertDistance)(data, repString + '_range');
+ }
+};
+
+var updateDCAndAttack = exports.updateDCAndAttack = function updateDCAndAttack() {
+ (0, _server.getSetItems)('updateDCAndAttack', {
+ collectionArray: _constants.FIELDS.pb.concat(_constants.FIELDS.abilityScores).concat(_constants.FIELDS.d20).concat(_constants.FIELDS.savingThrow).concat(_constants.FIELDS.spellAttackModifier).concat(_constants.FIELDS.spellDCModifier).concat(_constants.FIELDS.attacksVs).concat(['spell_ability', 'spell_save_DC', 'spell_to_hit']),
+ process: function process(data) {
+ var pb = (0, _utilities.getPB)(data);
+ var abilityMod = 0;
+ if ((0, _utilities.exists)(data.spell_ability)) {
+ abilityMod = (0, _abilities.getAbilityMod)(data, data.spell_ability);
+ }
+ var obj = {
+ attack: abilityMod,
+ attackFormula: abilityMod,
+ saveDC: parseFloat(data.base_dc || 8) + abilityMod,
+ saveDCFormula: parseFloat(data.base_dc || 8) + abilityMod
+ };
+ if ((0, _utilities.exists)(pb) && !isNaN(pb)) {
+ obj.saveDC += pb;
+ obj.attack += pb;
+ }
+ obj.saveDCFormula = (0, _utilities.addTo)(obj.saveDCFormula, pb + '[' + getTranslationByKey('PROFICIENT').toLowerCase() + ']');
+ obj.attackFormula = (0, _utilities.addTo)(obj.attackFormula, pb + '[' + getTranslationByKey('PROFICIENT').toLowerCase() + ']');
+ (0, _utilities.addModifier)(data, obj, 'spell_dc', 'saveDC', 'saveDCFormula', '' + getTranslationByKey('SPELL_DC_MODIFIER').toLowerCase());
+ (0, _utilities.addModifier)(data, obj, 'attack', 'attack', 'attackFormula', '' + getTranslationByKey('ATTACK_MODIFIER').toLowerCase());
+ (0, _utilities.addModifier)(data, obj, 'spell_attack', 'attack', 'attackFormula', '' + getTranslationByKey('SPELL_ATTACK_MODIFIER').toLowerCase());
+
+ data.spell_save_DC = obj.saveDC;
+ data.spell_to_hit = (0, _utilities.showSign)(obj.attack);
+
+ data.spell_save_DC_formula = '{{saving_throw_dc=[[' + obj.saveDCFormula + ']]}}';
+ data.spell_to_hit_formula = '{{attack1=[[@{shaped_d20}@{d20_mod} + ' + obj.attackFormula + '}]]}}';
+ if (data.shaped_d20 === '1d20') {
+ data.spell_to_hit_formula += ' {{attack2=[[@{shaped_d20}@{d20_mod} + ' + obj.attackFormula + ']]}}';
+ }
+ if ((0, _utilities.exists)(data.attacks_vs_target_ac)) {
+ data.spell_to_hit_formula += ' {{targetName=@{target|token_name}}}';
+ }
+ if ((0, _utilities.exists)(data.attacks_vs_target_name)) {
+ data.spell_save_DC_formula += ' {{targetName=@{target|token_name}}}';
+ data.spell_to_hit_formula += ' {{targetName=@{target|token_name}}}';
+ }
+ }
+ });
+};
+
+var updateSpellsChatMacro = exports.updateSpellsChatMacro = function updateSpellsChatMacro() {
+ var levelsToUpdate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _constants.SPELL_LEVELS;
+
+ var chatMacro = {};
+ levelsToUpdate.forEach(function (spellLevel) {
+ chatMacro[spellLevel] = [];
+ });
+
+ (0, _server.getSetItems)('updateSpellsChatMacro', {
+ collectionArray: levelsToUpdate.map(function (level) {
+ return 'spells_level_' + level + '_macro_var';
+ }).concat(['show_spells']),
+ collectionArrayRepeatingSections: levelsToUpdate.map(function (spellLevel) {
+ return {
+ collectionArrayAddItems: ['name', 'is_prepared'].concat(_constants.REPEATING_FIELDS.uses),
+ name: 'repeating_spell' + spellLevel
+ };
+ }),
+ process: function process(data, repStrings) {
+ repStrings.forEach(function (repString) {
+ if ((0, _utilities.isUndefinedOrEmpty)(data[repString + '_name'])) {
+ removeRepeatingRow(repString);
+ } else {
+ var level = (0, _utilities.getLevelOfRepeatingString)(repString);
+
+ var classes = ['spell-wrapper'];
+ if (data[repString + '_is_prepared'] === 'Yes') {
+ classes.push('prepared');
+ }
+ classes = classes.map(function (className) {
+ return 'sheet-' + className;
+ }).join(' ');
+ var action = {
+ name: data[repString + '_name']
+ };
+ (0, _actionComponents.updateUsesForChatMacro)(data, repString, action);
+ chatMacro[level].push('[' + action.name + '](~' + repString + '_spell)');
+ }
+ });
+
+ levelsToUpdate.forEach(function (level) {
+ data['spells_level_' + level + '_macro_var'] = chatMacro[level].join(', ');
+ if (data['spells_level_' + level + '_macro_var'] && data['spells_level_' + level + '_macro_var'].length > 0) {
+ data.show_spells = 1;
+ data['spell_level_filter_' + level] = 1;
+ }
+ });
+ }
+ });
+};
+
+var updateHigherLevel = function updateHigherLevel(data, repString, level) {
+ if ((0, _utilities.exists)(data[repString + '_higher_level_toggle']) && (0, _utilities.exists)(data[repString + '_higher_level']) || (0, _utilities.exists)(data[repString + '_attack_higher_level_dice']) || (0, _utilities.exists)(data[repString + '_attack_second_higher_level_dice']) || (0, _utilities.exists)(data[repString + '_saving_throw_higher_level_dice']) || (0, _utilities.exists)(data[repString + '_saving_throw_second_higher_level_dice']) || (0, _utilities.exists)(data[repString + '_other_higher_level_dice']) || (0, _utilities.exists)(data[repString + '_other_second_higher_level_dice']) || (0, _utilities.exists)(data[repString + '_heal_higher_level_dice'])) {
+ (0, _utilities.addToRollFormula)(data, repString, '{{higher_level=@{higher_level}}}');
+ (0, _utilities.addToRollFormula)(data, repString, '{{cast_as_level=@{higher_level_query_' + level + '}}}');
+ } else {
+ (0, _utilities.addToRollFormula)(data, repString, '{{cast_as_level=@{cast_as_level_' + level + '}}}');
+ }
+};
+
+var updateSpecialEffects = function updateSpecialEffects(data, repString) {
+ if ((0, _utilities.exists)(data[repString + '_special_effects_toggle'])) {
+ (0, _utilities.addToRollFormula)(data, repString, '{{fx=@{special_effects_type}-@{special_effects_color} @{special_effects_points_of_origin}}}');
+ }
+};
+
+var updateRepeat = function updateRepeat(data, repString) {
+ if ((0, _utilities.exists)(data[repString + '_repeat_toggle'])) {
+ (0, _utilities.addToRollFormula)(data, repString, '{{macros=[' + data[repString + '_name'] + ' ' + getTranslationByKey('REPEAT').toLowerCase() + '](~' + (0, _utilities.getRepeatingItemOfRepeatingString)(repString) + '_repeat)}}');
+ }
+};
+
+var updateRepeatAfterExtras = function updateRepeatAfterExtras(data, repString, level) {
+ if ((0, _utilities.exists)(data[repString + '_repeat_toggle'])) {
+ data[repString + '_roll_formula_repeat'] = data[repString + '_roll_formula'].replace('{{content=@{content}}} ', '');
+ if (data[repString + '_roll_formula'].includes('@{higher_level_query_')) {
+ var levels = [];
+ var warlockSpellsMaxLevel = parseInt(data.warlock_spell_slot_level || 0, 10);
+ for (var i = level; i <= 9; i += 1) {
+ if (!(0, _utilities.exists)(data.automatic_higher_level_queries) || (0, _utilities.exists)(data['spell_slots_level_' + i]) || i === warlockSpellsMaxLevel) {
+ levels.push(i);
+ }
+ }
+ data[repString + '_roll_formula_repeat'] = data[repString + '_roll_formula_repeat'].replace('{{higher_level=@{higher_level}}} ', '').replace(/@{higher_level_query_\d}/gi, '?{Spell Level|' + levels.join('|') + '}');
+ }
+ }
+};
+
+var filtersMacroOutput = function filtersMacroOutput() {
+ (0, _server.getSetItems)('filtersToggleAll', {
+ collectionArray: ['spells_filter_var'].concat(_constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_level_filter_' + spellLevel;
+ })),
+ process: function process(data) {
+ data.spells_filter_var = '';
+ _constants.SPELL_LEVELS.forEach(function (spellLevel) {
+ if ((0, _utilities.exists)(data['spell_level_filter_' + spellLevel])) {
+ data.spells_filter_var += ' {{spells_level_' + spellLevel + '_show=1}}';
+ }
+ });
+ }
+ });
+};
+
+var filtersToggleAll = function filtersToggleAll() {
+ (0, _server.getSetItems)('filtersToggleAll', {
+ collectionArray: ['spell_level_filter_all'].concat(_constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_level_filter_' + spellLevel;
+ })),
+ process: function process(data) {
+ var onOrOff = 0;
+ if ((0, _utilities.exists)(data.spell_level_filter_all)) {
+ onOrOff = 1;
+ }
+ _constants.SPELL_LEVELS.forEach(function (spellLevel) {
+ data['spell_level_filter_' + spellLevel] = onOrOff;
+ });
+ },
+ processCallback: function processCallback() {
+ filtersMacroOutput();
+ }
+ });
+};
+
+var changeLevel = function changeLevel(oldLevel, repeatingInfo) {
+ var level = void 0;
+ var newRowId = void 0;
+ var fieldsToChange = ['spell_level', 'school', 'ritual', 'ritual_output', 'is_prepared', 'casting_time', 'components', 'materials', 'materials_show', 'duration', 'higher_level_toggle', 'higher_level', 'concentration', 'special_effects_toggle'].concat(_constants.REPEATING_FIELDS.default).concat(_constants.REPEATING_FIELDS.content).concat(_constants.REPEATING_FIELDS.attack).concat(_constants.REPEATING_FIELDS.attackDamage).concat(_constants.REPEATING_FIELDS.attackSecondDamage).concat(_constants.REPEATING_FIELDS.savingThrow).concat(_constants.REPEATING_FIELDS.savingThrowDamage).concat(_constants.REPEATING_FIELDS.savingThrowSecondDamage).concat(_constants.REPEATING_FIELDS.otherDamage).concat(_constants.REPEATING_FIELDS.otherSecondDamage).concat(_constants.REPEATING_FIELDS.heal).concat(_constants.REPEATING_FIELDS.extras).concat(['type_from_srd', 'higher_spell_slot_dice_from_srd', 'add_casting_modifier_from_srd', 'damage_progression_from_srd']);
+ (0, _server.getSetItems)('changeLevel', {
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: fieldsToChange,
+ name: 'repeating_spell' + oldLevel,
+ repeatingInfo: repeatingInfo
+ }],
+ process: function process(data, repStrings) {
+ repStrings.forEach(function (repString) {
+ level = (0, _utilities.levelFromOrdinal)(data[repString + '_spell_level']);
+ if (oldLevel !== level) {
+ newRowId = generateRowID();
+ var newRepeatingString = 'repeating_spell' + level + '_' + newRowId;
+ fieldsToChange.forEach(function (field) {
+ if (data[repString + '_' + field]) {
+ data[newRepeatingString + '_' + field] = data[repString + '_' + field];
+ }
+ });
+ removeRepeatingRow(repString);
+ }
+ });
+ },
+ processCallback: function processCallback() {
+ updateSpells({ // eslint-disable-line no-use-before-define
+ levelsToUpdate: [level],
+ newRepeatingField: true
+ });
+ updateSpellsChatMacro([oldLevel, level]);
+ }
+ });
+};
+
+var updateSpellInner = function updateSpellInner() {
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+ data = _ref.data,
+ repString = _ref.repString,
+ level = _ref.level,
+ repeatingInfo = _ref.repeatingInfo,
+ newRepeatingField = _ref.newRepeatingField;
+
+ data[repString + '_roll_formula'] = '';
+ (0, _actionComponents.parseActionComponents)(data, repString);
+ (0, _actionComponents.updateUses)(data, repString);
+ (0, _actionComponents.updateRecharge)(data, repString);
+ (0, _actionComponents.updateContent)(data, repString);
+
+ if (level === 0 && (0, _utilities.isUndefinedOrEmpty)(data[repString + '_is_prepared'])) {
+ data[repString + '_is_prepared'] = 'Yes';
+ }
+
+ updateConcentration(data, repString);
+ updateRitual(data, repString);
+ updateMaterials(data, repString);
+ updateRange(data, repString);
+
+ if ((0, _utilities.exists)(data.is_npc) && data.caster_level) {
+ var prefixes = ['attack', 'attack_second', 'saving_throw', 'saving_throw_second', 'other', 'other_second'];
+ prefixes.forEach(function (prefix) {
+ if (data[repString + '_' + prefix + '_damage_dice'] && data[repString + '_' + prefix + '_damage_dice'].toString().includes('@{level}')) {
+ data[repString + '_' + prefix + '_damage_dice'] = data[repString + '_' + prefix + '_damage_dice'].replace('@{level}', '@{caster_level}');
+ }
+ });
+ }
+
+ (0, _attack.updateAttack)({
+ data: data,
+ newRepeatingField: newRepeatingField,
+ repeatingInfo: repeatingInfo,
+ repString: repString
+ });
+ (0, _savingThrow.updateSavingThrow)({
+ data: data,
+ newRepeatingField: newRepeatingField,
+ repeatingInfo: repeatingInfo,
+ repString: repString
+ });
+ (0, _actionComponents.updateOtherDamage)(data, repString, repeatingInfo);
+ (0, _heal.updateHeal)(data, repString);
+ updateHigherLevel(data, repString, level);
+ updateSpecialEffects(data, repString);
+ updateRepeat(data, repString);
+ (0, _actionComponents.updateExtras)(data, repString);
+ updateRepeatAfterExtras(data, repString, level);
+};
+
+var updateSpells = exports.updateSpells = function updateSpells() {
+ var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+ _ref2$levelsToUpdate = _ref2.levelsToUpdate,
+ levelsToUpdate = _ref2$levelsToUpdate === undefined ? _constants.SPELL_LEVELS : _ref2$levelsToUpdate,
+ newRepeatingField = _ref2.newRepeatingField,
+ repeatingInfo = _ref2.repeatingInfo;
+
+ var collectionArray = _constants.FIELDS.pb.concat(['is_npc', 'spell_ability', 'caster_level', 'distance_system']).concat(['show_spells']).concat(_constants.FIELDS.abilityScores).concat(_constants.FIELDS.d20).concat(_constants.FIELDS.savingThrow).concat(_constants.FIELDS.spellAttackModifier).concat(_constants.FIELDS.spellDamageModifier).concat(_constants.FIELDS.spellDCModifier).concat(_constants.FIELDS.attacksVs).concat(_constants.FIELDS.automaticDamage).concat(['spell_heal_modifier']).concat(['show_dice_modifiers', 'critical_damage_houserule']).concat(['automatic_higher_level_queries']).concat(_constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_slots_level_' + spellLevel;
+ })).concat(['use_custom_saving_throws']);
+
+ _constants.CUSTOM_SAVING_THROWS.forEach(function (customSavingThrow) {
+ collectionArray = collectionArray.concat(_constants.ABILITIES.map(function (ability) {
+ return customSavingThrow + '_' + ability;
+ }));
+ });
+
+ var updateSpellFilter = false;
+
+ (0, _server.getSetItems)('update', {
+ collectionArray: collectionArray,
+ collectionArrayRepeatingSections: levelsToUpdate.map(function (levelToUpdate) {
+ return {
+ collectionArrayAddItems: ['type_from_srd', 'spell_level', 'school', 'ritual', 'ritual_output', 'is_prepared', 'casting_time', 'components', 'materials', 'materials_show', 'duration', 'higher_level_toggle', 'higher_level', 'damage_progression_from_srd', 'concentration', 'higher_spell_slot_dice_from_srd', 'add_casting_modifier_from_srd', 'special_effects_toggle', 'roll_formula_repeat'].concat(_constants.REPEATING_FIELDS.default).concat(_constants.REPEATING_FIELDS.uses).concat(_constants.REPEATING_FIELDS.content).concat(_constants.REPEATING_FIELDS.attack).concat(_constants.REPEATING_FIELDS.attackDamage).concat(_constants.REPEATING_FIELDS.attackSecondDamage).concat(_constants.REPEATING_FIELDS.savingThrow).concat(_constants.REPEATING_FIELDS.savingThrowDamage).concat(_constants.REPEATING_FIELDS.savingThrowSecondDamage).concat(_constants.REPEATING_FIELDS.otherDamage).concat(_constants.REPEATING_FIELDS.otherSecondDamage).concat(_constants.REPEATING_FIELDS.heal).concat(_constants.REPEATING_FIELDS.extras).concat(_constants.REPEATING_FIELDS.repeat).concat(_constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_level_filter_' + spellLevel;
+ })),
+ name: 'repeating_spell' + levelToUpdate,
+ repeatingInfo: repeatingInfo
+ };
+ }),
+ process: function process(data, repStrings) {
+ repStrings.forEach(function (repString) {
+ if ((0, _utilities.isUndefinedOrEmpty)(data[repString + '_name'])) {
+ removeRepeatingRow(repString);
+ } else {
+ var spellLevel = (0, _utilities.getLevelOfRepeatingString)(repString);
+ if (data[repString + '_name'].includes('\'')) {
+ data[repString + '_name'] = (0, _utilities.cleanName)(data[repString + '_name']);
+ }
+ if ((0, _utilities.isUndefinedOrEmpty)(data[repString + '_spell_level'])) {
+ data[repString + '_spell_level'] = (0, _utilities.ordinalSpellLevel)(spellLevel);
+ }
+ if ((0, _utilities.levelFromOrdinal)(data[repString + '_spell_level']) !== spellLevel) {
+ changeLevel(spellLevel, repeatingInfo);
+ } else {
+ if (!data['spell_level_filter_' + spellLevel]) {
+ data.show_spells = 1;
+ data['spell_level_filter_' + spellLevel] = 1;
+ updateSpellFilter = true;
+ }
+ updateSpellInner({
+ data: data,
+ level: spellLevel,
+ newRepeatingField: newRepeatingField,
+ repeatingInfo: repeatingInfo,
+ repString: repString
+ });
+ }
+ }
+ });
+ },
+ processCallback: function processCallback() {
+ if (updateSpellFilter) {
+ filtersMacroOutput();
+ }
+ }
+ });
+};
+
+var countSpells = exports.countSpells = function countSpells() {
+ (0, _server.getSetItems)('countSpells', {
+ collectionArray: ['spells_known', 'spells_prepared'],
+ collectionArrayRepeatingSections: _constants.SPELL_LEVELS.map(function (spellLevel) {
+ return {
+ collectionArrayAddItems: ['name', 'is_prepared'],
+ name: 'repeating_spell' + spellLevel
+ };
+ }),
+ process: function process(data, repStrings) {
+ data.spells_known = 0;
+ data.spells_prepared = 0;
+
+ repStrings.forEach(function (repString) {
+ if ((0, _utilities.isUndefinedOrEmpty)(data[repString + '_name'])) {
+ removeRepeatingRow(repString);
+ } else {
+ var level = (0, _utilities.getLevelOfRepeatingString)(repString);
+
+ if (level > 0) {
+ data.spells_known += 1;
+ if ((0, _utilities.exists)(data[repString + '_is_prepared'])) {
+ data.spells_prepared += 1;
+ }
+ }
+ }
+ });
+ }
+ });
+};
+
+var updateSpellSlotsRemaining = exports.updateSpellSlotsRemaining = function updateSpellSlotsRemaining(data, levelsToUpdate) {
+ levelsToUpdate.forEach(function (spellLevel) {
+ data['spell_slots_level_' + spellLevel + '_remaining'] = parseInt(data['spell_slots_level_' + spellLevel] || 0, 10) - parseInt(data['spell_slots_level_' + spellLevel + '_expended'] || 0, 10);
+ data['spell_slots_level_' + spellLevel + '_pluralization'] = data['spell_slots_level_' + spellLevel + '_remaining'] === 1 ? getTranslationByKey('SLOT').toLowerCase() : getTranslationByKey('SLOTS').toLowerCase();
+ });
+};
+
+var updateWarlockSlots = exports.updateWarlockSlots = function updateWarlockSlots(data) {
+ data.warlock_spell_slots = parseInt(data.warlock_spell_slots_calc || 0, 10) + parseInt(data.warlock_spell_slots_bonus || 0, 10);
+};
+
+var updateWarlockSlotsRemaining = exports.updateWarlockSlotsRemaining = function updateWarlockSlotsRemaining(data) {
+ data.warlock_spell_slots_remaining = parseInt(data.warlock_spell_slots || 0, 10) - parseInt(data.warlock_spell_slots_expended || 0, 10);
+ data.warlock_spell_slots_pluralization = data.warlock_spell_slots_remaining === 1 ? getTranslationByKey('SLOT').toLowerCase() : getTranslationByKey('SLOTS').toLowerCase();
+};
+
+var generateHigherLevelQueries = exports.generateHigherLevelQueries = function generateHigherLevelQueries(data, maxLevelToUpdate) {
+ for (var spellLevel = 1; spellLevel <= maxLevelToUpdate; spellLevel += 1) {
+ var levels = [];
+
+ for (var j = spellLevel; j <= 9; j += 1) {
+ if (!(0, _utilities.exists)(data.automatic_higher_level_queries) || parseInt(data['spell_slots_level_' + j + '_remaining'] || 0, 10) > 0 || parseInt(data.warlock_spell_slots_remaining || 0, 10) > 0 && j === parseInt(data.warlock_spell_slot_level || 0, 10)) {
+ levels.push(j);
+ }
+ }
+
+ if (levels && levels.length > 1 || levels.length === 1 && levels[0] !== spellLevel && !(0, _utilities.exists)(data.warlock_slots_toggle)) {
+ data['higher_level_query_' + spellLevel] = '?{Spell Level|' + levels.join('|') + '}';
+ } else if (levels && levels.length === 1) {
+ data['higher_level_query_' + spellLevel] = levels[0];
+ } else {
+ data['higher_level_query_' + spellLevel] = '?{Spell Level|' + spellLevel + '}';
+ }
+
+ if (levels && levels.includes(spellLevel)) {
+ data['cast_as_level_' + spellLevel] = spellLevel;
+ } else {
+ data['cast_as_level_' + spellLevel] = data['higher_level_query_' + spellLevel];
+ }
+ }
+};
+
+var updateSpellSlots = exports.updateSpellSlots = function updateSpellSlots(_ref3) {
+ var higherLevelQueries = _ref3.higherLevelQueries,
+ _ref3$levelsToUpdate = _ref3.levelsToUpdate,
+ levelsToUpdate = _ref3$levelsToUpdate === undefined ? _constants.SPELL_LEVELS : _ref3$levelsToUpdate,
+ spellSlots = _ref3.spellSlots,
+ warlockSlots = _ref3.warlockSlots;
+
+ var collectionArray = [];
+
+ if (spellSlots) {
+ collectionArray = collectionArray.concat(levelsToUpdate.map(function (spellLevel) {
+ return 'spell_slots_level_' + spellLevel;
+ })).concat(levelsToUpdate.map(function (spellLevel) {
+ return 'spell_slots_level_' + spellLevel + '_expended';
+ })).concat(levelsToUpdate.map(function (spellLevel) {
+ return 'spell_slots_level_' + spellLevel + '_pluralization';
+ }));
+ }
+ if (warlockSlots) {
+ collectionArray = collectionArray.concat(['warlock_spell_slots_calc', 'warlock_spell_slots_bonus', 'warlock_spell_slots', 'warlock_spell_slots_expended', 'warlock_spell_slots_remaining', 'warlock_spell_slots_pluralization']);
+ }
+ if (higherLevelQueries) {
+ collectionArray = collectionArray.concat(['automatic_higher_level_queries', 'warlock_slots_toggle', 'warlock_spell_slots_remaining', 'warlock_spell_slot_level']);
+
+ for (var spellLevel = 1; spellLevel <= Math.max.apply(Math, _toConsumableArray(levelsToUpdate)) - 1; spellLevel += 1) {
+ collectionArray.push('cast_as_level_' + spellLevel);
+ collectionArray.push('higher_level_query_' + spellLevel);
+ }
+ for (var _spellLevel = 1; _spellLevel <= Math.max.apply(Math, _toConsumableArray(levelsToUpdate)); _spellLevel += 1) {
+ collectionArray.push('spell_slots_level_' + _spellLevel + '_remaining');
+ }
+ }
+
+ (0, _server.getSetItems)('updateSpellSlots', {
+ collectionArray: collectionArray,
+ process: function process(data) {
+ if (spellSlots) {
+ updateSpellSlotsRemaining(data, levelsToUpdate);
+ }
+ if (warlockSlots) {
+ updateWarlockSlots(data);
+ updateWarlockSlotsRemaining(data);
+ }
+ if (higherLevelQueries) {
+ generateHigherLevelQueries(data, Math.max.apply(Math, _toConsumableArray(levelsToUpdate)) - 1);
+ }
+ }
+ });
+};
+
+var setSpellSlots = exports.setSpellSlots = function setSpellSlots() {
+ var levels = {
+ 1: 0,
+ 2: 0,
+ 3: 0,
+ 4: 0,
+ 5: 0,
+ 6: 0,
+ 7: 0,
+ 8: 0,
+ 9: 0
+ };
+
+ (0, _server.getSetItems)('setSpellSlots', {
+ collectionArray: ['caster_level', 'caster_type'].concat(['show_spells']).concat(_constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_slots_level_' + spellLevel;
+ })).concat(_constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_slots_level_' + spellLevel + '_expended';
+ })).concat(_constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_slots_level_' + spellLevel + '_calc';
+ })).concat(_constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_slots_level_' + spellLevel + '_bonus';
+ })).concat(_constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_level_filter_' + spellLevel;
+ })),
+ process: function process(data) {
+ var casterLevel = parseInt(data.caster_level || 0, 10);
+ var casterType = data.caster_type;
+
+ if (casterType === 'full') {
+ if (casterLevel >= 3) {
+ levels[1] = 4;
+ } else if (casterLevel === 2) {
+ levels[1] = 3;
+ } else if (casterLevel === 1) {
+ levels[1] = 2;
+ }
+ if (casterLevel >= 4) {
+ levels[2] = 3;
+ } else if (casterLevel === 3) {
+ levels[2] = 2;
+ }
+ if (casterLevel >= 6) {
+ levels[3] = 3;
+ } else if (casterLevel === 5) {
+ levels[3] = 2;
+ }
+ if (casterLevel >= 9) {
+ levels[4] = 3;
+ } else if (casterLevel === 8) {
+ levels[4] = 2;
+ } else if (casterLevel === 7) {
+ levels[4] = 1;
+ }
+ if (casterLevel >= 18) {
+ levels[5] = 3;
+ } else if (casterLevel >= 10) {
+ levels[5] = 2;
+ } else if (casterLevel === 9) {
+ levels[5] = 1;
+ }
+ if (casterLevel >= 19) {
+ levels[6] = 2;
+ } else if (casterLevel >= 11) {
+ levels[6] = 1;
+ }
+ if (casterLevel >= 20) {
+ levels[7] = 2;
+ } else if (casterLevel >= 13) {
+ levels[7] = 1;
+ }
+ if (casterLevel >= 15) {
+ levels[8] = 1;
+ }
+ if (casterLevel >= 17) {
+ levels[9] = 1;
+ }
+ } else if (casterType === 'half') {
+ if (casterLevel >= 5) {
+ levels[1] = 4;
+ } else if (casterLevel >= 3) {
+ levels[1] = 3;
+ } else if (casterLevel === 2) {
+ levels[1] = 2;
+ }
+ if (casterLevel >= 7) {
+ levels[2] = 3;
+ } else if (casterLevel >= 5) {
+ levels[2] = 2;
+ }
+ if (casterLevel >= 11) {
+ levels[3] = 3;
+ } else if (casterLevel >= 9) {
+ levels[3] = 2;
+ }
+ if (casterLevel >= 17) {
+ levels[4] = 3;
+ } else if (casterLevel >= 15) {
+ levels[4] = 2;
+ } else if (casterLevel >= 13) {
+ levels[4] = 1;
+ }
+ if (casterLevel >= 19) {
+ levels[5] = 2;
+ } else if (casterLevel >= 17) {
+ levels[5] = 1;
+ }
+ } else if (casterType === 'third') {
+ if (casterLevel >= 7) {
+ levels[1] = 4;
+ } else if (casterLevel >= 4) {
+ levels[1] = 3;
+ } else if (casterLevel === 3) {
+ levels[1] = 2;
+ }
+ if (casterLevel >= 10) {
+ levels[2] = 3;
+ } else if (casterLevel >= 7) {
+ levels[2] = 2;
+ }
+ if (casterLevel >= 16) {
+ levels[3] = 3;
+ } else if (casterLevel >= 13) {
+ levels[3] = 2;
+ }
+ if (casterLevel >= 19) {
+ levels[4] = 1;
+ }
+ }
+
+ Object.keys(levels).forEach(function (level) {
+ if (levels[level] > 0 || (0, _utilities.exists)(data['spell_slots_level_' + level + '_calc'])) {
+ data['spell_slots_level_' + level + '_calc'] = levels[level];
+ } else if ((0, _utilities.exists)(data['spell_slots_level_' + level + '_calc'])) {
+ data['spell_slots_level_' + level + '_calc'] = '';
+ }
+
+ var spellSlotMax = levels[level] + parseInt(data['spell_slots_level_' + level + '_bonus'] || 0, 10);
+ if (spellSlotMax > 0) {
+ data['spell_slots_level_' + level] = spellSlotMax;
+ data.show_spells = 1;
+ data['spell_level_filter_' + level] = 1;
+ } else {
+ if ((0, _utilities.exists)(data['spell_slots_level_' + level])) {
+ data['spell_slots_level_' + level] = 0;
+ }
+ if ((0, _utilities.exists)(data['spell_level_filter_' + level])) {
+ data['spell_level_filter_' + level] = 0;
+ }
+ }
+ });
+ },
+ processCallback: function processCallback() {
+ updateSpellSlots({
+ higherLevelQueries: true,
+ spellSlots: true,
+ warlockSlots: true
+ });
+ filtersMacroOutput();
+ }
+ });
+};
+
+var updateHasSpellSlots = exports.updateHasSpellSlots = function updateHasSpellSlots() {
+ (0, _server.getSetItems)('updateHasSpellSlots', {
+ collectionArray: ['spell_slots_toggle', 'has_spell_slots'],
+ process: function process(data) {
+ if ((0, _utilities.exists)(data.spell_slots_toggle)) {
+ data.has_spell_slots = true;
+ } else {
+ data.has_spell_slots = '';
+ }
+ }
+ });
+};
+
+var updateHasWarlockSlots = exports.updateHasWarlockSlots = function updateHasWarlockSlots() {
+ (0, _server.getSetItems)('updateHasWarlockSlots', {
+ collectionArray: ['warlock_slots_toggle', 'has_warlock_slots'],
+ process: function process(data) {
+ if ((0, _utilities.exists)(data.warlock_slots_toggle)) {
+ data.has_warlock_slots = true;
+ } else {
+ data.has_warlock_slots = '';
+ }
+ }
+ });
+};
+
+var updateHasSpellPoints = exports.updateHasSpellPoints = function updateHasSpellPoints() {
+ (0, _server.getSetItems)('updateHasSpellPoints', {
+ collectionArray: ['spell_points_toggle', 'has_spell_points'],
+ process: function process(data) {
+ if ((0, _utilities.exists)(data.spell_points_toggle)) {
+ data.has_spell_points = true;
+ } else {
+ data.has_spell_points = '';
+ }
+ }
+ });
+};
+
+var parseSpellcastingAbilityFromTraits = function parseSpellcastingAbilityFromTraits(data, repString) {
+ var spellcastingAbilityRegex = /spellcasting ability is (\w+)/i;
+ var spellcastingAbilityRegexSecond = /uses (\w+) as (her|his|its) spellcasting ability/i;
+
+ var spellcastingSearch = spellcastingAbilityRegex.exec(data[repString + '_content']);
+ if (spellcastingSearch && spellcastingSearch[1]) {
+ data.spell_ability = spellcastingSearch[1].toUpperCase();
+ } else {
+ var spellcastingSearchSecond = spellcastingAbilityRegexSecond.exec(data[repString + '_content']);
+ if (spellcastingSearchSecond && spellcastingSearchSecond[1]) {
+ data.spell_ability = spellcastingSearchSecond[1].toUpperCase();
+ }
+ }
+};
+
+var parseSpellsPerLevel = function parseSpellsPerLevel(data, repStrings, spellsToParseObj) {
+ var listOfSpells = repStrings.map(function (repString) {
+ return data[repString + '_name'].toLowerCase();
+ });
+
+ Object.keys(spellsToParseObj).forEach(function (level) {
+ if (spellsToParseObj[level].slots) {
+ data['spell_slots_level_' + level] = spellsToParseObj[level].slots;
+ data['spell_slots_level_' + level + '_bonus'] = spellsToParseObj[level].slots;
+ }
+ spellsToParseObj[level].spells.split(',').forEach(function (spell) {
+ spell = spell.trim();
+ if (listOfSpells && !listOfSpells.includes(spell)) {
+ var repStringNew = 'repeating_spell' + level + '_' + generateRowID();
+ data[repStringNew + '_name'] = spell;
+ data[repStringNew + '_spell_level'] = (0, _utilities.ordinalSpellLevel)(level);
+ }
+ });
+ });
+};
+
+var parseSpellcastingFromTraits = function parseSpellcastingFromTraits(data, repStrings, traitContent) {
+ data.spell_slots_toggle = 1;
+ data.spellcasting = 1;
+
+ var cantripsRegex = /Cantrips.*:\s(.*)/gi;
+ var spellcastingRegex = /(\d+)\w+\slevel\s\((\d+)\s?slot(?:s)?\):?\s?(.*)/gi;
+ var spellcastingLevelRegex = /(\d+)(?:st|dn|rd|th)-level spellcaster/i;
+ var spellcastingClassRegex = /following (\w+) spells prepared/i;
+ var spellcastingClassRegexSecond = /following spells prepared from the (\w+) spell list/i;
+
+ var spellsToParseObj = {};
+ var cantripsSearch = cantripsRegex.exec(traitContent);
+ if (cantripsSearch && cantripsSearch[1]) {
+ spellsToParseObj[0] = {
+ spells: cantripsSearch[1]
+ };
+ }
+ var match = void 0;
+ while ((match = spellcastingRegex.exec(traitContent)) !== null) {
+ if (match && match[1] && match[2] && match[3]) {
+ spellsToParseObj[match[1]] = {
+ slots: match[2],
+ spells: match[3]
+ };
+ }
+ }
+ if ((0, _utilities.objIsNotEmpty)(spellsToParseObj)) {
+ parseSpellsPerLevel(data, repStrings, spellsToParseObj);
+ }
+
+ var spellcastingLevelSearch = spellcastingLevelRegex.exec(traitContent);
+ if (spellcastingLevelSearch && spellcastingLevelSearch[1]) {
+ data.caster_level = spellcastingLevelSearch[1];
+ data.spellcaster_level = (0, _utilities.ordinalSpellLevel)(spellcastingLevelSearch[1]);
+ }
+ var spellcastingClassSearch = spellcastingClassRegex.exec(traitContent);
+ if (spellcastingClassSearch && spellcastingClassSearch[1]) {
+ data.spellcasting_class = spellcastingClassSearch[1].toUpperCase();
+ } else {
+ var spellcastingClassSearchSecond = spellcastingClassRegexSecond.exec(traitContent);
+ if (spellcastingClassSearchSecond && spellcastingClassSearchSecond[1]) {
+ data.spellcasting_class = spellcastingClassSearchSecond[1].toUpperCase();
+ }
+ }
+};
+
+var parseInnateSpellcastingFromTraits = function parseInnateSpellcastingFromTraits(data, repStrings, traitContent) {
+ data.innate_spellcasting = 1;
+ var innateSpellsRegex = /(?:At will|each):\s(.*)/gi;
+ var innateSpellcastingComponentRegex = /(.*requiring no material components:)/i;
+ var innateSpellcastingComponentRegexSecond = /(.*requiring only verbal components:)/i;
+
+ var spellsToParseObj = {
+ 0: {
+ spells: ''
+ },
+ 1: {
+ spells: ''
+ },
+ 2: {
+ spells: ''
+ },
+ 3: {
+ spells: ''
+ },
+ 4: {
+ spells: ''
+ },
+ 5: {
+ spells: ''
+ },
+ 6: {
+ spells: ''
+ },
+ 7: {
+ spells: ''
+ },
+ 8: {
+ spells: ''
+ },
+ 9: {
+ spells: ''
+ }
+ };
+ var match = void 0;
+ while ((match = innateSpellsRegex.exec(traitContent)) !== null) {
+ if (match && match[1]) {
+ spellsToParseObj[0].spells += ', ' + match[1];
+ }
+ }
+ if ((0, _utilities.objIsNotEmpty)(spellsToParseObj)) {
+ parseSpellsPerLevel(data, repStrings, spellsToParseObj);
+ }
+
+ var innateSpellcastingComponentSearch = innateSpellcastingComponentRegex.exec(traitContent);
+ if (innateSpellcastingComponentSearch) {
+ data.innate_spellcasting_components = 'INNATE_SPELLCASTING_NO_MATERIAL';
+ if (innateSpellcastingComponentSearch[1]) {
+ data.innate_spellcasting_blurb = traitContent.replace(innateSpellcastingComponentSearch[1], '').trim();
+ }
+ } else {
+ var innateSpellcastingComponentSearchSecond = innateSpellcastingComponentRegexSecond.exec(traitContent);
+ if (innateSpellcastingComponentSearchSecond) {
+ data.innate_spellcasting_components = 'INNATE_SPELLCASTING_ONLY_VERBAL';
+ if (innateSpellcastingComponentSearchSecond[1]) {
+ data.innate_spellcasting_blurb = traitContent.replace(innateSpellcastingComponentSearchSecond[1], '').trim();
+ }
+ }
+ }
+};
+
+var parseSpellcasting = function parseSpellcasting(type, traitContent) {
+ (0, _server.getSetItems)('parseSpellcasting', {
+ collectionArray: ['level', 'challenge', 'spellcasting_class', 'innate_spellcasting', 'spellcasting'].concat(_constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_slots_level_' + spellLevel + '_bonus';
+ })),
+ collectionArrayRepeatingSections: _constants.SPELL_LEVELS.map(function (spellLevel) {
+ return {
+ collectionArrayAddItems: ['name', 'spell_level'],
+ name: 'repeating_spell' + spellLevel
+ };
+ }),
+ process: function process(data, repStrings) {
+ if (type === 'innate') {
+ parseInnateSpellcastingFromTraits(data, repStrings, traitContent);
+ } else {
+ parseSpellcastingFromTraits(data, repStrings, traitContent);
+ }
+ },
+ processCallback: function processCallback() {
+ updateSpellAbility();
+ updateDCAndAttack();
+ setSpellSlots();
+ updateSpells();
+ updateSpellSlots({
+ higherLevelQueries: true,
+ spellSlots: true,
+ warlockSlots: true
+ });
+ updateSpellsChatMacro();
+ updateHasSpellSlots();
+ updateHasWarlockSlots();
+ updateHasSpellPoints();
+ }
+ });
+};
+
+var findSpellcasting = exports.findSpellcasting = function findSpellcasting(repeatingInfo) {
+ var deleteItem = false;
+
+ (0, _server.getSetItems)('findSpellcasting', {
+ collectionArray: ['is_npc', 'spell_ability', 'show_spells'],
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['name', 'content'].concat(_constants.REPEATING_FIELDS.attack),
+ name: 'repeating_trait',
+ repeatingInfo: repeatingInfo
+ }],
+ process: function process(data, repStrings) {
+ if ((0, _utilities.exists)(data.is_npc)) {
+ repStrings.forEach(function (repString) {
+ if ((0, _utilities.isUndefinedOrEmpty)(data[repString + '_name'])) {
+ deleteItem = true;
+ removeRepeatingRow(repString);
+ } else if (data[repString + '_name'] && data[repString + '_name'].includes('Spellcasting')) {
+ data.show_spells = 1;
+ parseSpellcastingAbilityFromTraits(data, repString);
+
+ if (data[repString + '_name'].includes('Innate')) {
+ parseSpellcasting('innate', data[repString + '_content']);
+ deleteItem = true;
+ removeRepeatingRow(repString);
+ } else {
+ parseSpellcasting('normal', data[repString + '_content']);
+ if (!data[repString + '_name'].includes('Shared')) {
+ deleteItem = true;
+ removeRepeatingRow(repString);
+ }
+ }
+ }
+ });
+ }
+ },
+ processCallback: function processCallback() {
+ if (!deleteItem) {
+ (0, _actions.updateActions)(['trait'], repeatingInfo);
+ }
+ }
+ });
+};
+
+var cleanContent = exports.cleanContent = function cleanContent(content) {
+ return content.replace(/\*\*\n\t/g, '**').replace(/\*\*\n/g, '**').replace(/:\*\*/g, '**:').replace(/\s\s\n\n/g, '\n\n').replace(/“/g, '"').replace(/”/g, '"').replace(/'/g, '’');
+};
+
+var parseRepeatFromName = function parseRepeatFromName(data, repString) {
+ var repeatableSpells = ['acid fog', 'aggressive thundercloud', 'animate objects', 'astral construct', 'blade barrier', 'burst with light', 'call lightning', 'chaos bolt', 'cloud of daggers', 'cloudkill', 'concussive onslaught', 'cordon of arrows', 'dust devil', 'ego whip', 'eldritch blast', 'evard’s black tentacles', 'black tentacles', 'flaming sphere', 'guardian of faith', 'heat metal', 'hex', 'hunger of hadar', 'hunter’s mark', 'ice slick', 'immolation', 'incendiary cloud', 'insect plague', 'investiture of flame', 'investiture of ice', 'investiture of stone', 'investiture of wind', 'maelstrom', 'maximilian’s earthen grasp', 'earthen grasp', 'melf’s minute meteors', 'minute meteors', 'moonbeam', 'mordenkainen’s faithful hound', 'faithful hound', 'mordenkainen’s sword', 'arcane sword', 'earthen grasp', 'phantasmal killer', 'scorching ray', 'searing smite', 'spirit guardians', 'spiritual weapon', 'storm sphere', 'sunbeam', 'tsunami', 'vampiric touch', 'wall of fire', 'wall of ice', 'wall of thorns', 'whirlwind', 'wind wall', 'witch bolt'];
+
+ if ((0, _utilities.exists)(data[repString + '_name'] && (0, _utilities.isUndefinedOrEmpty)(data[repString + '_repeat_toggle'])) && repeatableSpells.includes(data[repString + '_name'].toLowerCase())) {
+ data[repString + '_repeat_toggle'] = 1;
+ }
+};
+
+var getLevel = function getLevel(data) {
+ if ((0, _utilities.existsAllowZero)(data.level_from_srd)) {
+ return data.level_from_srd;
+ }
+ return 0;
+};
+
+var parseName = function parseName(data, repString) {
+ if (data.name_from_srd) {
+ data[repString + '_name'] = (0, _utilities.cleanName)(data.name_from_srd);
+ }
+};
+
+var parseMagicMissile = function parseMagicMissile(data, repString) {
+ if (data[repString + '_name'] === 'Magic Missile') {
+ data.damage_from_srd = '1d4 + 1';
+ data.higher_spell_slot_dice_from_srd = '';
+ }
+};
+
+var parseLevel = exports.parseLevel = function parseLevel(data, repString) {
+ if ((0, _utilities.existsAllowZero)(data.level_from_srd)) {
+ data[repString + '_spell_level'] = (0, _utilities.ordinalSpellLevel)(data.level_from_srd);
+ }
+};
+
+var parseSchool = function parseSchool(data, repString) {
+ if (data.school_from_srd) {
+ data[repString + '_school'] = data.school_from_srd.toUpperCase();
+ }
+};
+
+var parseRitual = function parseRitual(data, repString) {
+ if (data.ritual_from_srd) {
+ data[repString + '_ritual'] = data.ritual_from_srd;
+ }
+};
+
+var parseCastingTime = function parseCastingTime(data, repString) {
+ if (data.casting_time_from_srd) {
+ data[repString + '_casting_time'] = data.casting_time_from_srd.toUpperCase().trim().replace(/\s/g, '_');
+ }
+};
+
+var parseRange = function parseRange(data, repString) {
+ if (data.range_from_srd) {
+ data[repString + '_range'] = data.range_from_srd;
+ }
+};
+
+var parseComponents = function parseComponents(data, repString) {
+ if (data.components_from_srd && !data.components_from_srd.includes('DISPLAY_')) {
+ data[repString + '_components'] = 'COMPONENTS_' + data.components_from_srd.toUpperCase().trim().replace(/\s/g, '_');
+ }
+};
+
+var parseMaterials = function parseMaterials(data, repString) {
+ if (data.material_from_srd) {
+ data[repString + '_materials'] = cleanContent(data.material_from_srd);
+ }
+};
+
+var parseDuration = function parseDuration(data, repString) {
+ if (data.duration_from_srd) {
+ if (data.duration_from_srd.toLowerCase().includes('up to')) {
+ data[repString + '_duration'] = 'CONCENTRATION_';
+ } else {
+ data[repString + '_duration'] = '';
+ }
+ data[repString + '_duration'] += data.duration_from_srd.toUpperCase().trim().replace(/\s/g, '_');
+ }
+};
+
+var parseContent = function parseContent(data, repString) {
+ if (data.content_from_srd) {
+ data[repString + '_content'] = cleanContent(data.content_from_srd);
+ var spellHigherLevelRegex = /((?:This spell’?s damage increases|At Higher Levels|When you cast this spell using).*)/gi;
+ var spellHigherLevelResult = spellHigherLevelRegex.exec(data[repString + '_content']);
+ if (spellHigherLevelResult) {
+ data[repString + '_higher_level'] = spellHigherLevelResult[1];
+ data[repString + '_higher_level_toggle'] = 1;
+ data[repString + '_content'] = data[repString + '_content'].replace(spellHigherLevelResult[1], '').trim();
+ }
+ }
+};
+
+var parseSpellAttack = function parseSpellAttack(data, repString) {
+ if (data.spell_attack_from_srd) {
+ data[repString + '_attack_toggle'] = 1;
+ data[repString + '_attack_ability'] = (0, _abilities.getFormattedAbility)(data.spell_ability);
+ if (data.spell_attack_from_srd === 'Melee') {
+ data[repString + '_attack_type'] = 'MELEE_SPELL_ATTACK';
+ } else if (data.spell_attack_from_srd === 'Ranged') {
+ data[repString + '_attack_type'] = 'RANGED_SPELL_ATTACK';
+ }
+ }
+};
+
+var parseSavingThrow = function parseSavingThrow(data, repString) {
+ if (data.save_from_srd) {
+ data[repString + '_saving_throw_toggle'] = 1;
+ data[repString + '_saving_throw_vs_ability'] = data.save_from_srd.toUpperCase();
+ data[repString + '_saving_throw_ability'] = (0, _abilities.getFormattedAbility)(data.spell_ability);
+ }
+ if (data.save_success_from_srd) {
+ data[repString + '_saving_throw_success'] = data.save_success_from_srd;
+ }
+};
+
+var parseHigherSpellSlotDice = function parseHigherSpellSlotDice(data, repString) {
+ if (data.higher_spell_slot_dice_from_srd) {
+ var prefix = (0, _utilities.getDamagePrefix)(data, repString);
+ data[repString + '_' + prefix + '_higher_level_dice'] = parseFloat(data.higher_spell_slot_dice_from_srd);
+ }
+};
+
+var parseAddCastingModifier = function parseAddCastingModifier(data, repString) {
+ if (data.add_casting_modifier_from_srd && (0, _utilities.exists)(data.spell_ability)) {
+ var prefix = (0, _utilities.getDamagePrefix)(data, repString);
+ if (data.damage_from_srd) {
+ data[repString + '_' + prefix + '_damage_ability'] = (0, _abilities.getFormattedAbility)(data.spell_ability);
+ }
+ if (data.healing_from_srd) {
+ data[repString + '_heal_toggle'] = 1;
+ data[repString + '_heal_ability'] = (0, _abilities.getFormattedAbility)(data.spell_ability);
+ }
+ }
+};
+
+var parseDamage = function parseDamage(data, repString) {
+ if (data.damage_from_srd) {
+ var prefix = (0, _utilities.getDamagePrefix)(data, repString);
+ if (data.damage_progression_from_srd === 'Cantrip Dice') {
+ data[repString + '_' + prefix + '_damage_dice'] = '[[ceil((@{level} + 2) / 6)]]';
+ data[repString + '_' + prefix + '_damage_die'] = data.damage_from_srd.replace('1d', 'd');
+ data.damage_from_srd = '';
+ }
+ }
+};
+
+var parseSpellFromSRD = exports.parseSpellFromSRD = function parseSpellFromSRD(data, repString) {
+ var level = getLevel(data);
+ parseName(data, repString);
+ parseLevel(data, repString);
+ parseMagicMissile(data, repString);
+ parseSchool(data, repString);
+ parseRitual(data, repString);
+ parseCastingTime(data, repString);
+ parseRange(data, repString);
+ parseComponents(data, repString);
+ parseMaterials(data, repString);
+ parseDuration(data, repString);
+ parseContent(data, repString);
+ parseSpellAttack(data, repString);
+ parseSavingThrow(data, repString);
+ parseAddCastingModifier(data, repString);
+ parseDamage(data, repString);
+
+ parseRepeatFromName(data, repString);
+
+ updateSpellInner({
+ data: data,
+ level: level,
+ newRepeatingField: true,
+ repString: repString
+ });
+
+ parseHigherSpellSlotDice(data, repString);
+ data[repString + '_toggle_details'] = 0;
+};
+
+var fromSrd = ['category_from_srd', 'name_from_srd', 'level_from_srd', 'school_from_srd', 'ritual_from_srd', 'casting_time_from_srd', 'range_from_srd', 'components_from_srd', 'material_from_srd', 'duration_from_srd', 'content_from_srd', 'spell_attack_from_srd', 'save_from_srd', 'save_success_from_srd', 'damage_from_srd', 'damage_type_from_srd', 'secondary_damage_from_srd', 'secondary_damage_type_from_srd', 'healing_from_srd', 'higher_level_healing_from_srd', 'higher_spell_slot_dice_from_srd', 'add_casting_modifier_from_srd', 'damage_progression_from_srd'];
+
+var parseSpellFromSRDWithServer = exports.parseSpellFromSRDWithServer = function parseSpellFromSRDWithServer() {
+ (0, _processing.addToProcessing)('parseSpellFromSRD', function () {
+ (0, _server.getSetItems)('parseSpellFromSRDWithServer', {
+ alwaysExecuteCallback: true,
+ collectionArray: fromSrd.concat(_constants.ABILITIES).concat(_constants.FIELDS.pb).concat(_constants.FIELDS.savingThrow).concat(['spell_ability', 'dice_system']),
+ process: function process(data) {
+ parseSpellFromSRD(data, 'repeating_spell' + getLevel(data) + '_' + generateRowID());
+ fromSrd.forEach(function (field) {
+ if (data[field]) {
+ data[field] = '';
+ }
+ });
+ },
+ processCallback: function processCallback() {
+ updateSpells();
+ updateSpellsChatMacro();
+ countSpells();
+ },
+ serverCallCallback: function serverCallCallback() {
+ (0, _processing.clearProcessing)();
+ (0, _server.getSetItems)('processComplete', {
+ collectionArray: ['sheet_processing_complete'],
+ process: function process(data) {
+ data.sheet_processing_complete = 'drag_from_srd';
+ }
+ });
+ }
+ });
+ });
+};
+
+var setupSpells = exports.setupSpells = function setupSpells() {
+ _constants.SPELL_LEVELS.forEach(function (spellLevel) {
+ on('change:repeating_spell' + spellLevel, function (eventInfo) {
+ var repeatingInfo = (0, _utilities.getRepeatingInfo)('repeating_spell' + spellLevel, eventInfo);
+ if (repeatingInfo && repeatingInfo.field === 'spell_spellLevel') {
+ changeLevel(spellLevel, repeatingInfo);
+ } else if (repeatingInfo && repeatingInfo.field !== 'toggle_details') {
+ updateSpells({
+ levelsToUpdate: [spellLevel],
+ repeatingInfo: repeatingInfo
+ });
+ updateSpellsChatMacro([spellLevel]);
+ countSpells();
+ }
+ });
+ on('change:_reporder_repeating_spell' + spellLevel + ' remove:repeating_spell' + spellLevel, function () {
+ updateSpellsChatMacro([spellLevel]);
+ countSpells();
+ });
+ on('change:spell_slots_level_' + spellLevel + '_bonus', function () {
+ setSpellSlots();
+ });
+ on('change:spell_slots_level_' + spellLevel + ' change:spell_slots_level_' + spellLevel + '_expended', function () {
+ updateSpellSlots({
+ levelsToUpdate: [spellLevel],
+ spellSlots: true
+ });
+ });
+ });
+ on('change:distance_system', function () {
+ updateSpells();
+ });
+ on('change:spell_slots_toggle change:spell_points_toggle', function () {
+ updateSpellsChatMacro();
+ });
+
+ on('change:spell_ability', function () {
+ updateSpellAbility();
+ });
+ on('change:warlock_spell_slots_calc change:warlock_spell_slots_bonus change:warlock_spell_slots_expended change:warlock_spell_slots', function () {
+ updateSpellSlots({
+ warlockSlots: true
+ });
+ });
+ on('change:spell_slots_toggle', function () {
+ updateHasSpellSlots();
+ });
+ on('change:warlock_slots_toggle', function () {
+ updateHasWarlockSlots();
+ });
+ on('change:spell_points_toggle', function () {
+ updateHasSpellPoints();
+ });
+ on('change:automatic_higher_level_queries change:warlock_spell_slot_level', function () {
+ updateSpellSlots({
+ higherLevelQueries: true
+ });
+ });
+ on('change:spell_ability change:base_dc', function () {
+ updateDCAndAttack();
+ });
+ on('change:spell_level_filter_all', function () {
+ filtersToggleAll();
+ });
+ var filters = _constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_level_filter_' + spellLevel;
+ });
+ on(filters.map(function (field) {
+ return 'change:' + field;
+ }).join(' '), function () {
+ filtersMacroOutput();
+ });
+ on('change:repeating_trait:content', function (eventInfo) {
+ var repeatingInfo = (0, _utilities.getRepeatingInfo)('repeating_trait', eventInfo);
+ findSpellcasting(repeatingInfo);
+ });
+};
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupAbilityChecks = exports.updateSkill = exports.updateAbilityChecks = exports.updateAbilityChecksMacro = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilities = __webpack_require__(3);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+/* global on:false, getTranslationByKey:false, removeRepeatingRow:false */
+
+var updateAbilityChecksMacro = exports.updateAbilityChecksMacro = function updateAbilityChecksMacro() {
+ (0, _server.getSetItems)('abilityChecks.updateMacro', {
+ collectionArray: _constants.FIELDS.d20.concat(['ability_checks_query_var', 'ability_checks_macro_var']).concat(['skills_macro_var']).concat(['honor_toggle', 'sanity_toggle']).concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_check_formula';
+ })).concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_check_mod_with_sign';
+ })),
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['name', 'ability', 'formula', 'total_with_sign'],
+ name: 'repeating_skill'
+ }],
+ process: function process(data, repStrings) {
+ var macroArray = [];
+ var skillsMacroArray = [];
+ var queryArray = [];
+ data.skills_macro_var = '';
+
+ _constants.ABILITIES.forEach(function (ability) {
+ if ((ability !== 'honor' || ability === 'honor' && (0, _utilities.exists)(data.honor_toggle)) && (ability !== 'sanity' || ability === 'sanity' && (0, _utilities.exists)(data.sanity_toggle))) {
+ var total = data[ability + '_check_mod_with_sign'] || '+0';
+ var abilityCheckFormula = data[ability + '_check_formula'] ? data[ability + '_check_formula'].replace(/}}/g, '}}') : '';
+ macroArray.push('[' + getTranslationByKey(ability.toUpperCase()) + ' ' + total + '](~shaped_' + ability + '_check)');
+ var abilityCheckQuery = getTranslationByKey(ability.toUpperCase()) + ' ' + total + ',{{title=' + getTranslationByKey(ability.toUpperCase()) + ' ' + getTranslationByKey('CHECK') + '}} ' + abilityCheckFormula;
+ queryArray.push(abilityCheckQuery);
+ }
+ });
+ repStrings.forEach(function (repString) {
+ var total = data[repString + '_total_with_sign'] || '+0';
+ var skillButton = '[' + data[repString + '_name'] + ' ' + total + '](~' + repString + '_skill)';
+ var skillFormula = data[repString + '_formula'] ? data[repString + '_formula'].replace(/}}/g, '}}') : '';
+ macroArray.push(skillButton);
+ skillsMacroArray.push(skillButton);
+ var abilityCheckQuery = data[repString + '_name'] + ' (' + getTranslationByKey((0, _abilities.getAbilityShortName)(data[repString + '_ability']).toUpperCase()) + ') ' + total + ', {{title=' + data[repString + '_name'] + ' (' + getTranslationByKey((0, _abilities.getAbilityShortName)(data[repString + '_ability']).toUpperCase()) + ')}} ' + skillFormula;
+ queryArray.push(abilityCheckQuery);
+ });
+ data.ability_checks_macro_var = macroArray.join(', ');
+ data.skills_macro_var = skillsMacroArray.join(', ');
+ data.ability_checks_query_var = '?{Ability Check|' + queryArray.join('|') + '}';
+ }
+ });
+};
+
+var updateAbilityChecksInner = function updateAbilityChecksInner(data) {
+ _constants.ABILITIES.forEach(function (ability) {
+ var obj = {
+ abilityCheck: data[ability + '_mod'],
+ abilityCheckFormula: ''
+ };
+
+ obj.abilityCheckFormula = (0, _utilities.addTo)(obj.abilityCheckFormula, (0, _abilities.getAbilityMod)(data, ability) + '[' + getTranslationByKey((0, _abilities.getAbilityShortName)(ability).toUpperCase()).toLowerCase() + ']');
+
+ if ((ability === 'strength' || ability === 'dexterity' || ability === 'constitution') && (0, _utilities.exists)(data.class_feature_fighter_champion_remarkable_athlete_toggle)) {
+ var remarkableAthlete = (0, _utilities.getHalfPB)(data, 'roundUp');
+ if ((0, _utilities.exists)(remarkableAthlete) && !isNaN(remarkableAthlete)) {
+ obj.abilityCheck += remarkableAthlete;
+ }
+ obj.abilityCheckFormula = (0, _utilities.addTo)(obj.abilityCheckFormula, remarkableAthlete + '[' + getTranslationByKey('CLASS_FEATURE_FIGHTER_CHAMPION_REMARKABLE_ATHLETE').toLowerCase() + ']');
+ } else if ((0, _utilities.exists)(data.class_feature_bard_jack_of_all_trades_toggle)) {
+ var jackOfAllTrades = (0, _utilities.getHalfPB)(data);
+ if ((0, _utilities.exists)(jackOfAllTrades) && !isNaN(jackOfAllTrades)) {
+ obj.abilityCheck += jackOfAllTrades;
+ }
+ obj.abilityCheckFormula = (0, _utilities.addTo)(obj.abilityCheckFormula, jackOfAllTrades + '[' + getTranslationByKey('CLASS_FEATURE_BARD_JACK_OF_ALL_TRADES').toLowerCase() + ']');
+ }
+
+ (0, _utilities.addModifier)(data, obj, 'ability_check', 'abilityCheck', 'abilityCheckFormula', '' + getTranslationByKey('ABILITY_CHECK_MODIFIER').toLowerCase());
+ (0, _utilities.addModifier)(data, obj, ability + '_check', 'abilityCheck', 'abilityCheckFormula', getTranslationByKey(ability.toUpperCase()).toLowerCase() + ' ' + getTranslationByKey('CHECK_MODIFIER').toLowerCase());
+
+ data[ability + '_check_formula'] = '{{roll1=[[@{shaped_d20}@{d20_mod} + ' + obj.abilityCheckFormula + ']]}}';
+ if (data.shaped_d20 === '1d20') {
+ data[ability + '_check_formula'] += ' {{roll2=[[@{shaped_d20}@{d20_mod} + ' + obj.abilityCheckFormula + ']]}}';
+ }
+ data[ability + '_check_mod_with_sign'] = (0, _utilities.showSign)(obj.abilityCheck);
+ });
+};
+
+var updateInitiative = function updateInitiative(data) {
+ var obj = {
+ initiative: 0,
+ initiativeFormula: ''
+ };
+ var initiativeAbility = data.initiative_ability || 'DEX';
+ var abilityMod = (0, _abilities.getAbilityMod)(data, initiativeAbility);
+
+ if ((0, _utilities.exists)(initiativeAbility)) {
+ obj.initiative += abilityMod;
+ obj.initiativeFormula = (0, _utilities.addTo)(obj.initiativeFormula, abilityMod + '[' + getTranslationByKey(initiativeAbility).toLowerCase() + ']');
+
+ (0, _utilities.addModifier)(data, obj, (0, _abilities.getAbilityNameFromShortName)(initiativeAbility) + '_check', 'initiative', 'initiativeFormula', getTranslationByKey(initiativeAbility).toLowerCase() + ' ' + getTranslationByKey('CHECK_MODIFIER').toLowerCase());
+ }
+
+ (0, _utilities.addModifier)(data, obj, 'initiative', 'initiative', 'initiativeFormula', getTranslationByKey(initiativeAbility).toLowerCase() + ' ' + getTranslationByKey('MODIFIER').toLowerCase());
+
+ if ((0, _utilities.exists)(data.class_feature_fighter_champion_remarkable_athlete_toggle)) {
+ var remarkableAthlete = (0, _utilities.getHalfPB)(data, 'roundUp');
+ if ((0, _utilities.exists)(remarkableAthlete) && !isNaN(remarkableAthlete)) {
+ obj.initiative += remarkableAthlete;
+ }
+ obj.initiativeFormula = (0, _utilities.addTo)(obj.initiativeFormula, remarkableAthlete + '[' + getTranslationByKey('CLASS_FEATURE_FIGHTER_CHAMPION_REMARKABLE_ATHLETE').toLowerCase() + ']');
+ } else if ((0, _utilities.exists)(data.class_feature_bard_jack_of_all_trades_toggle)) {
+ var jackOfAllTrades = (0, _utilities.getHalfPB)(data);
+ if ((0, _utilities.exists)(jackOfAllTrades) && !isNaN(jackOfAllTrades)) {
+ obj.initiative += jackOfAllTrades;
+ }
+ obj.initiativeFormula = (0, _utilities.addTo)(obj.initiativeFormula, jackOfAllTrades + '[' + getTranslationByKey('CLASS_FEATURE_BARD_JACK_OF_ALL_TRADES').toLowerCase() + ']');
+ }
+
+ (0, _utilities.addModifier)(data, obj, 'ability_check', 'initiative', 'initiativeFormula', '' + getTranslationByKey('ABILITY_CHECK_MODIFIER').toLowerCase());
+
+ if ((0, _utilities.exists)(obj.initiative)) {
+ obj.initiative = (0, _utilities.showSign)(obj.initiative);
+ } else {
+ obj.initiative = '+0';
+ }
+
+ if ((0, _utilities.exists)(data.initiative_tie_breaker)) {
+ obj.initiativeFormula = (0, _utilities.addTo)(obj.initiativeFormula, parseFloat(obj.initiative) / 100 + '[tie breaker]');
+ }
+
+ var initiativeRoll = '@{initiative_roll}@{d20_mod}';
+ if ((0, _utilities.exists)(data.initiative_to_tracker)) {
+ // TODO: Fix initiative being unset on start
+ initiativeRoll = '@{selected|initiative_roll}@{d20_mod} &{tracker}';
+ }
+
+ data.initiative = obj.initiative;
+ data.initiative_formula = initiativeRoll + ' + ' + obj.initiativeFormula;
+};
+
+var updateAbilityChecks = exports.updateAbilityChecks = function updateAbilityChecks() {
+ (0, _server.getSetItems)('abilityChecks.update', {
+ collectionArray: _constants.FIELDS.pb.concat(_constants.FIELDS.abilityScores).concat(_constants.FIELDS.d20).concat(_constants.FIELDS.abilityCheckModifier).concat(['initiative', 'initiative_ability', 'initiative_formula', 'initiative_modifier', 'initiative_modifier_dice', 'initiative_to_tracker', 'initiative_tie_breaker']).concat(['class_feature_bard_jack_of_all_trades_toggle', 'class_feature_fighter_champion_remarkable_athlete_toggle']).concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_mod';
+ })).concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_check_modifier';
+ })).concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_check_modifier_dice';
+ })).concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_check_mod_with_sign';
+ })).concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_check_formula';
+ })),
+ process: function process(data) {
+ updateAbilityChecksInner(data);
+ updateInitiative(data);
+ },
+ processCallback: function processCallback() {
+ updateAbilityChecksMacro();
+ }
+ });
+};
+
+var updateSkill = exports.updateSkill = function updateSkill() {
+ var collectionArray = _constants.FIELDS.pb.concat(_constants.FIELDS.abilityScores).concat(_constants.FIELDS.d20).concat(_constants.FIELDS.abilityCheckModifier).concat(['class_feature_bard_jack_of_all_trades_toggle', 'class_feature_fighter_champion_remarkable_athlete_toggle']).concat(['class_feature_rogue_reliable_talent_toggle']).concat(['show_passive_skills']).concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_check_modifier';
+ })).concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_check_modifier_dice';
+ }));
+ for (var i = 0; i <= 23; i += 1) {
+ collectionArray.push('skill_' + i + '_modifier');
+ collectionArray.push('skill_' + i + '_modifier_dice');
+ collectionArray.push('skill_' + i + '_passive_modifier');
+ }
+ (0, _server.getSetItems)('abilityChecks.updateSkill', {
+ collectionArray: collectionArray,
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['skill_d20', 'skill_d20_wrap', 'proficiency', 'name', 'storage_name', 'ability', 'formula', 'total', 'total_with_sign', 'passive_total'],
+ name: 'repeating_skill'
+ }],
+ process: function process(data, repStrings) {
+ var i = 0;
+ repStrings.forEach(function (repString) {
+ if (data[repString + '_name'] === '') {
+ removeRepeatingRow(repString);
+ } else {
+ data[repString + '_ability'] = (0, _abilities.getFormattedAbility)(data[repString + '_ability']);
+
+ var obj = {
+ skill: 0,
+ skillFormula: ''
+ };
+ var proficiency = data[repString + '_proficiency'];
+ if (!proficiency || proficiency === 'unproficient') {
+ if ((data[repString + '_ability'] === 'STR' || data[repString + '_ability'] === 'DEX' || data[repString + '_ability'] === 'CON') && (0, _utilities.exists)(data.class_feature_fighter_champion_remarkable_athlete_toggle)) {
+ var remarkableAthlete = (0, _utilities.getHalfPB)(data, 'roundUp');
+ if ((0, _utilities.exists)(remarkableAthlete) && !isNaN(remarkableAthlete)) {
+ obj.skill += remarkableAthlete;
+ }
+ obj.skillFormula = (0, _utilities.addTo)(obj.skillFormula, remarkableAthlete + '[' + getTranslationByKey('CLASS_FEATURE_FIGHTER_CHAMPION_REMARKABLE_ATHLETE').toLowerCase() + ']');
+ } else if ((0, _utilities.exists)(data.class_feature_bard_jack_of_all_trades_toggle)) {
+ var jackOfAllTrades = (0, _utilities.getHalfPB)(data);
+ if ((0, _utilities.exists)(jackOfAllTrades) && !isNaN(jackOfAllTrades)) {
+ obj.skill += jackOfAllTrades;
+ }
+ obj.skillFormula = (0, _utilities.addTo)(obj.skillFormula, jackOfAllTrades + '[' + getTranslationByKey('CLASS_FEATURE_BARD_JACK_OF_ALL_TRADES').toLowerCase() + ']');
+ }
+ if ((0, _utilities.exists)(data[repString + '_skill_d20_wrap'])) {
+ data[repString + '_skill_d20_wrap'] = '@{skill_d20}@{d20_mod}';
+ }
+ } else if (proficiency === 'proficient' || proficiency === 'expertise') {
+ if ((0, _utilities.exists)(data.class_feature_rogue_reliable_talent_toggle)) {
+ data[repString + '_skill_d20_wrap'] = '{@{skill_d20}@{d20_mod}, 0d0+10}kh1[' + getTranslationByKey('CLASS_FEATURE_ROGUE_RELIABLE_TALENT').toLowerCase() + ']';
+ } else if ((0, _utilities.exists)(data[repString + '_skill_d20_wrap'])) {
+ data[repString + '_skill_d20_wrap'] = '@{skill_d20}@{d20_mod}';
+ }
+ if (proficiency === 'proficient') {
+ var pb = (0, _utilities.getPB)(data);
+ if ((0, _utilities.exists)(pb) && !isNaN(pb)) {
+ obj.skill += pb;
+ }
+ obj.skillFormula = (0, _utilities.addTo)(obj.skillFormula, pb + '[' + getTranslationByKey('PROFICIENT').toLowerCase() + ']');
+ } else if (proficiency === 'expertise') {
+ var expertise = (0, _utilities.getExpertise)(data);
+ if ((0, _utilities.exists)(expertise) && !isNaN(expertise)) {
+ obj.skill += expertise;
+ }
+ obj.skillFormula = (0, _utilities.addTo)(obj.skillFormula, expertise + '[' + getTranslationByKey('EXPERTISE').toLowerCase() + ']');
+ }
+ }
+
+ if ((0, _utilities.exists)(data[repString + '_ability'])) {
+ var abilityValue = (0, _abilities.getAbilityMod)(data, data[repString + '_ability']);
+ if ((0, _utilities.exists)(abilityValue)) {
+ obj.skill += abilityValue;
+ }
+ obj.skillFormula = (0, _utilities.addTo)(obj.skillFormula, abilityValue + '[' + getTranslationByKey(data[repString + '_ability']).toLowerCase() + ']');
+
+ (0, _utilities.addModifier)(data, obj, (0, _abilities.getAbilityNameFromShortName)(data[repString + '_ability']), 'skill', 'skillFormula', getTranslationByKey(data[repString + '_ability']).toLowerCase() + ' ' + getTranslationByKey('CHECK_MODIFIER').toLowerCase());
+ }
+
+ (0, _utilities.addModifier)(data, obj, 'skill_' + i, 'skill', 'skillFormula', '' + getTranslationByKey('MODIFIER').toLowerCase());
+ (0, _utilities.addModifier)(data, obj, 'ability_check', 'skill', 'skillFormula', '' + getTranslationByKey('ABILITY_CHECK_MODIFIER').toLowerCase());
+
+ var advantageOrDisadvantage = 0;
+
+ if (data[repString + '_skill_d20'] && data[repString + '_skill_d20'].includes('kh1')) {
+ advantageOrDisadvantage = 5;
+ } else if (data[repString + '_skill_d20'] && data[repString + '_skill_d20'].includes('kl1')) {
+ advantageOrDisadvantage = -5;
+ }
+ data[repString + '_total'] = obj.skill;
+ var storageNameOrName = data[repString + '_storage_name'] || data[repString + '_name'];
+ data[storageNameOrName.toLowerCase()] = obj.skill;
+
+ if ((0, _utilities.exists)(data.show_passive_skills)) {
+ data[repString + '_passive'] = 10 + obj.skill + advantageOrDisadvantage;
+ if ((0, _utilities.exists)(data['skill_' + i + '_passive_modifier']) && !isNaN(data['skill_' + i + '_passive_modifier'])) {
+ data[repString + '_passive'] += parseFloat(data['skill_' + i + '_passive_modifier']);
+ }
+ if (storageNameOrName) {
+ data['passive_' + storageNameOrName.toLowerCase()] = data[repString + '_passive'];
+ }
+ }
+ data[repString + '_total_with_sign'] = (0, _utilities.showSign)(obj.skill);
+ data[repString + '_formula'] = '{{@{' + repString + '_skill_d20}=1}} {{roll1=[[@{' + repString + '_skill_d20_wrap} + ' + obj.skillFormula + ']]}}';
+ if (data.shaped_d20 === '1d20') {
+ data[repString + '_formula'] += ' {{roll2=[[@{' + repString + '_skill_d20_wrap} + ' + obj.skillFormula + ']]}}';
+ }
+ }
+ i += 1;
+ });
+ },
+ processCallback: function processCallback() {
+ updateAbilityChecksMacro();
+ }
+ });
+};
+
+var updateSkillToggle = function updateSkillToggle(repeatingInfo) {
+ (0, _server.getSetItems)('abilityChecks.updateSkillToggle', {
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['proficiency'],
+ name: 'repeating_skill',
+ repeatingInfo: repeatingInfo
+ }],
+ process: function process(data, repStrings) {
+ repStrings.forEach(function (repString) {
+ if (data[repString + '_proficiency'] === '' || data[repString + '_proficiency'] === 'unproficient') {
+ data[repString + '_proficiency'] = 'proficient';
+ } else if (data[repString + '_proficiency'] === 'proficient') {
+ data[repString + '_proficiency'] = 'expertise';
+ } else if (data[repString + '_proficiency'] === 'expertise') {
+ data[repString + '_proficiency'] = 'unproficient';
+ }
+ });
+ },
+ processCallback: function processCallback() {
+ updateSkill();
+ }
+ });
+};
+
+var setupAbilityChecks = exports.setupAbilityChecks = function setupAbilityChecks() {
+ var abilityCheckWatch = _constants.FIELDS.pb.concat(['initiative_ability', 'initiative_to_tracker', 'initiative_tie_breaker']).concat(['class_feature_bard_jack_of_all_trades_toggle', 'class_feature_fighter_champion_remarkable_athlete_toggle']).concat(_constants.ABILITIES);
+
+ on(abilityCheckWatch.map(function (field) {
+ return 'change:' + field;
+ }).join(' '), function () {
+ updateAbilityChecks();
+ });
+
+ on('change:repeating_skill', function (eventInfo) {
+ var repeatingInfo = (0, _utilities.getRepeatingInfo)('repeating_skill', eventInfo);
+ if (repeatingInfo && repeatingInfo.field === 'prof_toggle') {
+ updateSkillToggle(repeatingInfo);
+ }
+ if (repeatingInfo && repeatingInfo.field !== 'prof_toggle' && repeatingInfo.field !== 'total' && repeatingInfo.field !== 'total_with_sign' && repeatingInfo.field !== 'passive_total' && repeatingInfo.field !== 'passive_total_with_sign' && repeatingInfo.field !== 'formula') {
+ updateSkill();
+ }
+ });
+ var updateSkillWatch = _constants.FIELDS.pb.concat(['class_feature_bard_jack_of_all_trades_toggle', 'class_feature_fighter_champion_remarkable_athlete_toggle', 'class_feature_rogue_reliable_talent_toggle']).concat(_constants.ABILITIES).concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_check_formula';
+ }));
+
+ updateSkillWatch = updateSkillWatch.map(function (ability) {
+ return 'change:' + ability;
+ }).join(' ');
+ on(updateSkillWatch, function () {
+ updateSkill();
+ });
+ on('change:show_passive_skills', function () {
+ updateSkill();
+ });
+ on('change:_reporder_repeating_skill remove:repeating_skill change:honor_toggle change:sanity_toggle', function () {
+ updateAbilityChecksMacro();
+ });
+};
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupProcessing = exports.clearProcessing = exports.addToProcessing = undefined;
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+/* global on:false */
+
+var addToProcessing = exports.addToProcessing = function addToProcessing(name, addToProcessingCallback) {
+ (0, _server.getSetItems)(name + ' processing', {
+ collectionArray: ['processing'],
+ process: function process(data) {
+ if (!(0, _utilities.isUndefinedOrEmpty)(data.processing) && typeof data.processing === 'string') {
+ data.processing = data.processing.split(', ');
+ } else {
+ data.processing = [];
+ }
+ if (typeof name === 'string') {
+ if (data.processing && !data.processing.includes(name)) {
+ data.processing.push(name);
+ }
+ } else if (Array.isArray(name)) {
+ data.processing = (0, _utilities.uniqueArray)(data.processing.concat(name));
+ }
+ data.processing = data.processing.join(', ');
+ },
+ processCallback: function processCallback() {
+ if (addToProcessingCallback) {
+ addToProcessingCallback();
+ }
+ }
+ });
+};
+
+var clearProcessing = exports.clearProcessing = function clearProcessing() {
+ (0, _server.getSetItems)('clear processing', {
+ collectionArray: ['processing'],
+ process: function process(data) {
+ data.processing = '';
+ }
+ });
+};
+
+/*
+const removeFromProcessing = (data, name) => {
+ if (!isUndefinedOrEmpty(data.processing) && typeof data.processing === 'string') {
+ data.processing = data.processing.split(', ');
+ } else {
+ data.processing = [];
+ }
+ const index = data.processing.indexOf(name);
+ if (index >= 0) {
+ data.processing.splice(index, 1);
+ }
+ if (data.processing && data.processing.length > 0) {
+ data.processing = data.processing.join(', ');
+ } else {
+ data.processing = '';
+ }
+};
+
+*/
+
+var setupProcessing = exports.setupProcessing = function setupProcessing() {
+ on('change:close_processing', function () {
+ clearProcessing();
+ });
+};
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupSavingThrows = exports.updateAllSavingThrows = exports.findHighestSavingThrow = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilities = __webpack_require__(3);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } /* global on:false, getTranslationByKey:false */
+
+var getHighestOfAbilityScoresForSavingThrow = function getHighestOfAbilityScoresForSavingThrow(data, savingThrow) {
+ var abilityName = '';
+ var highestValue = 0;
+ _constants.ABILITIES.forEach(function (ability) {
+ var abilityMod = (0, _abilities.getAbilityMod)(data, ability);
+ if ((0, _utilities.exists)(data[savingThrow + '_' + ability]) && (highestValue === 0 || abilityMod > highestValue)) {
+ highestValue = abilityMod;
+ abilityName = ability;
+ }
+ });
+ return abilityName;
+};
+
+var findHighestSavingThrow = exports.findHighestSavingThrow = function findHighestSavingThrow(arr) {
+ var highestAbility = Math.max.apply(Math, _toConsumableArray(arr.map(function (ability) {
+ return ability.score;
+ })));
+ return arr.find(function (ability) {
+ return ability.score === highestAbility;
+ });
+};
+
+var getHighestAbilityScores = function getHighestAbilityScores(data, savingThrow) {
+ var abilitiesArray = [];
+ // todo: use reduce
+ _constants.ABILITIES.forEach(function (ability) {
+ if ((0, _utilities.exists)(data[savingThrow + '_' + ability])) {
+ abilitiesArray.push({
+ name: ability,
+ score: (0, _abilities.getAbilityScore)(data, ability)
+ });
+ }
+ });
+
+ var highestAbilities = [];
+ if (abilitiesArray && abilitiesArray.length > 0) {
+ var highestAbilityObj = findHighestSavingThrow(abilitiesArray);
+
+ highestAbilities.push(highestAbilityObj);
+ abilitiesArray.splice(abilitiesArray.findIndex(function (ability) {
+ return ability.name === highestAbilityObj.name;
+ }), 1);
+ }
+ if (abilitiesArray && abilitiesArray.length > 0) {
+ var secondHighestAbilityObj = findHighestSavingThrow(abilitiesArray);
+ highestAbilities.push(secondHighestAbilityObj);
+ }
+
+ return highestAbilities;
+};
+
+var getAverageOfHighestAbilityScoresForSavingThrow = function getAverageOfHighestAbilityScoresForSavingThrow(data, savingThrow) {
+ var obj = {
+ abilitiesUsed: []
+ };
+ var sum = 0;
+
+ var highestAbilities = getHighestAbilityScores(data, savingThrow);
+ highestAbilities.forEach(function (ability) {
+ obj.abilitiesUsed.push(getTranslationByKey((0, _abilities.getAbilityShortName)(ability.name).toUpperCase()).toLowerCase());
+ sum += (0, _abilities.getAbilityScore)(data, ability.name);
+ });
+
+ if (obj.abilitiesUsed && obj.abilitiesUsed.length > 0) {
+ obj.avg = (0, _abilities.getMod)(sum / obj.abilitiesUsed.length);
+ }
+ return obj;
+};
+
+var setCustomSaveProf = function setCustomSaveProf(data, savingThrow) {
+ _constants.ABILITIES.forEach(function (ability) {
+ if ((0, _utilities.exists)(data[savingThrow + '_' + ability]) && (0, _utilities.exists)(data[ability + '_saving_throw_proficient'])) {
+ data[savingThrow + '_saving_throw_proficient'] = 1;
+ }
+ });
+};
+
+var updateSavingThrowsMacro = function updateSavingThrowsMacro(data) {
+ var macroArray = [];
+ var queryArray = [];
+ if ((0, _utilities.exists)(data.use_custom_saving_throws)) {
+ _constants.CUSTOM_SAVING_THROWS.forEach(function (customSavingThrow) {
+ var total = data[customSavingThrow + '_saving_throw_mod_with_sign'] || '+0';
+ macroArray.push('[^{' + customSavingThrow.toUpperCase() + '} ' + total + '](~shaped_' + customSavingThrow + '_saving_throw)');
+ var savingThrowQuery = (0, _utilities.capitalize)(customSavingThrow) + ' ' + total + ',{{title=' + getTranslationByKey(customSavingThrow.toUpperCase()) + ' ' + getTranslationByKey('SAVING_THROW') + '}} ' + data[customSavingThrow + '_saving_throw_formula'].replace(/}}/g, '}}');
+ queryArray.push(savingThrowQuery);
+ });
+ } else {
+ _constants.ABILITIES.forEach(function (ability) {
+ if ((ability !== 'honor' || ability === 'honor' && (0, _utilities.exists)(data.honor_toggle)) && (ability !== 'sanity' || ability === 'sanity' && (0, _utilities.exists)(data.sanity_toggle))) {
+ var _total = data[ability + '_saving_throw_mod_with_sign'] || '+0';
+ macroArray.push('[^{' + ability.toUpperCase() + '} ' + _total + '](~shaped_' + ability + '_saving_throw)');
+ var _savingThrowQuery = (0, _utilities.capitalize)(ability) + ' ' + _total + ',{{title=' + getTranslationByKey(ability.toUpperCase()) + ' ' + getTranslationByKey('SAVING_THROW') + '}} ' + data[ability + '_saving_throw_formula'].replace(/}}/g, '}}');
+ queryArray.push(_savingThrowQuery);
+ }
+ });
+ }
+ var total = data.death_saving_throw_mod_with_sign || '+0';
+ macroArray.push('[^{DEATH} ' + total + '](~shaped_death_saving_throw)');
+ var savingThrowQuery = getTranslationByKey('DEATH') + ' ' + total + ', {{title=' + getTranslationByKey('DEATH') + ' ' + getTranslationByKey('SAVING_THROW') + '}} {{death_saving_throw_chances=@{death_saving_throw_chances}}} {{death_saving_throw_successes=@{death_saving_throw_successes}}} {{death_saving_throw_failures=@{death_saving_throw_failures}}} ' + data.death_saving_throw_formula.replace(/}}/g, '}}');
+ queryArray.push(savingThrowQuery);
+ data.saving_throw_macro_var = macroArray.join(', ');
+ data.saving_throw_query_var = '?{Saving Throw|' + queryArray.join('|') + '}';
+};
+
+var updateSavingThrows = function updateSavingThrows(savingThrows) {
+ var collectionArray = _constants.FIELDS.pb.concat(_constants.FIELDS.d20).concat(['saving_throw_modifier', 'saving_throw_modifier_dice', 'saving_throws_half_proficiency', 'average_of_abilities']).concat(['saving_throw_macro_var', 'saving_throw_query_var', 'use_custom_saving_throws', 'honor_toggle', 'sanity_toggle']).concat(_constants.FIELDS.abilityScores).concat(_constants.SAVING_THROWS.concat(_constants.CUSTOM_SAVING_THROWS).map(function (savingThrow) {
+ return savingThrow + '_saving_throw_proficient';
+ })).concat(_constants.SAVING_THROWS.concat(_constants.CUSTOM_SAVING_THROWS).map(function (savingThrow) {
+ return savingThrow + '_saving_throw_modifier';
+ })).concat(_constants.SAVING_THROWS.concat(_constants.CUSTOM_SAVING_THROWS).map(function (savingThrow) {
+ return savingThrow + '_saving_throw_mod_with_sign';
+ })).concat(_constants.SAVING_THROWS.concat(_constants.CUSTOM_SAVING_THROWS).map(function (savingThrow) {
+ return savingThrow + '_saving_throw_formula';
+ }));
+
+ _constants.CUSTOM_SAVING_THROWS.forEach(function (savingThrow) {
+ collectionArray = collectionArray.concat(_constants.ABILITIES.map(function (ability) {
+ return savingThrow + '_' + ability;
+ }));
+ });
+
+ (0, _server.getSetItems)('savingThrows.update', {
+ collectionArray: collectionArray,
+ process: function process(data) {
+ if (!data.use_custom_saving_throws) {
+ _constants.CUSTOM_SAVING_THROWS.forEach(function (savingThrow) {
+ savingThrows.splice(savingThrows.indexOf(savingThrow), 1);
+ });
+ }
+ savingThrows.forEach(function (savingThrow) {
+ var obj = {
+ savingThrow: 0,
+ savingThrowFormula: ''
+ };
+ var ability = void 0;
+
+ if ((0, _utilities.exists)(data[savingThrow + '_saving_throw_proficient'])) {
+ var pb = (0, _utilities.getPB)(data);
+ if ((0, _utilities.exists)(pb) && !isNaN(pb)) {
+ obj.savingThrow += pb;
+ }
+ obj.savingThrowFormula = (0, _utilities.addTo)(obj.savingThrowFormula, pb + '[' + getTranslationByKey('PROFICIENT').toLowerCase() + ']');
+ } else if ((0, _utilities.exists)(data.saving_throws_half_proficiency)) {
+ var halfPB = (0, _utilities.getHalfPB)(data);
+ if ((0, _utilities.exists)(halfPB) && !isNaN(halfPB)) {
+ obj.savingThrow += halfPB;
+ }
+ obj.savingThrowFormula = (0, _utilities.addTo)(obj.savingThrowFormula, halfPB + '[' + getTranslationByKey('HALF_PROFICIENCY').toLowerCase() + ']');
+ }
+
+ if (_constants.CUSTOM_SAVING_THROWS.includes(savingThrow)) {
+ if ((0, _utilities.exists)(data.average_of_abilities)) {
+ var averageObj = getAverageOfHighestAbilityScoresForSavingThrow(data, savingThrow);
+
+ if (averageObj.avg) {
+ obj.savingThrow += averageObj.avg;
+ obj.savingThrowFormula = (0, _utilities.addTo)(obj.savingThrowFormula, averageObj.avg + '[' + averageObj.abilitiesUsed.join(' ') + ' ' + getTranslationByKey('AVG').toLowerCase() + ']');
+ }
+ } else {
+ ability = getHighestOfAbilityScoresForSavingThrow(data, savingThrow);
+ }
+ setCustomSaveProf(data, savingThrow);
+ } else if (savingThrow !== 'death') {
+ ability = savingThrow;
+ }
+
+ if (ability) {
+ obj.savingThrow += (0, _abilities.getAbilityMod)(data, ability);
+ obj.savingThrowFormula = (0, _utilities.addTo)(obj.savingThrowFormula, (0, _abilities.getAbilityMod)(data, ability) + '[' + getTranslationByKey((0, _abilities.getAbilityShortName)(ability).toUpperCase()).toLowerCase() + ']');
+ }
+ if (savingThrow === 'death') {
+ ability = savingThrow;
+ }
+
+ (0, _utilities.addModifier)(data, obj, 'saving_throw', 'savingThrow', 'savingThrowFormula', '' + getTranslationByKey('SAVING_THROW_MODIFIER').toLowerCase());
+ (0, _utilities.addModifier)(data, obj, savingThrow + '_saving_throw', 'savingThrow', 'savingThrowFormula', getTranslationByKey(savingThrow.toUpperCase()).toLowerCase() + ' ' + getTranslationByKey('SAVING_THROW_MODIFIER').toLowerCase());
+
+ data[savingThrow + '_saving_throw_formula'] = '{{roll1=[[@{shaped_d20}@{d20_mod} + ' + obj.savingThrowFormula + ']]}}';
+ if (data.shaped_d20 === '1d20') {
+ data[savingThrow + '_saving_throw_formula'] += ' {{roll2=[[@{shaped_d20}@{d20_mod} + ' + obj.savingThrowFormula + ']]}}';
+ }
+ data[savingThrow + '_saving_throw_mod_with_sign'] = (0, _utilities.showSign)(obj.savingThrow);
+ });
+ updateSavingThrowsMacro(data);
+ }
+ });
+};
+
+var updateAllSavingThrows = exports.updateAllSavingThrows = function updateAllSavingThrows() {
+ updateSavingThrows(_constants.SAVING_THROWS.concat(_constants.CUSTOM_SAVING_THROWS));
+};
+
+var setupSavingThrows = exports.setupSavingThrows = function setupSavingThrows() {
+ _constants.SAVING_THROWS.forEach(function (savingThrow) {
+ var savingThrowWatch = [savingThrow + '_saving_throw_proficient'];
+
+ on(savingThrowWatch.map(function (savingThrowField) {
+ return 'change:' + savingThrowField;
+ }).join(' '), function () {
+ updateSavingThrows([savingThrow]);
+ });
+ });
+
+ _constants.CUSTOM_SAVING_THROWS.forEach(function (customSavingThrow) {
+ var savingThrowWatch = [customSavingThrow + '_saving_throw_proficient'].concat(_constants.ABILITIES.map(function (ability) {
+ return customSavingThrow + '_' + ability;
+ }));
+
+ on(savingThrowWatch.map(function (savingThrow) {
+ return 'change:' + savingThrow;
+ }).join(' '), function () {
+ updateSavingThrows([customSavingThrow]);
+ });
+ });
+
+ on('change:saving_throws_half_proficiency change:average_of_abilities change:use_custom_saving_throws change:honor_toggle change:sanity_toggle', function () {
+ updateAllSavingThrows();
+ });
+};
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.convertDistance = undefined;
+
+var _utilities = __webpack_require__(0);
+
+var feetMetersNameConversion = {
+ feet: 'meters',
+ foot: 'meter',
+ ft: 'm',
+ 'ft.': 'm.',
+ kilometer: 'mile',
+ kilometers: 'miles',
+ 'm.': 'ft.',
+ meter: 'foot',
+ meters: 'feet',
+ mile: 'kilometer',
+ miles: 'kilometers',
+ 'mt.': 'ft.'
+};
+
+var convertDistanceTypes = function convertDistanceTypes(data, field, multiplier, searchTerms) {
+ var regex = new RegExp('(\\d+\\.?\\d*)(?:\\/(\\d+\\.?\\d*))?(\\s|-)?\\s?(' + searchTerms.join('|') + ')', 'i');
+ var result = void 0;
+ while ((result = regex.exec(data[field])) !== null) {
+ if (result && result[1] && result[4]) {
+ var secondDistance = '';
+ var spacing = '';
+
+ result[1] = (0, _utilities.round)(parseFloat(result[1]) * multiplier);
+
+ if (result[2]) {
+ secondDistance = '/' + (0, _utilities.round)(parseFloat(result[2]) * multiplier);
+ }
+ if (result[3]) {
+ spacing = result[3];
+ }
+
+ data[field] = data[field].replace(regex, '' + result[1] + secondDistance + spacing + feetMetersNameConversion[result[4]]);
+ }
+ }
+};
+
+var convertDistance = exports.convertDistance = function convertDistance(data, field) {
+ if ((0, _utilities.exists)(field) && (0, _utilities.exists)(data[field])) {
+ if (data.distance_system === 'FEET') {
+ // convert to feet
+ convertDistanceTypes(data, field, 3.280839895, ['meters', 'meter', 'm\\.', 'kilometers', 'kilometer']);
+ } else if (data.distance_system === 'METERS') {
+ // convert to meters
+ convertDistanceTypes(data, field, 0.3048, ['feet', 'foot', 'ft', 'ft\\.', 'miles', 'mile']);
+ }
+ }
+};
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupEquipment = exports.updateCarryingCapacity = exports.parseItemFromSRDWithServer = exports.updateEquipment = exports.updateArmor = exports.updateWeight = exports.parseItemFromSRD = exports.cleanContent = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _utilities = __webpack_require__(0);
+
+var _abilities = __webpack_require__(3);
+
+var _actionComponents = __webpack_require__(15);
+
+var _actions = __webpack_require__(4);
+
+var _armorClass = __webpack_require__(18);
+
+var _attack = __webpack_require__(12);
+
+var _damage = __webpack_require__(13);
+
+var _server = __webpack_require__(1);
+
+var _processing = __webpack_require__(7);
+
+/* global on:false, generateRowID:false, getTranslationByKey:false */
+
+var cleanContent = exports.cleanContent = function cleanContent(content) {
+ return content.trim().replace(/.*(\\n)/, '').trim().replace(/.*(\\n)/, '').trim().replace(/.*(\\n)/, '').replace('. ', '. ').replace(/\*\*\n\t/g, '**').replace(/\*\*\n/g, '**').replace(/:\*\*/g, '**:').replace(/\s\s\n\n/g, '\n\n').replace(/“/g, '"').replace(/”/g, '"').replace(/'/g, '’').trim().trim();
+};
+
+var parseAttackType = function parseAttackType(data, repString) {
+ data[repString + '_attack_toggle'] = 1;
+ data[repString + '_attack_type'] = data.item_type_from_srd.toUpperCase().replace(/\s/g, '_') + '_ATTACK';
+ (0, _attack.setAttackAbilityBasedOnAttackType)(data, repString);
+};
+
+var parseDamage = function parseDamage(data, repString) {
+ if (data.damage_from_srd) {
+ if (isNaN(data.damage_from_srd)) {
+ (0, _utilities.parseDiceAndDieFromSRD)(data, repString, 'attack_damage', 'damage_from_srd');
+ } else {
+ data[repString + '_attack_damage_bonus'] = data.damage_from_srd;
+ }
+ (0, _damage.setDamageAbilityBasedOnAttackType)(data, repString, 'attack');
+ }
+};
+
+var parseSecondaryDamage = function parseSecondaryDamage(data, repString) {
+ if (data.secondary_damage_from_srd) {
+ if (isNaN(data.secondary_damage_from_srd)) {
+ (0, _utilities.parseDiceAndDieFromSRD)(data, repString, 'attack_second_damage', 'secondary_damage_from_srd');
+ } else {
+ data[repString + '_attack_damage_bonus'] = data.secondary_damage_from_srd;
+ }
+ }
+};
+
+var parseDamageType = function parseDamageType(data, repString) {
+ if (data.damage_type_from_srd) {
+ data[repString + '_attack_damage_type'] = (0, _utilities.lowercaseDamageTypes)(data.damage_type_from_srd);
+ }
+};
+
+var parseRange = function parseRange(data, repString) {
+ if (data.range_from_srd) {
+ data[repString + '_range'] = data.range_from_srd + ' ft.';
+ }
+};
+
+var parseModifiers = function parseModifiers(data, repString) {
+ if (data.modifiers_from_srd) {
+ var attackRegex = /(?:Melee|Ranged|Weapon) Attacks \+(\d+)/gi;
+ var attackBonus = attackRegex.exec(data.modifiers_from_srd);
+ if (attackBonus && attackBonus[1]) {
+ if (!data[repString + '_attack_bonus'] || data[repString + '_attack_bonus'] === '') {
+ data[repString + '_attack_bonus'] = parseInt(attackBonus[1], 10);
+ } else {
+ data[repString + '_attack_bonus'] += ' + ' + parseInt(attackBonus[1], 10);
+ }
+ }
+ var damageRegex = /(?:Melee|Ranged|Weapon) Damage \+(\d+)/gi;
+ var damageBonus = damageRegex.exec(data.modifiers_from_srd);
+ if (damageBonus && damageBonus[1]) {
+ if (!data[repString + '_attack_damage_bonus'] || data[repString + '_attack_damage_bonus'] === '') {
+ data[repString + '_attack_damage_bonus'] = parseInt(damageBonus[1], 10);
+ } else {
+ data[repString + '_attack_damage_bonus'] += ' + ' + parseInt(damageBonus[1], 10);
+ }
+ }
+ }
+};
+
+var generateDuplicateRepeatingItem = function generateDuplicateRepeatingItem(data, processData, type) {
+ var origRepString = processData.repString;
+ var section = (0, _utilities.getRepeatingItemOfRepeatingString)(origRepString);
+ var rowId = generateRowID();
+ processData.newRowId = rowId;
+
+ var newRepString = section + '_' + rowId;
+ if (type === 'versatile') {
+ data[newRepString + '_name'] = data[origRepString + '_name'] + ' (' + getTranslationByKey('VERSATILE') + ')';
+ } else if (type === 'thrown') {
+ data[newRepString + '_name'] = data[origRepString + '_name'] + ' (' + getTranslationByKey('THROWN') + ')';
+ }
+ var fieldsToCopy = _constants.REPEATING_FIELDS.attack.concat(_constants.REPEATING_FIELDS.attackDamage).concat(_constants.REPEATING_FIELDS.weight).concat(_constants.REPEATING_FIELDS.content);
+
+ fieldsToCopy.forEach(function (field) {
+ if ((0, _utilities.exists)(data[origRepString + '_' + field])) {
+ data[newRepString + '_' + field] = data[origRepString + '_' + field];
+ }
+ });
+ data[newRepString + '_toggle_details'] = 0;
+
+ if (type === 'versatile') {
+ if (data.secondary_damage_from_srd) {
+ if (isNaN(data.secondary_damage_from_srd)) {
+ (0, _utilities.parseDiceAndDieFromSRD)(data, newRepString, 'attack_damage', 'secondary_damage_from_srd');
+ data.secondary_damage_from_srd = '';
+ } else {
+ data[origRepString + '_attack_damage_bonus'] = data.secondary_damage_from_srd;
+ }
+ }
+ } else if (type === 'thrown') {
+ data[newRepString + '_attack_type'] = 'RANGED_WEAPON_ATTACK';
+ data[newRepString + '_ammo_field_name'] = data[origRepString + '_name'] + 's';
+ if (data.range_from_srd) {
+ parseRange(data, newRepString);
+ data.range_from_srd = '';
+ }
+ data[newRepString + '_reach'] = '';
+ }
+};
+
+var parseReach = function parseReach(data, repString) {
+ if (data.properties_from_srd.includes('Reach')) {
+ data[repString + '_reach'] = '10 ft.';
+ } else if (data[repString + '_attack_type'] && data[repString + '_attack_type'].toLowerCase().includes('melee')) {
+ data[repString + '_reach'] = '5 ft.';
+ }
+};
+
+var parseProperties = function parseProperties(data, processData) {
+ if (data.properties_from_srd) {
+ parseReach(data, processData.repString);
+ if (data.properties_from_srd.toLowerCase().includes('finesse')) {
+ data[processData.repString + '_attack_ability'] = 'FIN';
+ data[processData.repString + '_attack_damage_ability'] = 'FIN';
+ }
+ if (data.properties_from_srd.toLowerCase().includes('versatile')) {
+ generateDuplicateRepeatingItem(data, processData, 'versatile');
+ }
+ if (data.properties_from_srd.toLowerCase().includes('thrown')) {
+ generateDuplicateRepeatingItem(data, processData, 'thrown');
+ }
+ }
+};
+
+var parseAmmo = function parseAmmo(data, repString) {
+ if (data[repString + '_attack_type'] === 'RANGED_WEAPON_ATTACK' && data[repString + '_name']) {
+ if (data[repString + '_name'].toLowerCase().includes('crossbow')) {
+ data[repString + '_ammo_field_name'] = 'Bolts';
+ } else if (data[repString + '_name'].toLowerCase().includes('bow')) {
+ data[repString + '_ammo_field_name'] = 'Arrows';
+ } else if (data[repString + '_name'].toLowerCase().includes('blowgun')) {
+ data[repString + '_ammo_field_name'] = 'Blowgun needles';
+ } else if (data[repString + '_name'].toLowerCase().includes('sling')) {
+ data[repString + '_ammo_field_name'] = 'Sling bullets';
+ }
+ data[repString + '_ammo_per_use'] = 1;
+ }
+};
+
+var parseOffense = function parseOffense(data, processData) {
+ parseAttackType(data, processData.repString);
+ parseDamage(data, processData.repString);
+ parseDamageType(data, processData.repString);
+ parseProperties(data, processData);
+ parseSecondaryDamage(data, processData.repString);
+ parseRange(data, processData.repString);
+ parseModifiers(data, processData.repString);
+ parseAmmo(data, processData.repString);
+};
+
+var parseAmmunition = function parseAmmunition(data, repString) {
+ if (data[repString + '_name']) {
+ if (data[repString + '_name'].toLowerCase().includes('arrows')) {
+ data[repString + '_weight'] = .05; // eslint-disable-line no-floating-decimal
+ } else if (data[repString + '_name'].toLowerCase().includes('blowgun needles')) {
+ data[repString + '_weight'] = .02; // eslint-disable-line no-floating-decimal
+ } else if (data[repString + '_name'].toLowerCase().includes('sling bullets') || data.name.toLowerCase().includes('bolts')) {
+ data[repString + '_weight'] = .075; // eslint-disable-line no-floating-decimal
+ }
+ }
+ data[repString + '_uses'] = 1;
+};
+
+var parseArmor = function parseArmor(data, repString) {
+ if (data.ac_from_srd) {
+ data[repString + '_ac_base'] = parseInt(data.ac_from_srd || 0, 10);
+ }
+ if (data[repString + '_type']) {
+ if (data[repString + '_type'] === 'LIGHT_ARMOR') {
+ data[repString + '_ac_ability'] = 'DEX';
+ } else if (data[repString + '_type'] === 'MEDIUM_ARMOR') {
+ data[repString + '_ac_ability'] = 'DEX_MAX_X';
+ }
+ }
+
+ if (data.modifiers_from_srd) {
+ var acMatch = data.modifiers_from_srd.match(/Ac\s?\+?(\d)/i);
+ if (acMatch && acMatch[1]) {
+ data[repString + '_ac_bonus'] = parseInt(acMatch[1], 10);
+ }
+ /*
+ const savingThrowsMatch = data[`${repString}_modifiers`].match(/Saving\s?Throws\s?\+?(\d)/i);
+ if (isUndefinedOrEmpty(data[`${repString}_saving_throws_bonus`]) && savingThrowsMatch && savingThrowsMatch[1]) {
+ // TODO: add the following to modifiers: data[`${repString}_saving_throws_bonus`] = parseInt(savingThrowsMatch[1], 10);
+ }
+ const spellAttackMatch = data[`${repString}_modifiers`].match(/Spell\s?Attack\s?\+?(\d)/i);
+ if (isUndefinedOrEmpty(data[`${repString}_spell_attack_bonus`]) && spellAttackMatch && spellAttackMatch[1]) {
+ // TODO: add the following to modifiers: data[`${repString}_spell_attack_bonus`] = parseInt(spellAttackMatch[1], 10);
+ }
+ const spellDCMatch = data[`${repString}_modifiers`].match(/Spell\s?Dc\s?\+?(\d)/i);
+ if (isUndefinedOrEmpty(data[`${repString}_spell_dc_bonus`]) && spellDCMatch && spellDCMatch[1]) {
+ // TODO: add the following to modifiers: data[`${repString}_spell_dc_bonus`] = parseInt(spellDCMatch[1], 10);
+ }
+ */
+ }
+ if (data.stealth_from_srd) {
+ data[repString + '_stealth'] = data.stealth_from_srd;
+ }
+};
+
+var weightPerUse = function weightPerUse(data, repString) {
+ data[repString + '_uses'] = 1;
+ data[repString + '_per_use'] = 1;
+ data[repString + '_recharge'] = 'MANUAL';
+ data[repString + '_weight_per_use'] = 1;
+ if ((0, _utilities.exists)(data[repString + '_content'])) {
+ var match = data[repString + '_content'].match(/(\d+) charges/i);
+ if (match && match[1]) {
+ data[repString + '_uses'] = parseFloat(match[1]);
+ data[repString + '_uses_max'] = data[repString + '_uses'];
+ }
+ }
+};
+
+var parseUtility = function parseUtility(data, repString) {
+ weightPerUse(data, repString);
+ if (['healer’s kit', 'iron spikes', 'spikes, iron'].includes(data.name_from_srd.toLowerCase())) {
+ data[repString + '_uses'] = 10;
+ data[repString + '_weight'] = data[repString + '_weight'] / data[repString + '_uses'];
+ }
+};
+
+var parseEquipment = function parseEquipment(data, repString) {
+ if (['ink', 'perfume', 'rations', 'waterskin'].includes(data.name_from_srd.toLowerCase())) {
+ weightPerUse(data, repString);
+ }
+ if (data.name_from_srd.toLowerCase() === 'rations') {
+ data[repString + '_content'] = data[repString + '_content'] + ' (Adventurers require 1 lb of food per day)';
+ }
+ if (data.name_from_srd.toLowerCase() === 'waterskin') {
+ data[repString + '_weight'] = data[repString + '_weight'] * 2;
+ data[repString + '_content'] = data[repString + '_content'].replace('4 pints', '0.5 gallons') + ' 2 waterskins (1 use) were added to allow for a typical day\u2019s use. (Adventurers require 1 gallon of water per day, 2 gallons in hot weather)';
+ }
+};
+
+var parseName = function parseName(data, repString) {
+ if (data.name_from_srd) {
+ data[repString + '_name'] = data.name_from_srd;
+ }
+};
+
+var parseItemType = function parseItemType(data, repString) {
+ if (data.item_type_from_srd) {
+ data[repString + '_type'] = data.item_type_from_srd.toUpperCase().replace(/\s/g, '_');
+ }
+};
+
+var parseContent = function parseContent(data, repString) {
+ if (data.content_from_srd) {
+ data[repString + '_content'] = cleanContent(data.content_from_srd);
+ }
+};
+
+var parseWeight = function parseWeight(data, repString) {
+ if (data.weight_from_srd) {
+ data[repString + '_weight'] = parseFloat(data.weight_from_srd);
+ }
+};
+
+var parseStandardFields = function parseStandardFields(data, repString) {
+ parseName(data, repString);
+ parseItemType(data, repString);
+ parseContent(data, repString);
+ parseWeight(data, repString);
+};
+
+var fromSrd = ['category_from_srd', 'name_from_srd', 'item_type_from_srd', 'damage_from_srd', 'damage_type_from_srd', 'secondary_damage_from_srd', 'modifiers_from_srd', 'properties_from_srd', 'range_from_srd', 'reach_from_srd', 'weight_from_srd', 'ac_from_srd', 'stealth_from_srd', 'content_from_srd'];
+
+var parseItemFromSRD = exports.parseItemFromSRD = function parseItemFromSRD(data, processData) {
+ data.name_from_srd = (0, _utilities.cleanName)(data.name_from_srd) || '';
+
+ if (['Melee Weapon', 'Ranged Weapon'].includes(data.item_type_from_srd)) {
+ processData.section = (0, _utilities.exists)(data.is_npc) ? 'action' : 'offense';
+ processData.repString = 'repeating_' + processData.section + '_' + processData.rowId;
+ parseStandardFields(data, processData.repString);
+ parseOffense(data, processData);
+ } else if (['Ammunition'].includes(data.item_type_from_srd)) {
+ processData.section = 'ammo';
+ processData.repString = 'repeating_' + processData.section + '_' + processData.rowId;
+ parseName(data, processData.repString);
+ parseWeight(data, processData.repString);
+ parseAmmunition(data, processData.repString);
+ } else if (['Light Armor', 'Medium Armor', 'Heavy Armor', 'Shield'].includes(data.item_type_from_srd)) {
+ processData.section = 'armor';
+ processData.repString = 'repeating_' + processData.section + '_' + processData.rowId;
+ parseStandardFields(data, processData.repString);
+ parseArmor(data, processData.repString);
+ } else if (['Potion', 'Wand'].includes(data.item_type_from_srd) || (0, _utilities.exists)(data.damage) || ['antitoxin', 'ball bearings', 'caltrops', 'healer’s kit', 'holy water'].includes(data.name_from_srd.toLowerCase())) {
+ processData.section = 'utility';
+ processData.repString = 'repeating_' + processData.section + '_' + processData.rowId;
+ parseStandardFields(data, processData.repString);
+ parseUtility(data, processData.repString);
+ } else {
+ processData.section = 'equipment';
+ processData.repString = 'repeating_' + processData.section + '_' + processData.rowId;
+ parseStandardFields(data, processData.repString);
+ parseEquipment(data, processData.repString);
+ }
+ if (processData.repString) {
+ data[processData.repString + '_toggle_details'] = 0;
+ }
+ fromSrd.forEach(function (field) {
+ if (data[field]) {
+ data[field] = '';
+ }
+ });
+};
+
+var updateWeight = exports.updateWeight = function updateWeight() {
+ (0, _server.getSetItems)('updateWeight', {
+ collectionArray: ['weight_offense', 'weight_utility', 'weight_ammo', 'weight_armor', 'weight_equipment', 'weight_coinage', 'weight_total'],
+ process: function process(data) {
+ data.weight_total = (0, _utilities.round)((parseFloat(data.weight_offense) || 0) + (parseFloat(data.weight_utility) || 0) + (parseFloat(data.weight_ammo) || 0) + (parseFloat(data.weight_armor) || 0) + (parseFloat(data.weight_equipment) || 0) + (parseFloat(data.weight_coinage) || 0));
+ }
+ });
+};
+
+var calculateAC = function calculateAC(data, repString, highestACWithBase) {
+ data[repString + '_ac_total'] = 0;
+ if ((0, _utilities.exists)(data[repString + '_ac_base'])) {
+ data[repString + '_ac_total'] += parseInt(data[repString + '_ac_base'] || 0, 10);
+ }
+ if ((0, _utilities.exists)(data[repString + '_ac_ability'])) {
+ if (data[repString + '_ac_ability'] === 'DEX_MAX_X') {
+ data[repString + '_ac_total'] += Math.min(parseInt(data.medium_armor_max_dex || 2, 10), (0, _abilities.getAbilityMod)(data, 'dexterity'));
+ } else {
+ data[repString + '_ac_total'] += (0, _abilities.getAbilityMod)(data, data[repString + '_ac_ability']);
+ }
+ }
+ if ((0, _utilities.exists)(data[repString + '_ac_second_ability'])) {
+ data[repString + '_ac_total'] += (0, _abilities.getAbilityMod)(data, data[repString + '_ac_second_ability']);
+ }
+
+ if ((0, _utilities.exists)(data[repString + '_ac_bonus'])) {
+ data[repString + '_ac_total'] += parseInt(data[repString + '_ac_bonus'] || 0, 10);
+ }
+ if ((0, _utilities.exists)(data[repString + '_ac_total'])) {
+ if (data[repString + '_type'] !== 'SHIELD' && (0, _utilities.exists)(data[repString + '_ac_base'])) {
+ if (parseInt(data[repString + '_ac_total'], 10) > highestACWithBase) {
+ data.ac_from_armor = data.ac_from_armor - highestACWithBase + parseInt(data[repString + '_ac_total'] || 0, 10);
+ return data[repString + '_ac_total'];
+ }
+ } else {
+ data.ac_from_armor += data[repString + '_ac_total'];
+ }
+ }
+ return highestACWithBase;
+};
+
+var setAdvantageOnStealth = function setAdvantageOnStealth(mode) {
+ (0, _server.getSetItems)('setAdvantageOnStealth', {
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['storage_name', 'skill_d20'],
+ name: 'repeating_skill'
+ }],
+ process: function process(data, repStrings) {
+ var skillId = (0, _utilities.getSkillIdByStorageName)(data, repStrings, 'STEALTH');
+ if (skillId) {
+ if (mode === 'dis') {
+ data['repeating_skill_' + skillId + '_skill_d20'] = '2d20kl1';
+ } else if (mode === 'normal') {
+ data['repeating_skill_' + skillId + '_skill_d20'] = '@{shaped_d20}';
+ }
+ }
+ }
+ });
+};
+
+var updateArmor = exports.updateArmor = function updateArmor(repeatingInfo) {
+ var stealthPenalty = void 0;
+ (0, _server.getSetItems)('updateArmor ' + (repeatingInfo ? repeatingInfo.rowId : ''), {
+ collectionArray: ['is_npc', 'ac_from_armor', 'medium_armor_max_dex', 'proficient_armor_weighs'].concat(['weight_system', 'weight_armor']).concat(_constants.FIELDS.abilityScores),
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['type', 'stealth'].concat(['ac_base', 'ac_ability', 'ac_second_ability', 'ac_bonus', 'ac_total']).concat(_constants.REPEATING_FIELDS.default).concat(_constants.REPEATING_FIELDS.content).concat(_constants.REPEATING_FIELDS.uses).concat(_constants.REPEATING_FIELDS.recharge).concat(_constants.REPEATING_FIELDS.weight).concat(['worn']),
+ name: 'repeating_armor'
+ }],
+ process: function process(data, repStrings) {
+ if ((0, _utilities.exists)(data.is_npc)) {
+ return;
+ }
+ data.ac_from_armor = 10 + (0, _abilities.getAbilityMod)(data, 'dexterity');
+ var highestACWithBase = data.ac_from_armor;
+ data.weight_armor = 0;
+ repStrings.forEach(function (repString) {
+ data[repString + '_roll_formula'] = '';
+ (0, _actionComponents.parseActionComponents)(data, repString, repeatingInfo);
+ (0, _actionComponents.updateUses)(data, repString);
+ (0, _actionComponents.updateRecharge)(data, repString);
+ (0, _actionComponents.changeWeightSystem)(data, repString);
+ (0, _actionComponents.weighActionComponents)(data, repString, {
+ repeatingSectionTotal: 'weight_armor',
+ toggle: 'worn',
+ weightMultiplier: 'proficient_armor_weighs'
+ });
+ (0, _actionComponents.updateContent)(data, repString);
+
+ if (repeatingInfo && (repeatingInfo.field === 'type' || repeatingInfo.field === 'name')) {
+ if (data[repString + '_type'] === 'LIGHT_ARMOR') {
+ data[repString + '_ac_ability'] = 'DEX';
+ } else if (data[repString + '_type'] === 'MEDIUM_ARMOR') {
+ data[repString + '_ac_ability'] = 'DEX_MAX_X';
+ } else {
+ data[repString + '_ac_ability'] = '';
+ }
+ }
+ if ((0, _utilities.exists)(data[repString + '_worn'])) {
+ highestACWithBase = calculateAC(data, repString, highestACWithBase);
+
+ if (data[repString + '_stealth'] === 'Disadvantage') {
+ stealthPenalty = true;
+ }
+ }
+ });
+ if (stealthPenalty) {
+ setAdvantageOnStealth('dis');
+ } else {
+ setAdvantageOnStealth('normal');
+ }
+ data.weight_armor = (0, _utilities.round)(data.weight_armor);
+ },
+ processCallback: function processCallback() {
+ (0, _armorClass.updateArmorClass)();
+ updateWeight();
+ }
+ });
+};
+
+var updateEquipment = exports.updateEquipment = function updateEquipment(repeatingInfo) {
+ (0, _server.getSetItems)('update', {
+ collectionArray: ['weight_system', 'weight_equipment'],
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: _constants.REPEATING_FIELDS.default.concat(_constants.REPEATING_FIELDS.content).concat(_constants.REPEATING_FIELDS.uses).concat(_constants.REPEATING_FIELDS.recharge).concat(_constants.REPEATING_FIELDS.weight).concat(['type', 'carried']),
+ name: 'repeating_equipment',
+ repeatingInfo: repeatingInfo
+ }],
+ process: function process(data, repStrings) {
+ if (!repeatingInfo || !repeatingInfo.rowId) {
+ data.weight_equipment = 0;
+ }
+ repStrings.forEach(function (repString) {
+ data[repString + '_roll_formula'] = '';
+ (0, _actionComponents.parseActionComponents)(data, repString);
+ (0, _actionComponents.updateUses)(data, repString);
+ (0, _actionComponents.updateRecharge)(data, repString);
+ (0, _actionComponents.changeWeightSystem)(data, repString);
+ (0, _actionComponents.weighActionComponents)(data, repString, {
+ repeatingInfo: repeatingInfo,
+ repeatingSectionTotal: 'weight_equipment',
+ toggle: 'carried'
+ });
+ (0, _actionComponents.updateContent)(data, repString);
+ });
+ data.weight_equipment = (0, _utilities.round)(data.weight_equipment);
+ },
+ processCallback: function processCallback() {
+ updateWeight();
+ }
+ });
+};
+
+var parseItemFromSRDWithServer = exports.parseItemFromSRDWithServer = function parseItemFromSRDWithServer() {
+ (0, _processing.addToProcessing)('parseItemFromSRD', function () {
+ var processData = {
+ rowId: generateRowID(),
+ section: ''
+ };
+ (0, _server.getSetItems)('item.parseItemsFromSRD', {
+ alwaysExecuteCallback: true,
+ collectionArray: fromSrd.concat(_constants.ABILITIES).concat(_constants.FIELDS.pb).concat(['is_npc', 'dice_system']),
+ process: function process(data) {
+ parseItemFromSRD(data, processData);
+ },
+ processCallback: function processCallback() {
+ if (processData.section === 'offense' || processData.section === 'utility' || processData.section === 'action') {
+ (0, _actions.updateActions)([processData.section], {
+ rowId: processData.newRowId ? [processData.rowId, processData.newRowId] : processData.rowId
+ });
+ } else if (processData.section === 'armor') {
+ updateArmor({
+ rowId: processData.rowId
+ });
+ } else if (processData.section === 'equipment') {
+ updateEquipment({
+ rowId: processData.rowId
+ });
+ }
+ },
+ serverCallCallback: function serverCallCallback() {
+ (0, _processing.clearProcessing)();
+ }
+ });
+ });
+};
+
+var addCommonEquipmentItems = function addCommonEquipmentItems() {
+ (0, _server.getSetItems)('addCommonEquipmentItems', {
+ process: function process(data) {
+ var commonEquipment = [{
+ content: 'A backpack can hold one cubic foot or 30 pounds of gear. You can also strap items, such as a Bedroll or a coil of rope, to the outside of a backpack.',
+ name: 'Backpack',
+ type: 'Adventuring Gear',
+ weight: 5
+ }, {
+ name: 'Bedroll',
+ type: 'Adventuring Gear',
+ weight: 7
+ }, {
+ name: 'Traveler\'s Clothes',
+ type: 'Adventuring Gear',
+ weight: 4
+ }, {
+ content: 'Rations consist of dry foods suitable for extended travel, including jerky, dried fruit, hardtack, and nuts.',
+ name: 'Rations',
+ type: 'Adventuring Gear',
+ weight: 2
+ }, {
+ content: 'A waterskin can hold up to 4 pints of liquid.',
+ name: 'Waterskin',
+ type: 'Adventuring Gear',
+ weight: 5
+ }, {
+ content: 'This tin box contains a cup and simple cutlery. The box clamps together, and one side can be used as a cooking pan and the other as a plate or shallow bowl.',
+ name: 'Mess Kit',
+ type: 'Adventuring Gear',
+ weight: 1
+ }, {
+ content: 'This small container holds flint, fire steel, and tinder (usually dry cloth soaked in light oil) used to kindle a fire. Using it to light a torch - or anything else with abundant, exposed fuel - takes an action. Lighting any other fire takes 1 minute.',
+ name: 'Tinderbox',
+ type: 'Adventuring Gear',
+ weight: 1
+ }, {
+ content: 'This kit is a leather pouch containing bandages, salves, and splints. The kit has ten uses. As an action, you can expend one use of the kit to stabilize a creature that has 0 hit points, without needing to make a Wisdom (Medicine) check.',
+ name: 'Healer\'s Kit',
+ type: 'Adventuring Gear',
+ weight: 3
+ }];
+
+ commonEquipment.forEach(function (equipment) {
+ var repString = 'repeating_equipment_' + generateRowID();
+ Object.keys(equipment).forEach(function (field) {
+ data[repString + '_' + field] = equipment[field];
+ });
+ });
+ },
+ processCallback: function processCallback() {
+ updateEquipment();
+ }
+ });
+};
+
+var weighAmmo = function weighAmmo() {
+ (0, _server.getSetItems)('weighAmmo', {
+ collectionArray: ['weight_system', 'weight_ammo'],
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: _constants.REPEATING_FIELDS.weight,
+ name: 'repeating_ammo'
+ }],
+ process: function process(data, repStrings) {
+ data.weight_ammo = 0;
+ repStrings.forEach(function (repString) {
+ (0, _actionComponents.changeWeightSystem)(data, repString, 0.05);
+ (0, _actionComponents.weighActionComponents)(data, repString, {
+ repeatingSectionTotal: 'weight_ammo',
+ weightDefault: 0.05
+ });
+ });
+ data.weight_ammo = (0, _utilities.round)(data.weight_ammo);
+ },
+ processCallback: function processCallback() {
+ updateWeight();
+ }
+ });
+};
+
+var calculateGold = function calculateGold() {
+ (0, _server.getSetItems)('calculateGold', {
+ collectionArray: ['cp', 'copper_per_gold', 'sp', 'silver_per_gold', 'ep', 'electrum_per_gold', 'gp', 'pp', 'platinum_per_gold', 'weight_per_coin', 'total_gp', 'weight_coinage'],
+ process: function process(data) {
+ var copperPieces = parseFloat(data.cp);
+ var silverPieces = parseFloat(data.sp);
+ var electrumPieces = parseFloat(data.ep);
+ var goldPieces = parseFloat(data.gp);
+ var platinumPieces = parseFloat(data.pp);
+ var copperPerGold = parseFloat(data.copper_per_gold) || 100;
+ var silverPerGold = parseFloat(data.silver_per_gold) || 10;
+ var electrumPerGold = parseFloat(data.electrum_per_gold) || 2;
+ var platinumPerGold = parseFloat(data.platinum_per_gold) || 10;
+ var weightPerCoin = parseFloat(data.weight_per_coin) || 0;
+
+ data.total_gp = (copperPieces / copperPerGold + silverPieces / silverPerGold + electrumPieces / electrumPerGold + goldPieces + platinumPieces * platinumPerGold).toFixed(2);
+ data.weight_coinage = (0, _utilities.round)((copperPieces + silverPieces + electrumPieces + goldPieces + platinumPieces) * weightPerCoin);
+ },
+ processCallback: function processCallback() {
+ updateWeight();
+ }
+ });
+};
+
+var updateCarryingCapacity = exports.updateCarryingCapacity = function updateCarryingCapacity() {
+ (0, _server.getSetItems)('updateCarryingCapacity', {
+ collectionArray: ['strength', 'strength_score_modifier', 'ability_score_modifier'].concat(['carrying_capacity', 'carrying_capacity_multiplier']).concat(['max_push_drag_lift', 'max_push_drag_lift_multiplier']).concat(['encumbered', 'encumbered_multiplier']).concat(['heavily_encumbered', 'heavily_encumbered_multiplier']).concat(['racial_feature_powerful_build']),
+ process: function process(data) {
+ var strength = (0, _abilities.getAbilityScore)(data, 'strength');
+ var powerfulBuild = (0, _utilities.exists)(data.racial_feature_powerful_build) ? 2 : 1;
+
+ data.carrying_capacity = (0, _utilities.round)(strength * (parseFloat(data.carrying_capacity_multiplier) || 15) * powerfulBuild);
+ data.max_push_drag_lift = (0, _utilities.round)(strength * (parseFloat(data.max_push_drag_lift_multiplier) || 30) * powerfulBuild);
+ data.encumbered = (0, _utilities.round)(strength * (parseFloat(data.encumbered_multiplier) || 5) * powerfulBuild);
+ data.heavily_encumbered = (0, _utilities.round)(strength * (parseFloat(data.heavily_encumbered_multiplier) || 10) * powerfulBuild);
+ }
+ });
+};
+
+var setupEquipment = exports.setupEquipment = function setupEquipment() {
+ on('change:repeating_armor', function (eventInfo) {
+ var repeatingInfo = (0, _utilities.getRepeatingInfo)('repeating_armor', eventInfo);
+ if (repeatingInfo && repeatingInfo.field !== 'ac_total' && repeatingInfo.field !== 'toggle_details') {
+ updateArmor(repeatingInfo);
+ }
+ });
+ var armorWatch = ['medium_armor_max_dex'].concat(_constants.ABILITIES).concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_score_modifier';
+ }));
+
+ on(armorWatch.map(function (armorField) {
+ return 'change:' + armorField;
+ }).join(' ') + ' remove:repeating_armor', function () {
+ updateArmor();
+ });
+ on('change:repeating_equipment', function (eventInfo) {
+ var repeatingInfo = (0, _utilities.getRepeatingInfo)('repeating_equipment', eventInfo);
+ if (repeatingInfo && repeatingInfo.field !== 'toggle_details') {
+ updateEquipment(repeatingInfo);
+ }
+ });
+ on('remove:repeating_equipment', function () {
+ updateEquipment();
+ });
+ on('change:add_common_equipment_items', function () {
+ addCommonEquipmentItems();
+ });
+ on('change:repeating_ammo:weight change:repeating_ammo:uses remove:repeating_ammo', function () {
+ weighAmmo();
+ });
+ on('change:weight_offense change:weight_utility change:weight_ammo change:weight_armor change:weight_equipment change:weight_coinage', function () {
+ updateWeight();
+ });
+ on('change:cp change:copper_per_gold change:sp change:silver_per_gold change:ep change:electrum_per_gold change:gp change:pp change:platinum_per_gold change:weight_per_coin', function () {
+ calculateGold();
+ });
+ on('change:carrying_capacity_multiplier change:max_push_drag_lift_multiplier change:encumbered_multiplier change:heavily_encumbered_multiplier change:racial_feature_powerful_build', function () {
+ updateCarryingCapacity();
+ });
+ on('change:weight_system', function () {
+ updateArmor();
+ updateEquipment();
+ weighAmmo();
+ });
+ on('change:proficient_armor_weighs', function () {
+ updateArmor();
+ });
+};
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupHitDice = exports.updateHitDice = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilities = __webpack_require__(3);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+/* global on:false, getTranslationByKey:false */
+
+var updateHitDice = exports.updateHitDice = function updateHitDice() {
+ (0, _server.getSetItems)('hitDice.update', {
+ collectionArray: ['hit_dice', 'hit_die'].concat(_constants.FIELDS.abilityScores).concat(_constants.HIT_DIE.map(function (hitDie) {
+ return 'hd_d' + hitDie;
+ })).concat(_constants.HIT_DIE.map(function (hitDie) {
+ return 'hd_d' + hitDie + '_max';
+ })).concat(_constants.HIT_DIE.map(function (hitDie) {
+ return 'hd_d' + hitDie + '_query';
+ })).concat(_constants.HIT_DIE.map(function (hitDie) {
+ return 'hd_d' + hitDie + '_formula';
+ })),
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['name', 'hd', 'level'],
+ name: 'repeating_class'
+ }],
+ process: function process(data, repStrings) {
+ _constants.HIT_DIE.forEach(function (hitDie) {
+ if ((0, _utilities.exists)(data['hd_d' + hitDie + '_max'])) {
+ data['hd_d' + hitDie + '_max'] = 0;
+ }
+ });
+
+ var monsterHitDice = parseInt(data.hit_dice || 0, 10);
+ var monsterHitDie = data.hit_die;
+ if (monsterHitDice && monsterHitDie) {
+ data['hd_' + monsterHitDie] = monsterHitDice;
+ data['hd_' + monsterHitDie + '_max'] = monsterHitDice;
+ }
+
+ repStrings.forEach(function (repString) {
+ if (data[repString + '_hd'] && data[repString + '_name'] !== 0 && data[repString + '_name'] !== '0' && data[repString + '_level']) {
+ if ((0, _utilities.isUndefinedOrEmpty)(data['hd_' + data[repString + '_hd'] + '_max'])) {
+ data['hd_' + data[repString + '_hd'] + '_max'] = 0;
+ }
+ data['hd_' + data[repString + '_hd'] + '_max'] += parseInt(data[repString + '_level'] || 0, 10);
+ }
+ });
+ var conMod = (0, _abilities.getAbilityMod)(data, 'constitution');
+
+ _constants.HIT_DIE.forEach(function (hitDie) {
+ if ((0, _utilities.exists)(data['hd_d' + hitDie + '_max'])) {
+ if ((0, _utilities.isUndefinedOrEmpty)(data['hd_d' + hitDie])) {
+ data['hd_d' + hitDie] = data['hd_d' + hitDie + '_max'];
+ }
+ data['hd_d' + hitDie + '_query'] = '?{HD';
+ if (data['hd_d' + hitDie] > 0) {
+ for (var x = 1; x <= data['hd_d' + hitDie]; x += 1) {
+ data['hd_d' + hitDie + '_query'] += '|' + x;
+ }
+ } else {
+ data['hd_d' + hitDie + '_query'] += '|0';
+ }
+
+ data['hd_d' + hitDie + '_query'] += '}';
+
+ data['hd_d' + hitDie + '_formula'] = '{{roll1=[[{(' + data['hd_d' + hitDie + '_query'] + ')d' + hitDie + ' + (' + data['hd_d' + hitDie + '_query'] + ' * ' + conMod + ')[' + getTranslationByKey('HIT_DICE').toLowerCase() + ' * ' + getTranslationByKey('CON').toLowerCase() + '], 0d0}kh1[minimum of 0]]]}}';
+ } else {
+ if ((0, _utilities.exists)(data['hd_d' + hitDie])) {
+ data['hd_d' + hitDie] = 0;
+ }
+ if ((0, _utilities.exists)(data['hd_d' + hitDie + '_query'])) {
+ data['hd_d' + hitDie + '_query'] = '';
+ }
+ if ((0, _utilities.exists)(data['hd_d' + hitDie + '_formula'])) {
+ data['hd_d' + hitDie + '_formula'] = '';
+ }
+ }
+ });
+ }
+ });
+};
+
+var setupHitDice = exports.setupHitDice = function setupHitDice() {
+ var hdWatch = ['hit_dice', 'hit_die'].concat(_constants.HIT_DIE.map(function (hitDie) {
+ return 'hd_d' + hitDie + '_max';
+ })).map(function (field) {
+ return 'change:' + field;
+ }).join(' ');
+ on(hdWatch, function () {
+ updateHitDice();
+ });
+};
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.parseAttack = exports.parseToHit = exports.parseReachAndRange = exports.updateAttack = exports.addAbility = exports.setAttackAbilityBasedOnAttackType = undefined;
+
+var _abilities = __webpack_require__(3);
+
+var _damage = __webpack_require__(13);
+
+var _distance = __webpack_require__(9);
+
+var _utilities = __webpack_require__(0);
+
+/* global getTranslationByKey:false */
+
+var addProficiency = function addProficiency(data, repString, attackData) {
+ if ((0, _utilities.isUndefined)(data[repString + '_proficiency']) || (0, _utilities.exists)(data[repString + '_proficiency'])) {
+ var pb = (0, _utilities.getPB)(data);
+ if ((0, _utilities.exists)(pb) && !isNaN(pb)) {
+ attackData.toHit += pb;
+ }
+ attackData.formula = (0, _utilities.addTo)(attackData.formula, pb + '[' + getTranslationByKey('PROFICIENT').toLowerCase() + ']');
+ }
+};
+
+var setAttackAbilityBasedOnAttackType = exports.setAttackAbilityBasedOnAttackType = function setAttackAbilityBasedOnAttackType(data, repString) {
+ data[repString + '_attack_toggle'] = 1;
+ var section = (0, _utilities.getRepeatingSectionOfRepeatingString)(repString);
+ if (data[repString + '_attack_type'] === 'MELEE_WEAPON_ATTACK') {
+ data[repString + '_attack_ability'] = 'STR';
+ } else if (data[repString + '_attack_type'] === 'RANGED_WEAPON_ATTACK') {
+ data[repString + '_attack_ability'] = 'DEX';
+ } else if (section && section.includes('spell') && (0, _utilities.exists)(data.spell_ability)) {
+ data[repString + '_attack_ability'] = (0, _abilities.getFormattedAbility)(data.spell_ability);
+ }
+};
+
+var attackToggled = function attackToggled(data, repString, repeatingInfo) {
+ if (repeatingInfo && (repeatingInfo.field === 'attack_toggle' || repeatingInfo.field === 'name') && data[repString + '_attack_toggle']) {
+ setAttackAbilityBasedOnAttackType(data, repString);
+ }
+};
+
+var addAbility = exports.addAbility = function addAbility(_ref) {
+ var data = _ref.data,
+ repString = _ref.repString,
+ attackData = _ref.attackData,
+ repeatingInfo = _ref.repeatingInfo,
+ newRepeatingField = _ref.newRepeatingField;
+
+ if (newRepeatingField || repeatingInfo && repeatingInfo.field === 'attack_type') {
+ setAttackAbilityBasedOnAttackType(data, repString);
+ }
+ if ((0, _utilities.exists)(data[repString + '_attack_ability'])) {
+ var attackAbilityValue = (0, _abilities.getAbilityMod)(data, data[repString + '_attack_ability']);
+ if (attackAbilityValue) {
+ attackData.toHit += attackAbilityValue;
+ attackData.formula = (0, _utilities.addTo)(attackData.formula, attackAbilityValue + '[' + getTranslationByKey(data[repString + '_attack_ability'].toUpperCase()).toLowerCase() + ']');
+ }
+ }
+};
+
+var addBonus = function addBonus(data, repString, attackData) {
+ if ((0, _utilities.exists)(data[repString + '_attack_bonus'])) {
+ if (!isNaN(data[repString + '_attack_bonus'])) {
+ attackData.toHit += parseFloat(data[repString + '_attack_bonus']);
+ }
+ attackData.formula = (0, _utilities.addTo)(attackData.formula, data[repString + '_attack_bonus'] + '[' + getTranslationByKey('BONUS').toLowerCase() + ']');
+ }
+};
+
+var addModifier = function addModifier(data, attackData, name, translation) {
+ if ((0, _utilities.exists)(data[name + '_modifier'])) {
+ if (!isNaN(data[name + '_modifier'])) {
+ attackData.addition += parseFloat(data[name + '_modifier']);
+ } else {
+ attackData.string = (0, _utilities.addTo)(attackData.string, data[name + '_modifier']);
+ }
+ attackData.formula = (0, _utilities.addTo)(attackData.formula, data[name + '_modifier']);
+ }
+ if ((0, _utilities.exists)(data[name + '_modifier_dice'])) {
+ attackData.formula = (0, _utilities.addTo)(attackData.formula, '' + data[name + '_modifier_dice']);
+ }
+ if ((0, _utilities.exists)(data[name + '_modifier']) || (0, _utilities.exists)(data[name + '_modifier_dice'])) {
+ attackData.formula += '[' + getTranslationByKey(translation).toLowerCase() + ']';
+ }
+};
+
+var addModifiers = function addModifiers(data, repString, attackData) {
+ addModifier(data, attackData, 'attack', 'ATTACK_MODIFIER');
+ if (data[repString + '_attack_type'] && data[repString + '_attack_type'].includes('WEAPON')) {
+ addModifier(data, attackData, 'weapon_attack', 'WEAPON_ATTACK_MODIFIER');
+ if (data[repString + '_attack_type'] === 'MELEE_WEAPON_ATTACK') {
+ addModifier(data, attackData, 'melee_weapon_attack', 'MELEE_WEAPON_ATTACK_MODIFIER');
+ } else if (data[repString + '_attack_type'] === 'RANGED_WEAPON_ATTACK') {
+ addModifier(data, attackData, 'ranged_weapon_attack', 'RANGED_WEAPON_ATTACK_MODIFIER');
+ }
+ } else if (data[repString + '_attack_type'] && data[repString + '_attack_type'].includes('SPELL')) {
+ addModifier(data, attackData, 'spell_attack', 'SPELL_ATTACK_MODIFIER');
+ }
+};
+
+var updateReachAndRange = function updateReachAndRange(data, repString) {
+ if ((0, _utilities.exists)(data[repString + '_reach']) || (0, _utilities.exists)(data[repString + '_range'])) {
+ if (data[repString + '_attack_string'] !== '') {
+ data[repString + '_attack_string'] += ', ';
+ }
+ if ((0, _utilities.exists)(data[repString + '_reach'])) {
+ (0, _distance.convertDistance)(data, repString + '_reach');
+ data[repString + '_attack_string'] += getTranslationByKey('REACH').toLowerCase() + ' ' + data[repString + '_reach'];
+ data[repString + '_attack_formula'] += ' {{reach=' + data[repString + '_reach'] + '}}';
+ if ((0, _utilities.exists)(data[repString + '_range'])) {
+ data[repString + '_attack_string'] += ' or ';
+ }
+ }
+ if ((0, _utilities.exists)(data[repString + '_range'])) {
+ (0, _distance.convertDistance)(data, repString + '_range');
+ data[repString + '_attack_string'] += getTranslationByKey('RANGE').toLowerCase() + ' ' + data[repString + '_range'];
+ data[repString + '_attack_formula'] += ' {{range=' + data[repString + '_range'] + '}}';
+ }
+ }
+ if ((0, _utilities.exists)(data[repString + '_attack_toggle'])) {
+ var attackTarget = data[repString + '_attack_target'] || 'ONE_TARGET';
+ data[repString + '_attack_string'] += ', ' + getTranslationByKey(attackTarget) + '.';
+ }
+};
+
+var updateAttack = exports.updateAttack = function updateAttack() {
+ var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+ data = _ref2.data,
+ repString = _ref2.repString,
+ repeatingInfo = _ref2.repeatingInfo,
+ newRepeatingField = _ref2.newRepeatingField;
+
+ data[repString + '_attack_string'] = '';
+ if ((0, _utilities.exists)(data[repString + '_attack_toggle'])) {
+ var attackData = {
+ formula: '',
+ toHit: 0
+ };
+
+ (0, _utilities.addToRollFormula)(data, repString, '{{attack_type_macro=[' + getTranslationByKey(data[repString + '_attack_type']) + ':](~' + (0, _utilities.getRepeatingItemOfRepeatingString)(repString) + '_attack)}}');
+
+ attackToggled(data, repString, repeatingInfo);
+ addProficiency(data, repString, attackData);
+ addAbility({
+ attackData: attackData,
+ data: data,
+ newRepeatingField: newRepeatingField,
+ repeatingInfo: repeatingInfo,
+ repString: repString
+ });
+ addBonus(data, repString, attackData);
+ addModifiers(data, repString, attackData);
+
+ var critRange = '';
+ if (data[repString + '_crit_range'] !== '20') {
+ critRange = 'cs>@{crit_range}';
+ }
+ data[repString + '_attack_formula'] = '{{attack1=[[@{shaped_d20}@{d20_mod}' + critRange + ' + ' + attackData.formula + ']]}}';
+ if (data.shaped_d20 === '1d20') {
+ data[repString + '_attack_formula'] += ' {{attack2=[[@{shaped_d20}@{d20_mod}' + critRange + ' + ' + attackData.formula + ']]}}';
+ }
+ if ((0, _utilities.exists)(data.attacks_vs_target_ac)) {
+ data[repString + '_attack_formula'] += ' {{targetAC=@{target|AC}}}';
+ }
+ if ((0, _utilities.exists)(data.attacks_vs_target_name)) {
+ data[repString + '_attack_formula'] += ' {{targetName=@{target|token_name}}}';
+ }
+ data[repString + '_attack_string'] += (0, _utilities.showSign)(attackData.toHit) + ' ' + getTranslationByKey('TO_HIT');
+ data[repString + '_to_hit'] = (0, _utilities.showSign)(attackData.toHit);
+ updateReachAndRange(data, repString);
+ (0, _damage.updateDamages)(data, repString, repeatingInfo, 'attack');
+ (0, _utilities.addToRollFormula)(data, repString, data[repString + '_attack_formula']);
+ }
+};
+
+var parseReachAndRange = exports.parseReachAndRange = function parseReachAndRange(data, repString) {
+ if ((0, _utilities.exists)(data[repString + '_content'])) {
+ var section = (0, _utilities.getRepeatingSectionOfRepeatingString)(repString);
+
+ var reachRegex = /\s?(?:reach)\s?(\d+)\s?(ft\.?|m\.?),?/gi;
+ var reach = reachRegex.exec(data[repString + '_content']);
+ if (reach && reach[1] && reach[2]) {
+ data[repString + '_reach'] = reach[1] + ' ' + reach[2];
+ if (section && !section.includes('spell')) {
+ data[repString + '_content'] = data[repString + '_content'].replace(reachRegex, '');
+ }
+ }
+
+ var rangeRegex = /\s?(?:or)?\s?(?:ranged?)\s?(\d+)(?:\/(\d+))?\s?(ft\.?|m\.?),?/gi;
+ var range = rangeRegex.exec(data[repString + '_content']);
+ if (range && range[1] && range[3]) {
+ var rangeArray = [range[1]];
+ if (range[2]) {
+ rangeArray.push('/' + range[2]);
+ }
+ rangeArray.push(' ' + range[3]);
+ data[repString + '_range'] = rangeArray.join('');
+ if (section && !section.includes('spell')) {
+ data[repString + '_content'] = data[repString + '_content'].replace(rangeRegex, '');
+ }
+ }
+ }
+};
+
+var parseTarget = function parseTarget(data, repString, prefix) {
+ var targetRegex = /one (target|creature)\./gi;
+ var target = targetRegex.exec(data[repString + '_content']);
+
+ if (target) {
+ if (target[1] === 'target') {
+ data[repString + '_' + prefix + '_target'] = 'ONE_TARGET';
+ } else if (target[1] === 'creature') {
+ data[repString + '_' + prefix + '_target'] = 'ONE_CREATURE';
+ }
+ var section = (0, _utilities.getRepeatingSectionOfRepeatingString)(repString);
+ if (section && !section.includes('spell') && (0, _utilities.exists)(data[repString + '_content'])) {
+ data[repString + '_content'] = data[repString + '_content'].replace(targetRegex, '');
+ }
+ }
+};
+
+var getPreciseCorrectAbilityBasedOnBonus = function getPreciseCorrectAbilityBasedOnBonus(data, repString, fieldName, bonus) {
+ var meleeMods = [(0, _abilities.getAbilityMod)(data, 'strength'), (0, _abilities.getAbilityMod)(data, 'dexterity')];
+ var spellMods = [(0, _abilities.getAbilityMod)(data, 'intelligence'), (0, _abilities.getAbilityMod)(data, 'wisdom'), (0, _abilities.getAbilityMod)(data, 'charisma')];
+ var closest = void 0;
+ if (bonus) {
+ if (data[repString + '_attack_type'] && data[repString + '_attack_type'].includes('SPELL')) {
+ closest = (0, _utilities.findClosest)(spellMods, bonus);
+ bonus -= closest;
+ if (closest === spellMods[0]) {
+ data[repString + '_' + fieldName] = 'INT';
+ } else if (closest === spellMods[1]) {
+ data[repString + '_' + fieldName] = 'WIS';
+ } else if (closest === spellMods[2]) {
+ data[repString + '_' + fieldName] = 'CHA';
+ }
+ } else if (data[repString + '_attack_type'] === 'RANGED_WEAPON_ATTACK') {
+ data[repString + '_' + fieldName] = 'DEX';
+ bonus -= (0, _abilities.getAbilityMod)(data, 'dexterity');
+ } else {
+ closest = (0, _utilities.findClosest)(meleeMods, bonus);
+ bonus -= closest;
+ if (closest === meleeMods[0]) {
+ data[repString + '_' + fieldName] = 'STR';
+ } else if (closest === meleeMods[1]) {
+ data[repString + '_' + fieldName] = 'DEX';
+ }
+ }
+ }
+ return bonus;
+};
+
+var parseToHit = exports.parseToHit = function parseToHit(data, repString) {
+ var toHitRegex = /\s?((?:\+|-)\s?\d+?)\s*(?:to hit),?/gi;
+ var toHit = toHitRegex.exec(data[repString + '_content']);
+ if (toHit && (0, _utilities.exists)(toHit[1])) {
+ data[repString + '_attack_toggle'] = 1;
+ var hitBonus = parseInt(toHit[1].replace(' ', ''), 10);
+ hitBonus -= (0, _utilities.calculatePBFromLevelAndChallenge)(data.level, data.challenge);
+
+ hitBonus = getPreciseCorrectAbilityBasedOnBonus(data, repString, 'attack_ability', hitBonus);
+
+ if (hitBonus) {
+ data[repString + '_attack_bonus'] = hitBonus;
+ }
+ var section = (0, _utilities.getRepeatingSectionOfRepeatingString)(repString);
+ if (section && !section.includes('spell') && (0, _utilities.exists)(data[repString + '_content'])) {
+ data[repString + '_content'] = data[repString + '_content'].replace(toHitRegex, '');
+ }
+ }
+};
+
+var parseAttackDamages = function parseAttackDamages(data, repString) {
+ (0, _damage.parseDamage)(data, repString, 'attack_damage');
+ (0, _damage.parseDamage)(data, repString, 'attack_second_damage');
+ (0, _damage.parseDamage)(data, repString, 'attack_versatile_damage');
+};
+
+var parseAttack = exports.parseAttack = function parseAttack(data, repString) {
+ parseReachAndRange(data, repString);
+ parseTarget(data, repString, 'attack');
+ parseToHit(data, repString);
+ parseAttackDamages(data, repString, 'attack');
+};
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.parseDamage = exports.parseDamageFromSRD = exports.updateDamages = exports.updateDamage = exports.setDamageAbilityBasedOnAttackType = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilities = __webpack_require__(3);
+
+var _utilities = __webpack_require__(0);
+
+var hit = /\s?(?:Hit):?\s?/; /* global getTranslationByKey:false */
+
+var optionalPlus = /\s?(?:plus)?\s?/;
+var closeParenthesis = /\)?/;
+var damageType = /\s?((?:[a-zA-Z]+|[a-zA-Z]+\s(?:or|and)\s[a-zA-Z]+)(?:\s*?\([a-zA-Z\s]+\))?)\s*damage\.?\s?(\([a-zA-Z'\s]+\))?/;
+var altDamage = /(?:,\s*?or\s*?)/;
+var twoHands = /(?:\sif\s?used\s?with\s?two\s?hands\.?)/;
+var plus = /\s*?plus\s*?/;
+var taking = /\s*?(?:taking|or take)\s*?/;
+var attackDamageRegex = new RegExp(hit.source + _constants.REGEX.singleNumber.source + _constants.REGEX.openParenthesis.source + _constants.REGEX.diceAndDie.source + _constants.REGEX.plusMinusBonus.source + optionalPlus.source + _constants.REGEX.diceAndDie.source + closeParenthesis.source + damageType.source, 'i');
+var attackDamagePlusRegex = new RegExp(plus.source + _constants.REGEX.singleNumber.source + _constants.REGEX.openParenthesis.source + _constants.REGEX.diceAndDie.source + _constants.REGEX.plusMinusBonus.source + optionalPlus.source + _constants.REGEX.diceAndDie.source + closeParenthesis.source + damageType.source, 'i');
+var attackAltDamageRegex = new RegExp(altDamage.source + _constants.REGEX.singleNumber.source + _constants.REGEX.openParenthesis.source + _constants.REGEX.diceAndDie.source + _constants.REGEX.plusMinusBonus.source + optionalPlus.source + _constants.REGEX.diceAndDie.source + closeParenthesis.source + damageType.source + twoHands.source, 'i');
+var savingThrowDamageRegex = new RegExp(taking.source + _constants.REGEX.singleNumber.source + _constants.REGEX.openParenthesis.source + _constants.REGEX.diceAndDie.source + _constants.REGEX.plusMinusBonus.source + optionalPlus.source + _constants.REGEX.diceAndDie.source + closeParenthesis.source + damageType.source, 'i');
+
+var updateCriticalDamageFromModifiers = function updateCriticalDamageFromModifiers(data, repString, prefix, damageData) {
+ if ((0, _utilities.exists)(data.damage_modifier_dice)) {
+ damageData.critFormula = (0, _utilities.addTo)(damageData.critFormula, '' + data.damage_modifier_dice);
+ damageData.critFormula += '[' + getTranslationByKey('DAMAGE_MODIFIER').toLowerCase() + ']';
+ }
+
+ if (data[repString + '_attack_type'] && data[repString + '_attack_type'].includes('WEAPON')) {
+ if ((0, _utilities.exists)(data.weapon_damage_modifier_dice)) {
+ damageData.critFormula = (0, _utilities.addTo)(damageData.critFormula, '' + data.weapon_damage_modifier_dice);
+ damageData.critFormula += '[' + getTranslationByKey('WEAPON_DAMAGE_MODIFIER').toLowerCase() + ']';
+ }
+ if (data[repString + '_attack_type'] === 'MELEE_WEAPON_ATTACK') {
+ if ((0, _utilities.exists)(data.melee_weapon_damage_modifier_dice)) {
+ damageData.critFormula = (0, _utilities.addTo)(damageData.critFormula, '' + data.melee_weapon_damage_modifier_dice);
+ damageData.critFormula += '[' + getTranslationByKey('MELEE_WEAPON_DAMAGE_MODIFIER').toLowerCase() + ']';
+ }
+ } else if (data[repString + '_attack_type'] === 'RANGED_WEAPON_ATTACK') {
+ if ((0, _utilities.exists)(data.ranged_weapon_damage_modifier_dice)) {
+ damageData.critFormula = (0, _utilities.addTo)(damageData.critFormula, '' + data.ranged_weapon_damage_modifier_dice);
+ damageData.critFormula += '[' + getTranslationByKey('RANGED_WEAPON_DAMAGE_MODIFIER').toLowerCase() + ']';
+ }
+ }
+ } else if (data[repString + '_attack_type'] && data[repString + '_attack_type'].includes('SPELL')) {
+ if ((0, _utilities.exists)(data.spell_damage_modifier_dice)) {
+ damageData.critFormula = (0, _utilities.addTo)(damageData.critFormula, '' + data.spell_damage_modifier_dice);
+ damageData.critFormula += '[' + getTranslationByKey('SPELL_DAMAGE_MODIFIER').toLowerCase() + ']';
+ }
+ }
+};
+
+var updateCriticalDamage = function updateCriticalDamage(data, repString, prefix, damageData) {
+ var damageResult = '' + data[repString + '_' + prefix + '_damage_dice'] + data[repString + '_' + prefix + '_damage_die'];
+ var damageDieFloat = parseFloat(data[repString + '_' + prefix + '_damage_die'].replace('d', ''));
+ if ((0, _utilities.exists)(data[repString + '_attack_toggle'])) {
+ if (data.critical_damage_houserule === 'NORMAL') {
+ damageData.critFormula = (0, _utilities.addTo)(damageData.critFormula, damageResult);
+ if ((0, _utilities.exists)(data.show_dice_modifiers) && (0, _utilities.exists)(data[repString + '_' + prefix + '_damage_dice_modifier'])) {
+ damageData.critFormula += data[repString + '_' + prefix + '_damage_dice_modifier'] + '[' + getTranslationByKey('CRITICAL_DAMAGE').toLowerCase() + ']';
+ }
+ } else if (data.critical_damage_houserule === 'CRITICAL_DAMAGE_IS_MAXIMIZED') {
+ var damageDiceResult = damageDieFloat > 1 ? data[repString + '_' + prefix + '_damage_dice'] + '*' : '';
+ damageData.critFormula = (0, _utilities.addTo)(damageData.critFormula, '' + damageDiceResult + damageDieFloat + '[' + getTranslationByKey('CRITICAL_DAMAGE').toLowerCase() + ']');
+ }
+
+ if (data[repString + '_attack_type'] === 'MELEE_WEAPON_ATTACK') {
+ if ((0, _utilities.exists)(data.savage_attacks)) {
+ damageData.critFormula = (0, _utilities.addTo)(damageData.critFormula, '1' + data[repString + '_' + prefix + '_damage_die'] + '[' + getTranslationByKey('HALF_ORC_SAVAGE_ATTACKS').toLowerCase() + ']');
+ }
+ if ((0, _utilities.exists)(data.class_feature_barbarian_brutal_critical_toggle)) {
+ var damageDie = void 0;
+ if ((0, _utilities.exists)(data.barbarian_level)) {
+ if (parseInt(data.barbarian_level, 10) >= 17) {
+ damageDie = 3;
+ } else if (parseInt(data.barbarian_level, 10) >= 13) {
+ damageDie = 2;
+ }
+ } else {
+ damageDie = 1;
+ }
+ damageData.critFormula = (0, _utilities.addTo)(damageData.critFormula, '' + damageDie + data[repString + '_' + prefix + '_damage_die'] + '[' + getTranslationByKey('CLASS_FEATURE_BARBARIAN_BRUTAL_CRITICAL').toLowerCase() + ']');
+ }
+ }
+ if ((0, _utilities.exists)(data[repString + '_' + prefix + '_damage_crit'])) {
+ damageData.critFormula = (0, _utilities.addTo)(damageData.critFormula, data[repString + '_' + prefix + '_damage_crit']);
+ }
+
+ if (prefix && !prefix.includes('second')) {
+ updateCriticalDamageFromModifiers(data, repString, prefix, damageData);
+ }
+ }
+};
+
+var addDamageDiceAndDie = function addDamageDiceAndDie(data, repString, prefix, damageData) {
+ if ((0, _utilities.exists)(data[repString + '_' + prefix + '_damage_dice']) && (0, _utilities.exists)(data[repString + '_' + prefix + '_damage_die'])) {
+ var damageResult = '' + data[repString + '_' + prefix + '_damage_dice'] + data[repString + '_' + prefix + '_damage_die'];
+ var damageDieFloat = parseFloat(data[repString + '_' + prefix + '_damage_die'].replace('d', ''));
+ updateCriticalDamage(data, repString, prefix, damageData);
+
+ damageData.string += damageResult;
+ if (!isNaN(data[repString + '_' + prefix + '_damage_dice'])) {
+ var averageDamagePerDie = damageDieFloat / 2 + 0.5;
+ damageData.average += parseFloat(data[repString + '_' + prefix + '_damage_dice']) * averageDamagePerDie;
+ }
+ damageData.formula = (0, _utilities.addTo)(damageData.formula, damageResult);
+ if ((0, _utilities.exists)(data.show_dice_modifiers) && (0, _utilities.exists)(data[repString + '_' + prefix + '_damage_dice_modifier'])) {
+ damageData.string += data[repString + '_' + prefix + '_damage_dice_modifier'];
+ damageData.formula += data[repString + '_' + prefix + '_damage_dice_modifier'];
+ }
+ damageData.formula += '[' + getTranslationByKey('DAMAGE').toLowerCase() + ']';
+ }
+};
+
+var setDamageAbilityBasedOnAttackType = exports.setDamageAbilityBasedOnAttackType = function setDamageAbilityBasedOnAttackType(data, repString, prefix) {
+ var section = (0, _utilities.getRepeatingSectionOfRepeatingString)(repString);
+ if (data[repString + '_attack_type'] === 'MELEE_WEAPON_ATTACK') {
+ data[repString + '_' + prefix + '_damage_ability'] = 'STR';
+ } else if (data[repString + '_attack_type'] === 'RANGED_WEAPON_ATTACK') {
+ data[repString + '_' + prefix + '_damage_ability'] = 'DEX';
+ } else if (section && section.includes('spell') && (0, _utilities.exists)(data.spell_ability)) {
+ data[repString + '_' + prefix + '_damage_ability'] = (0, _abilities.getFormattedAbility)(data.spell_ability);
+ }
+};
+
+var attackToggled = function attackToggled(data, repString, repeatingInfo, prefix) {
+ if (repeatingInfo && (repeatingInfo.field === 'attack_toggle' || repeatingInfo.field === 'name') && data[repString + '_attack_toggle']) {
+ setDamageAbilityBasedOnAttackType(data, repString, prefix);
+ }
+};
+
+var addDamageAbility = function addDamageAbility(data, repString, repeatingInfo, prefix, damageData) {
+ if (prefix && !prefix.includes('second') && (0, _utilities.exists)(data[repString + '_attack_type']) && repeatingInfo && repeatingInfo.field === 'attack_type') {
+ setDamageAbilityBasedOnAttackType(data, repString, prefix);
+ }
+ if ((0, _utilities.exists)(data[repString + '_' + prefix + '_damage_ability'])) {
+ if (data[repString + '_' + prefix + '_damage_ability'] === 'SPELL_ABILITY') {
+ data[repString + '_' + prefix + '_damage_ability'] = (0, _abilities.getFormattedAbility)(data.spell_ability);
+ }
+ var damageAbilityValue = (0, _abilities.getAbilityMod)(data, data[repString + '_' + prefix + '_damage_ability']);
+ if ((0, _utilities.exists)(damageAbilityValue)) {
+ damageData.addition += damageAbilityValue;
+ damageData.formula = (0, _utilities.addTo)(damageData.formula, damageAbilityValue + '[' + data[repString + '_' + prefix + '_damage_ability'].toLowerCase() + ']');
+ }
+ }
+};
+
+var addDamageBonus = function addDamageBonus(data, repString, prefix, damageData) {
+ if ((0, _utilities.exists)(data[repString + '_' + prefix + '_damage_bonus'])) {
+ if (isNaN(data[repString + '_' + prefix + '_damage_bonus'])) {
+ damageData.damageExtra = data[repString + '_' + prefix + '_damage_bonus'];
+ } else {
+ damageData.addition += parseFloat(data[repString + '_' + prefix + '_damage_bonus']);
+ }
+ damageData.formula = (0, _utilities.addTo)(damageData.formula, data[repString + '_' + prefix + '_damage_bonus'] + '[' + getTranslationByKey('BONUS').toLowerCase() + ']');
+ }
+};
+
+var addModifier = function addModifier(data, damageData, name, translation) {
+ if ((0, _utilities.exists)(data[name + '_modifier'])) {
+ if (!isNaN(data[name + '_modifier'])) {
+ damageData.addition += parseFloat(data[name + '_modifier']);
+ } else {
+ damageData.string = (0, _utilities.addTo)(damageData.string, data[name + '_modifier']);
+ }
+ damageData.formula = (0, _utilities.addTo)(damageData.formula, data[name + '_modifier']);
+ }
+ if ((0, _utilities.exists)(data[name + '_modifier_dice'])) {
+ damageData.formula = (0, _utilities.addTo)(damageData.formula, '' + data[name + '_modifier_dice']);
+ }
+ if ((0, _utilities.exists)(data[name + '_modifier']) || (0, _utilities.exists)(data[name + '_modifier_dice'])) {
+ damageData.formula += '[' + getTranslationByKey(translation).toLowerCase() + ']';
+ }
+};
+
+var addModifiers = function addModifiers(data, repString, prefix, damageData) {
+ if (prefix && !prefix.includes('second')) {
+ addModifier(data, damageData, 'damage', 'DAMAGE_MODIFIER');
+ if (data[repString + '_attack_type'] && data[repString + '_attack_type'].includes('WEAPON')) {
+ addModifier(data, damageData, 'weapon_damage', 'WEAPON_DAMAGE_MODIFIER');
+ if (data[repString + '_attack_type'] === 'MELEE_WEAPON_ATTACK') {
+ addModifier(data, damageData, 'melee_weapon_damage', 'MELEE_WEAPON_DAMAGE_MODIFIER');
+ } else if (data[repString + '_attack_type'] === 'RANGED_WEAPON_ATTACK') {
+ addModifier(data, damageData, 'ranged_weapon_damage', 'RANGED_WEAPON_DAMAGE_MODIFIER');
+ }
+ } else if (data[repString + '_attack_type'] && data[repString + '_attack_type'].includes('SPELL')) {
+ addModifier(data, damageData, 'spell_damage', 'SPELL_DAMAGE_MODIFIER');
+ }
+ }
+};
+
+var updateDamage = exports.updateDamage = function updateDamage(data, repString, repeatingInfo, prefix) {
+ if ((0, _utilities.exists)(data[repString + '_' + prefix + '_damage_dice']) || (0, _utilities.exists)(data[repString + '_' + prefix + '_damage_die']) || (0, _utilities.exists)(data[repString + '_' + prefix + '_damage_ability']) || (0, _utilities.exists)(data[repString + '_' + prefix + '_damage_bonus'])) {
+ var damageData = {};
+ damageData.average = 0;
+ damageData.addition = 0;
+ damageData.formula = '';
+ damageData.critFormula = '';
+ damageData.string = '%%averageDamage%% (';
+
+ attackToggled(data, repString, repeatingInfo, prefix);
+ addDamageDiceAndDie(data, repString, prefix, damageData);
+ addDamageAbility(data, repString, repeatingInfo, prefix, damageData);
+ addDamageBonus(data, repString, prefix, damageData);
+ addModifiers(data, repString, prefix, damageData);
+
+ if ((0, _utilities.exists)(damageData.addition)) {
+ damageData.average += damageData.addition;
+ damageData.string = (0, _utilities.addTo)(damageData.string, damageData.addition);
+ }
+ if ((0, _utilities.exists)(damageData.damageExtra)) {
+ var damageRegex = /^(\d+)d(\d+)/;
+ var damageResult = damageRegex.exec(damageData.damageExtra);
+ if (damageResult && damageResult[1] && damageResult[2]) {
+ damageData.average += parseFloat(damageResult[1]) * (parseFloat(damageResult[2]) / 2 + 0.5);
+ damageData.critFormula = (0, _utilities.addTo)(damageData.critFormula, damageData.damageExtra);
+ }
+
+ damageData.string = (0, _utilities.addTo)(damageData.string, damageData.damageExtra);
+ }
+ damageData.string += ')';
+ if (damageData.average) {
+ damageData.string = damageData.string.replace('%%averageDamage%%', Math.floor(damageData.average).toString());
+ data[repString + '_' + prefix + '_damage_average'] = Math.floor(damageData.average);
+ } else {
+ damageData.string = damageData.string.replace('%%averageDamage%%', '');
+ data[repString + '_' + prefix + '_damage_average'] = '';
+ }
+
+ if ((0, _utilities.exists)(data[repString + '_' + prefix + '_damage_type'])) {
+ data[repString + '_' + prefix + '_damage_type'] = (0, _utilities.lowercaseDamageTypes)(data[repString + '_' + prefix + '_damage_type']);
+ damageData.string += ' ' + data[repString + '_' + prefix + '_damage_type'] + ' ' + getTranslationByKey('DAMAGE').toLowerCase();
+ }
+
+ if ((0, _utilities.exists)(data[repString + '_' + prefix + '_higher_level_dice']) && (0, _utilities.exists)(data[repString + '_' + prefix + '_damage_die'])) {
+ var level = (0, _utilities.getLevelOfRepeatingString)(repString);
+ var higherLevelDamage = '([[(@{higher_level_query_' + level + '} - ' + level + ') * ' + data[repString + '_' + prefix + '_higher_level_dice'] + ']])' + data[repString + '_' + prefix + '_damage_die'] + '[' + getTranslationByKey('HIGHER_LEVEL').toLowerCase() + ']';
+ damageData.formula = (0, _utilities.addTo)(damageData.formula, higherLevelDamage);
+ damageData.critFormula = (0, _utilities.addTo)(damageData.critFormula, higherLevelDamage);
+ }
+
+ data[repString + '_' + prefix + '_damage_formula'] = '';
+ if (prefix && !prefix.includes('second') && prefix !== 'other') {
+ data[repString + '_' + prefix + '_damage_formula'] += '{{has_' + prefix + '_damage=1}}';
+ }
+ if ((0, _utilities.exists)(damageData.critFormula) && prefix && !prefix.includes('saving_throw')) {
+ damageData.critFormula = '{{' + prefix + '_damage_crit=[[' + damageData.critFormula + ']]}}';
+ data[repString + '_' + prefix + '_damage_formula'] += ' ' + damageData.critFormula;
+ }
+ if ((0, _utilities.exists)(damageData.formula)) {
+ data[repString + '_' + prefix + '_damage_formula'] += ' {{' + prefix + '_damage=[[' + damageData.formula + ']]}}';
+ }
+ if ((0, _utilities.exists)(data[repString + '_' + prefix + '_damage_type'])) {
+ data[repString + '_' + prefix + '_damage_formula'] += ' {{' + prefix + '_damage_type=' + data[repString + '_' + prefix + '_damage_type'] + '}}';
+ }
+ if (prefix && prefix.includes('attack') && (0, _utilities.exists)(data.automatically_roll_damage_for_attacks) || prefix && prefix.includes('saving_throw') && (0, _utilities.exists)(data.automatically_roll_damage_for_saving_throws) || prefix && prefix.includes('other')) {
+ (0, _utilities.addToRollFormula)(data, repString, data[repString + '_' + prefix + '_damage_formula']);
+ }
+ if (prefix && !prefix.includes('second') && prefix !== 'other') {
+ if (prefix === 'attack') {
+ (0, _utilities.addToRollFormula)(data, repString, '{{has_' + prefix + '_damage=1}} {{' + prefix + '_damage_macro=[' + getTranslationByKey('HIT') + ':](~' + (0, _utilities.getRepeatingItemOfRepeatingString)(repString) + '_' + prefix + '_damage)}}');
+ (0, _utilities.addToRollFormula)(data, repString, '{{' + prefix + '_damage_crit_macro=[' + getTranslationByKey('CRIT') + ':](~' + (0, _utilities.getRepeatingItemOfRepeatingString)(repString) + '_' + prefix + '_damage_crit)}}');
+ }
+ if (prefix === 'saving_throw') {
+ (0, _utilities.addToRollFormula)(data, repString, '{{has_' + prefix + '_damage=1}} {{' + prefix + '_damage_macro=[' + getTranslationByKey('SAVING_THROW_FAILURE') + ':](~' + (0, _utilities.getRepeatingItemOfRepeatingString)(repString) + '_' + prefix + '_damage)}}');
+ }
+ }
+ return damageData.string;
+ }
+ return '';
+};
+
+var updateDamages = exports.updateDamages = function updateDamages(data, repString, repeatingInfo, prefix) {
+ data[repString + '_' + prefix + '_damage_string'] = '';
+ data[repString + '_' + prefix + '_damage_string'] += updateDamage(data, repString, repeatingInfo, prefix);
+ if ((0, _utilities.exists)(data[repString + '_' + prefix + '_second_damage_condition'])) {
+ data[repString + '_' + prefix + '_damage_string'] += ' ' + getTranslationByKey('PLUS') + ' ';
+ data[repString + '_' + prefix + '_damage_string'] += updateDamage(data, repString, repeatingInfo, prefix + '_second');
+ }
+
+ if (data[repString + '_' + prefix + '_damage_string'] !== '') {
+ data[repString + '_' + prefix + '_damage_string'] += '.';
+ }
+};
+
+var parseDamageFromSRD = exports.parseDamageFromSRD = function parseDamageFromSRD(data, repString) {
+ var prefix = (0, _utilities.getDamagePrefix)(data, repString);
+ if ((0, _utilities.exists)(data.damage_from_srd)) {
+ if (prefix === 'other') {
+ data[repString + '_other_damage_toggle'] = 1;
+ }
+ if (isNaN(data.damage_from_srd)) {
+ (0, _utilities.parseDiceAndDieFromSRD)(data, repString, prefix + '_damage', 'damage_from_srd');
+ } else {
+ data[repString + '_' + prefix + '_damage_bonus'] = data.damage_from_srd;
+ }
+ }
+ if ((0, _utilities.exists)(data.secondary_damage_from_srd)) {
+ if (isNaN(data.secondary_damage_from_srd)) {
+ (0, _utilities.parseDiceAndDieFromSRD)(data, repString, prefix + '_second_damage', 'secondary_damage_from_srd');
+ } else {
+ data[repString + '_' + prefix + '_damage_bonus'] = data.secondary_damage_from_srd;
+ }
+ }
+ if ((0, _utilities.exists)(data.damage_type_from_srd)) {
+ data[repString + '_' + prefix + '_damage_type'] = (0, _utilities.lowercaseDamageTypes)(data.damage_type_from_srd);
+ }
+};
+
+var getPreciseCorrectAbilityBasedOnBonus = function getPreciseCorrectAbilityBasedOnBonus(data, repString, fieldName, bonus) {
+ var meleeMods = [(0, _abilities.getAbilityMod)(data, 'strength'), (0, _abilities.getAbilityMod)(data, 'dexterity')];
+ var spellMods = [(0, _abilities.getAbilityMod)(data, 'intelligence'), (0, _abilities.getAbilityMod)(data, 'wisdom'), (0, _abilities.getAbilityMod)(data, 'charisma')];
+ var closest = void 0;
+ if (bonus) {
+ if (data[repString + '_attack_type'] && data[repString + '_attack_type'].includes('SPELL')) {
+ closest = (0, _utilities.findClosest)(spellMods, bonus);
+ bonus -= closest;
+ if (closest === spellMods[0]) {
+ data[repString + '_' + fieldName] = 'INT';
+ } else if (closest === spellMods[1]) {
+ data[repString + '_' + fieldName] = 'WIS';
+ } else if (closest === spellMods[2]) {
+ data[repString + '_' + fieldName] = 'CHA';
+ }
+ } else if (data[repString + '_attack_type'] === 'RANGED_WEAPON_ATTACK') {
+ data[repString + '_' + fieldName] = 'DEX';
+ bonus -= (0, _abilities.getAbilityMod)(data, 'dexterity');
+ } else {
+ closest = (0, _utilities.findClosest)(meleeMods, bonus);
+ bonus -= closest;
+ if (closest === meleeMods[0]) {
+ data[repString + '_' + fieldName] = 'STR';
+ } else if (closest === meleeMods[1]) {
+ data[repString + '_' + fieldName] = 'DEX';
+ }
+ }
+ }
+ return bonus;
+};
+
+var parseDamage = exports.parseDamage = function parseDamage(data, repString, prefix) {
+ if ((0, _utilities.exists)(data[repString + '_content'])) {
+ var regex = void 0;
+ if (prefix === 'attack_damage') {
+ regex = attackDamageRegex;
+ } else if (prefix === 'attack_second_damage') {
+ regex = attackDamagePlusRegex;
+ } else if (prefix === 'attack_versatile_damage') {
+ regex = attackAltDamageRegex;
+ } else if (prefix === 'saving_throw_damage') {
+ regex = savingThrowDamageRegex;
+ }
+
+ var damageResult = data[repString + '_content'].match(regex);
+ if (damageResult && damageResult.length > 0) {
+ if (prefix === 'attack_second_damage') {
+ data[repString + '_' + prefix + '_condition'] = 'PLUS';
+ }
+
+ if ((0, _utilities.exists)(damageResult[2]) && (0, _utilities.exists)(damageResult[3])) {
+ data[repString + '_' + prefix + '_dice'] = parseInt(damageResult[2], 10);
+ data[repString + '_' + prefix + '_die'] = damageResult[3];
+
+ if ((0, _utilities.exists)(damageResult[4])) {
+ data[repString + '_' + prefix + '_bonus'] = getPreciseCorrectAbilityBasedOnBonus(data, repString, prefix + '_ability', parseInt(damageResult[4].replace(' ', ''), 10));
+ if (!data[repString + '_' + prefix + '_bonus']) {
+ data[repString + '_' + prefix + '_bonus'] = '';
+ }
+ if ((0, _utilities.exists)(damageResult[5]) && (0, _utilities.exists)(damageResult[6])) {
+ if (data[repString + '_' + prefix + '_bonus'] !== '') {
+ data[repString + '_' + prefix + '_bonus'] += ' + ';
+ }
+ data[repString + '_' + prefix + '_bonus'] += '' + damageResult[5] + damageResult[6];
+ }
+ } else {
+ data[repString + '_' + prefix + '_ability'] = '0';
+ }
+ } else if ((0, _utilities.exists)(damageResult[1])) {
+ data[repString + '_' + prefix + '_ability'] = '0';
+ data[repString + '_' + prefix + '_bonus'] = parseInt(damageResult[1], 10);
+ }
+ if ((0, _utilities.exists)(damageResult[7])) {
+ data[repString + '_' + prefix + '_type'] = damageResult[7];
+ }
+
+ if (prefix && prefix.includes('attack') && (0, _utilities.exists)(data[repString + '_content'])) {
+ data[repString + '_content'] = data[repString + '_content'].replace(regex, '');
+ }
+ if (prefix === 'attack_versatile_damage') {
+ if ((0, _utilities.exists)(data[repString + '_content'])) {
+ data[repString + '_content'] = data[repString + '_content'].replace('to make a melee attack', '');
+ }
+ }
+ }
+ }
+};
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupNPC = exports.parseMonsterFromSRDWithServer = exports.parseMonsterFromSRD = exports.monsterDroppedOnTabletop = exports.parseHP = exports.parseSRDContentSection = exports.cleanContent = undefined;
+
+var _utilities = __webpack_require__(0);
+
+var _constants = __webpack_require__(2);
+
+var _abilityChecks = __webpack_require__(6);
+
+var _abilities = __webpack_require__(3);
+
+var _actions = __webpack_require__(4);
+
+var _hitDice = __webpack_require__(11);
+
+var _resistances = __webpack_require__(22);
+
+var _processing = __webpack_require__(7);
+
+var _proficiencyBonus = __webpack_require__(19);
+
+var _server = __webpack_require__(1);
+
+var _senses = __webpack_require__(23);
+
+var _speeds = __webpack_require__(24);
+
+var _spells = __webpack_require__(5);
+
+var sizeToHdSize = {
+ GARGANTUAN: 20,
+ HUGE: 12,
+ LARGE: 10,
+ MEDIUM: 8,
+ SMALL: 6,
+ TINY: 4
+}; /* global on:false, generateRowID:false, setDefaultToken:false */
+
+var xpPerChallenge = {
+ 0: 0,
+ 1: 200,
+ '1/2': 100,
+ '1/4': 50,
+ '1/8': 25,
+ 2: 450,
+ 3: 700,
+ 4: 1100,
+ 5: 1800,
+ 6: 2300,
+ 7: 2900,
+ 8: 3900,
+ 9: 5000,
+ 10: 5900,
+ 11: 7200,
+ 12: 8400,
+ 13: 10000,
+ 14: 11500,
+ 15: 13000,
+ 16: 15000,
+ 17: 18000,
+ 18: 20000,
+ 19: 22000,
+ 20: 25000,
+ 21: 33000,
+ 22: 41000,
+ 23: 50000,
+ 24: 62000,
+ 25: 75000,
+ 26: 90000,
+ 27: 105000,
+ 28: 120000,
+ 29: 135000,
+ 30: 155000
+};
+
+var updateSize = function updateSize() {
+ (0, _server.getSetItems)('npc.updateSize', {
+ collectionArray: ['size'],
+ process: function process(data) {
+ if ((0, _utilities.exists)(data.size)) {
+ data.size = data.size.toUpperCase();
+ } else {
+ data.size = 'MEDIUM';
+ }
+ data.hit_die = 'd' + sizeToHdSize[data.size];
+ }
+ });
+};
+
+var switchTo = function switchTo() {
+ (0, _server.getSetItems)('npc.switchTo', {
+ collectionArray: ['is_npc', 'size'],
+ process: function process(data) {
+ if ((0, _utilities.exists)(data.is_npc)) {
+ data.hit_dice_output_option = '/w GM';
+ if ((0, _utilities.isUndefinedOrEmpty)(data.size)) {
+ data.size = 'MEDIUM';
+ }
+ } else {
+ data.hit_dice_output_option = '';
+ }
+ }
+ });
+};
+
+var updateXP = function updateXP(data) {
+ data.xp = xpPerChallenge[data.challenge];
+ data.xp_readable = (0, _utilities.numberWithCommas)(data.xp);
+};
+
+var updateChallenge = function updateChallenge(callback) {
+ (0, _server.getSetItems)('npc.updateChallenge', {
+ collectionArray: ['challenge', 'xp'],
+ process: function process(data) {
+ updateXP(data);
+
+ var challengeInt = Math.max(1, parseInt(data.challenge || 0, 10));
+ data.level = challengeInt;
+ (0, _proficiencyBonus.setPB)(challengeInt, callback);
+ }
+ });
+};
+
+var updateHP = function updateHP(data) {
+ var hdNum = parseFloat(data.hit_dice);
+ var hdSize = parseInt(data.hit_die.replace('d', ''), 10);
+ var hdAverage = hdSize / 2 + 0.5;
+ var conMod = (0, _abilities.getAbilityMod)(data, 'constitution');
+
+ data.HP = Math.floor(hdNum * hdAverage);
+ data.hp_formula = hdNum + 'd' + hdSize;
+
+ if (conMod !== 0) {
+ var bonusHP = hdNum * conMod;
+ data.HP += bonusHP;
+ data.hp_formula += (0, _utilities.addArithmeticOperator)(bonusHP);
+ }
+
+ if ((0, _utilities.exists)(data.hp_extra)) {
+ var regex = /(?:(\+|-)\s?)?(\d+)(?:d(\d+))?/gi;
+ var splitFormula = void 0;
+
+ while ((splitFormula = regex.exec(data.hp_extra)) !== null) {
+ if (!splitFormula || !splitFormula[2]) {
+ console.error('Character doesn’t have valid hp formula');
+ } else {
+ var amount = 0;
+
+ if (!splitFormula[3]) {
+ amount = parseInt(splitFormula[2], 10);
+ } else {
+ var extraHdNum = parseInt(splitFormula[2], 10);
+ var extraHdSize = parseInt(splitFormula[3], 10);
+ var extraHdAverage = extraHdSize / 2 + 0.5;
+ amount = Math.floor(extraHdNum * extraHdAverage);
+ }
+
+ if (!splitFormula[1] || splitFormula[1] === '+') {
+ data.HP += amount;
+ data.hp_formula += ' + ' + amount;
+ } else if (splitFormula[1] === '-') {
+ data.HP -= amount;
+ data.hp_formula += ' - ' + amount;
+ }
+ }
+ data.hp_extra.toString().replace(splitFormula[0], '');
+ }
+ }
+
+ if (data.HP) {
+ data.HP_max = data.HP;
+ }
+};
+
+var updateHitPoints = function updateHitPoints() {
+ (0, _server.getSetItems)('npc.updateHitPoints', {
+ collectionArray: ['HP', 'HP_max', 'hp_formula', 'hit_dice', 'hit_die', 'hp_extra', 'constitution'],
+ process: function process(data) {
+ if ((0, _utilities.exists)(data.hit_dice)) {
+ updateHP(data);
+ }
+ }
+ });
+};
+
+var updateLanguages = function updateLanguages() {
+ (0, _server.getSetItems)('npc.updateLanguages', {
+ collectionArray: ['languages', 'languages_chat_var'],
+ process: function process(data) {
+ data.languages_chat_var = '';
+
+ if (data.languages) {
+ data.languages_chat_var = '{{Languages=@{languages}}}';
+ }
+ }
+ });
+};
+
+var updateCasterLevel = function updateCasterLevel() {
+ (0, _server.getSetItems)('npc.updateCasterLevel', {
+ collectionArray: ['spellcaster_level', 'caster_level'],
+ process: function process(data) {
+ data.caster_level = parseInt(data.spellcaster_level || 0, 10);
+ }
+ });
+};
+
+var turnOnSlotsIfItsNotSet = function turnOnSlotsIfItsNotSet() {
+ (0, _server.getSetItems)('npc.turnOnSlotsIfItsNotSet', {
+ collectionArray: ['spellcasting', 'spell_slots_toggle'],
+ process: function process(data) {
+ if ((0, _utilities.exists)(data.spellcasting)) {
+ data.spell_slots_toggle = 1;
+ }
+ }
+ });
+};
+
+var cleanName = function cleanName(name) {
+ return name.replace(/“/g, '"').replace(/”/g, '"').replace(/'/g, '’');
+};
+
+var cleanContent = exports.cleanContent = function cleanContent(content) {
+ return content.trim().replace(/.*(\\n)/, '').trim().replace(/.*(\\n)/, '').trim().replace(/.*(\\n)/, '').replace('. ', '. ').replace(/\*\*\n\t/g, '**').replace(/\*\*\n/g, '**').replace(/:\*\*/g, '**:').replace(/\s\s\n\n/g, '\n\n').replace(/“/g, '"').replace(/”/g, '"').replace(/'/g, '’').replace(/ Legendary Actions\n/g, '\n Legendary Actions\n').replace(/ Reactions\n/g, '\n Reactions\n').replace(/^(?:\s?Actions\n)/g, 'content \n Actions\n').replace(/^(?:\s?Traits\n)/g, 'content \n Traits\n').replace(/ Traits\n/g, '\n Traits\n').replace(/ Regional Effects\n/g, '\n Regional Effects\n').replace(/ Lair Actions\n/g, '\n Lair Actions\n').trim().trim().replace('reach ft.', '').trim().replace(/\sft.\//, '/') // bandit and salamander
+ .trim();
+};
+
+var parseSizeTypeAlignment = function parseSizeTypeAlignment(data) {
+ if (data.size_from_srd) {
+ data.size = data.size_from_srd.toUpperCase();
+ }
+ if (data.type_from_srd) {
+ data.type = cleanName(data.type_from_srd.toLowerCase());
+ }
+ if (data.alignment_from_srd) {
+ data.alignment = data.alignment_from_srd.toLowerCase();
+ }
+};
+
+var setSpellAbility = function setSpellAbility(data) {
+ var abilityScores = [parseInt(data.intelligence || 0, 10), parseInt(data.wisdom || 0, 10), parseInt(data.charisma || 0, 10)];
+ var highestAbilityScore = Math.max.apply(Math, abilityScores);
+ var highestAbilityName = 'INTELLIGENCE';
+
+ if (highestAbilityScore === abilityScores[1]) {
+ highestAbilityName = 'WISDOM';
+ } else if (highestAbilityScore === abilityScores[2]) {
+ highestAbilityName = 'CHARISMA';
+ }
+
+ data.spell_ability = highestAbilityName;
+};
+
+var splitContentByTitles = function splitContentByTitles(data, title) {
+ if ((0, _utilities.exists)(data.content_from_srd) && data.content_from_srd.includes(title)) {
+ var contentSplit = data.content_from_srd.split('\n ' + title + '\n');
+ data.content_from_srd = contentSplit[0];
+ return contentSplit[1];
+ }
+ return '';
+};
+
+var parseSRDContentSection = exports.parseSRDContentSection = function parseSRDContentSection(data, title, name) {
+ var section = splitContentByTitles(data, title, name);
+
+ if ((0, _utilities.exists)(section)) {
+ if (name === 'regionaleffect' || name === 'lairaction') {
+ var typeList = section.split(/•/);
+ typeList.slice(1, typeList.length).forEach(function (type) {
+ var repString = 'repeating_' + name + '_' + generateRowID();
+ data[repString + '_content'] = type.replace(/\n.*/g, '').trim();
+ data[repString + '_content_toggle'] = 1;
+ });
+ } else {
+ if (name === 'legendaryaction') {
+ var legendaryActionsMatch = section.match(/Can take (\d+) Legendary Actions/i);
+ if (legendaryActionsMatch && legendaryActionsMatch[1]) {
+ data.legendary_action_amount = parseInt(legendaryActionsMatch[1], 10);
+ data.legendary_action_amount_max = parseInt(legendaryActionsMatch[1], 10);
+ }
+ }
+ var re = /@(.*)@(?::|\.)\s([^@]+)/gi;
+ var match = void 0;
+ while ((match = re.exec(section.replace(/\*\*/g, '@'))) !== null) {
+ if (match && match[1] && match[2]) {
+ var repString = 'repeating_' + name + '_' + generateRowID();
+ data[repString + '_name'] = match[1];
+ data[repString + '_content'] = match[2].trim();
+ data[repString + '_content_toggle'] = 1;
+ data[repString + '_toggle_details'] = 0;
+ } else {
+ console.error('Character doesn\'t have a valid ' + name + ' format');
+ }
+ }
+ }
+ }
+};
+
+var parseHP = exports.parseHP = function parseHP(data) {
+ if (data.hp_from_srd) {
+ data.hp_from_srd = data.hp_from_srd.replace(/—/g, '-').replace(/–/g, '-').replace(/\u2012/g, '-');
+ var match = data.hp_from_srd.match(/\((\d+)d(\d+)(?:\s?(\+|-)\s?(\d+))?\)/i);
+ if (!match || !match[1] || !match[2]) {
+ console.error('Character doesn’t have valid HP/HD format');
+ } else {
+ var hdNum = parseInt(match[1], 10);
+ var conMod = (0, _abilities.getAbilityMod)(data, 'constitution');
+
+ data.hit_dice = hdNum;
+ data.hit_die = 'd' + parseInt(match[2], 10);
+
+ var hpExpectedBonus = hdNum * conMod;
+ var hpBonusSign = match[3];
+ var hpBonus = parseInt('' + hpBonusSign + match[4], 10);
+ if (hpBonus !== hpExpectedBonus) {
+ if (hpBonusSign === '-') {
+ data.hp_extra = hpBonus + hpExpectedBonus;
+ } else {
+ data.hp_extra = hpBonus - hpExpectedBonus;
+ }
+ }
+ }
+ updateHP(data);
+ }
+};
+
+var parseAC = function parseAC(data) {
+ if (data.ac_from_srd) {
+ var match = data.ac_from_srd.match(/(\d+)\s?(.*)/);
+ if (match && match[1]) {
+ data.AC = parseInt(match[1], 10);
+ if (match[2]) {
+ data.ac_note = match[2].replace(/\(|\)/g, '').toLowerCase();
+ }
+ }
+ }
+};
+
+var parseSpeed = function parseSpeed(data) {
+ if ((0, _utilities.exists)(data.speed_from_srd)) {
+ data.speed_from_srd = data.speed_from_srd.toLowerCase();
+ var match = data.speed_from_srd.match(/^\s*(\d+)\s?(ft\.?|m\.?)/);
+ if (match && match[1]) {
+ data.speed = match[1] + ' ' + match[2];
+ }
+
+ var regex = /(burrow|climb|fly|swim)\s+(\d+)\s?(ft\.?|m\.?)/g;
+ var speedValues = void 0;
+ while ((speedValues = regex.exec(data.speed_from_srd)) !== null) {
+ data['speed_' + speedValues[1]] = speedValues[2] + ' ' + speedValues[3];
+ }
+ if (data.speed_from_srd.includes('hover')) {
+ data.speed_fly_hover = 1;
+ }
+ }
+};
+
+var parseSenses = function parseSenses(data) {
+ if (data.senses_from_srd) {
+ data.senses_from_srd = data.senses_from_srd.toLowerCase();
+ var regex = /(blindsight|darkvision|tremorsense|truesight)\s+(\d+)\s?(ft\.?|m\.?)/g;
+ var senseValues = void 0;
+ while ((senseValues = regex.exec(data.senses_from_srd)) !== null) {
+ data[senseValues[1]] = senseValues[2] + ' ' + senseValues[3];
+ }
+ if (data.senses_from_srd && data.senses_from_srd.includes('blind beyond')) {
+ data.blindsight_blind_beyond = 1;
+ }
+ }
+};
+
+var parseSense = function parseSense(tokenProps, sense, senseRange) {
+ if (sense === 'darkvision') {
+ tokenProps.light_dimradius = (0, _utilities.round)(-5 * (senseRange / 60));
+ }
+ if (!tokenProps.light_radius || senseRange > tokenProps.light_radius) {
+ tokenProps.light_radius = (0, _utilities.round)(senseRange * 1.166666666666);
+ } else if (senseRange < tokenProps.light_radius) {
+ tokenProps.light_dimradius = senseRange;
+ }
+};
+
+var parseChallengeRating = function parseChallengeRating(data) {
+ if (data.challenge_rating_from_srd) {
+ data.challenge = data.challenge_rating_from_srd;
+ data.pb = (0, _utilities.calculatePB)(parseFloat(data.challenge_rating_from_srd));
+ updateXP(data);
+ (0, _utilities.formatPBProfDice)(data);
+ }
+};
+
+var parseSavingThrows = function parseSavingThrows(data) {
+ if (data.saving_throws_from_srd) {
+ var modifierRepString = 'repeating_modifier_' + generateRowID();
+ _constants.ABILITIES.forEach(function (ability) {
+ var shortAbility = (0, _abilities.getAbilityShortName)(ability, true);
+ if (data.saving_throws_from_srd.includes(shortAbility)) {
+ data[ability + '_saving_throw_proficient'] = 1;
+
+ var regex = new RegExp(shortAbility + '\\s?\\+(\\d+)', 'i');
+ var match = data.saving_throws_from_srd.match(regex);
+ if (match && match[1]) {
+ var abilityMod = (0, _abilities.getAbilityMod)(data, ability);
+ var savingThrowValue = parseInt(match[1], 10) - data.pb - abilityMod;
+
+ if (savingThrowValue !== 0) {
+ data[modifierRepString + '_saving_throw_toggle'] = 1;
+ data[modifierRepString + '_' + ability + '_saving_throw_modifier'] = savingThrowValue;
+ }
+ }
+ }
+ });
+ }
+};
+
+var parseSkills = function parseSkills(data, repStrings) {
+ var skillsObj = {};
+ var expertise = data.pb * 2;
+
+ if ((0, _utilities.exists)(data.skills_from_srd)) {
+ repStrings.forEach(function (repString) {
+ var skillName = data[repString + '_name'];
+ skillsObj[skillName] = {
+ ability: data[repString + '_ability'],
+ id: (0, _utilities.getIdOfRepeatingString)(repString)
+ };
+ });
+
+ var re = /(\w+)\s?((?:\+|-)\d+)/gi;
+ var match = void 0;
+ var modifierRepString = 'repeating_modifier_' + generateRowID();
+ while ((match = re.exec(data.skills_from_srd)) !== null) {
+ if (match && match[1] && match[2]) {
+ var skillName = match[1];
+ if (skillsObj[skillName] && skillsObj[skillName].id) {
+ var skillId = skillsObj[skillName].id;
+ var repStringNew = 'repeating_skill_' + skillId;
+ var abilityValue = (0, _abilities.getAbilityMod)(data, skillsObj[skillName].ability);
+ var skillBonus = parseInt(match[2], 10) - abilityValue;
+
+ if (skillBonus >= expertise) {
+ if ((0, _utilities.exists)(data.expertise_as_advantage)) {
+ if (data.dice_system === '2d10') {
+ data[repStringNew + '_skill_d20'] = '3d10kh2';
+ } else if (data.dice_system === '3d6') {
+ data[repStringNew + '_skill_d20'] = '4d6kh3';
+ } else {
+ data[repStringNew + '_skill_d20'] = '2d20kh1';
+ }
+ data[repStringNew + '_proficiency'] = 'proficient';
+ } else {
+ data[repStringNew + '_proficiency'] = 'expertise';
+ }
+ if (skillBonus > expertise) {
+ data[modifierRepString + '_name'] = 'Skill import modifiers';
+ data[modifierRepString + '_skill_' + Object.keys(_constants.SKILLS).indexOf(skillName.toUpperCase()) + '_modifier'] = skillBonus - expertise;
+ }
+ } else if (skillBonus >= data.pb) {
+ data[repStringNew + '_proficiency'] = 'proficient';
+ if (skillBonus > data.pb) {
+ data[modifierRepString + '_name'] = 'Skill import modifiers';
+ data[modifierRepString + '_skill_' + Object.keys(_constants.SKILLS).indexOf(skillName.toUpperCase()) + '_modifier'] = skillBonus - data.pb;
+ }
+ }
+ } else {
+ console.warn(skillName + ' does not exist in the list of skills');
+ }
+ }
+ }
+ }
+};
+
+var monsterDroppedOnTabletop = exports.monsterDroppedOnTabletop = function monsterDroppedOnTabletop() {
+ (0, _server.getSetItems)('monster.monsterDroppedOnTabletop', {
+ collectionArray: ['hp_max', 'token_size_from_srd'].concat(_constants.SENSES),
+ process: function process(data) {
+ var hp = parseInt(data.hp_max || 0, 10);
+
+ var tokenProps = {
+ bar1_max: hp,
+ bar1_value: hp,
+ bar2_link: 'AC',
+ bar3_link: 'speed',
+ height: 70,
+ light_angle: 360,
+ light_hassight: true,
+ light_losangle: 360,
+ showname: true,
+ showplayers_aura1: true,
+ showplayers_aura2: true,
+ width: 70
+ };
+ var squarelength = 70;
+ if (data.token_size_from_srd) {
+ var tokenWidth = parseFloat(data.token_size_from_srd) * squarelength;
+ var tokenHeight = parseFloat(data.token_size_from_srd) * squarelength;
+ if (data.token_size_from_srd.includes(',')) {
+ tokenWidth = parseFloat(data.token_size_from_srd.substring(0, data.token_size_from_srd.indexOf(',')));
+ tokenHeight = parseFloat(data.token_size_from_srd.substring(data.token_size_from_srd.indexOf(',') + 1, data.token_size_from_srd.length));
+ }
+ if (tokenWidth > 0) {
+ tokenProps.width = tokenWidth;
+ }
+ if (tokenHeight > 0) {
+ tokenProps.height = tokenHeight;
+ }
+ }
+
+ _constants.SENSES.forEach(function (sense) {
+ if ((0, _utilities.exists)(data.senses_from_srd)) {
+ var senseRegex = new RegExp(sense + '\\s(\\d+)', 'gi');
+ var senseResult = data.senses_from_srd.match(senseRegex);
+ if (senseResult) {
+ parseSense(tokenProps, sense, senseResult[1]);
+ }
+ } else if (data[sense]) {
+ parseSense(tokenProps, sense, parseFloat(data[sense]));
+ }
+ });
+ // console.info('tokenProps', tokenProps);
+ setDefaultToken(tokenProps);
+ }
+ });
+};
+
+var parseMonsterFromSRD = exports.parseMonsterFromSRD = function parseMonsterFromSRD(data, repStrings) {
+ data.is_npc = 1;
+ data.hit_dice_output_option = '/w GM';
+
+ if (data.name_from_srd) {
+ // TODO fix character name
+ data.character_name = cleanName(data.name_from_srd);
+ }
+ parseSizeTypeAlignment(data);
+ parseAC(data);
+ parseHP(data);
+ parseSpeed(data);
+
+ parseChallengeRating(data);
+
+ parseSavingThrows(data);
+ parseSkills(data, repStrings);
+ parseSenses(data);
+
+ if (data.content_from_srd) {
+ data.content_from_srd = cleanContent(data.content_from_srd);
+ parseSRDContentSection(data, 'Legendary Actions', 'legendaryaction');
+ parseSRDContentSection(data, 'Reactions', 'reaction');
+ parseSRDContentSection(data, 'Actions', 'action');
+ parseSRDContentSection(data, 'Traits', 'trait');
+ parseSRDContentSection(data, 'Regional Effects', 'regionaleffect');
+ parseSRDContentSection(data, 'Lair Actions', 'lairaction');
+ }
+
+ setSpellAbility(data);
+ data.edit_mode = '0';
+};
+
+var fromSrd = ['category_from_srd', 'name_from_srd', 'size_from_srd', 'type_from_srd', 'alignment_from_srd', 'ac_from_srd', 'hp_from_srd', 'speed_from_srd', 'saving_throws_from_srd', 'skills_from_srd', 'senses_from_srd', 'challenge_rating_from_srd', 'content_from_srd'];
+
+var parseMonsterFromSRDWithServer = exports.parseMonsterFromSRDWithServer = function parseMonsterFromSRDWithServer() {
+ (0, _processing.addToProcessing)('parseMonsterFromSRD', function () {
+ (0, _server.getSetItems)('monster.parseMonsterFromSRD', {
+ alwaysExecuteCallback: true,
+ collectionArray: fromSrd.concat(_constants.ABILITIES).concat(_constants.FIELDS.pb).concat(['dice_system', 'expertise_as_advantage']),
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['name', 'ability'],
+ name: 'repeating_skill'
+ }],
+ process: function process(data, repStrings) {
+ data.sheet_processing_complete = '';
+ parseMonsterFromSRD(data, repStrings);
+ fromSrd.forEach(function (field) {
+ if (data[field]) {
+ data[field] = '';
+ }
+ });
+ },
+ processCallback: function processCallback() {
+ (0, _abilities.updateAbilitiesWithServer)();
+ (0, _abilityChecks.updateSkill)();
+ (0, _abilityChecks.updateAbilityChecks)();
+ (0, _hitDice.updateHitDice)();
+ (0, _speeds.updateSpeeds)();
+ (0, _senses.updateSenses)();
+ (0, _actions.updateAllActions)();
+ (0, _resistances.updateDamageResistances)();
+ (0, _spells.findSpellcasting)();
+ },
+ serverCallCallback: function serverCallCallback() {
+ (0, _processing.clearProcessing)();
+ }
+ });
+ });
+};
+
+var setupNPC = exports.setupNPC = function setupNPC() {
+ on('change:size', function () {
+ updateSize();
+ });
+ on('change:is_npc', function () {
+ switchTo();
+ });
+ on('change:challenge', function () {
+ updateChallenge();
+ });
+ on('change:hit_dice change:hit_die change:hp_extra change:constitution change:ability_score_modifier', function () {
+ updateHitPoints();
+ });
+ on('change:languages', function () {
+ updateLanguages();
+ });
+ on('change:spellcaster_level', function () {
+ updateCasterLevel();
+ });
+ on('change:spellcasting', function () {
+ turnOnSlotsIfItsNotSet();
+ });
+};
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.parseActionComponents = exports.parseCostFromSRD = exports.changeWeightSystem = exports.weighActionComponents = exports.updateUsesForChatMacro = exports.updateCost = exports.updateRecharge = exports.updateUses = exports.updateExtras = exports.updateContent = exports.updateOtherDamage = exports.updateAmmo = exports.parseAttackType = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilities = __webpack_require__(3);
+
+var _attack = __webpack_require__(12);
+
+var _distance = __webpack_require__(9);
+
+var _damage = __webpack_require__(13);
+
+var _heal = __webpack_require__(16);
+
+var _savingThrow = __webpack_require__(17);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+var setAbilityBasedOnAttackType = function setAbilityBasedOnAttackType(data, repString) {
+ (0, _attack.setAttackAbilityBasedOnAttackType)(data, repString);
+ (0, _damage.setDamageAbilityBasedOnAttackType)(data, repString, 'attack');
+}; /* global getTranslationByKey:false, generateRowID:false */
+
+var parseAttackType = exports.parseAttackType = function parseAttackType(data, repString) {
+ var section = (0, _utilities.getRepeatingSectionOfRepeatingString)(repString);
+ if (data[repString + '_content'] && data[repString + '_content'].includes('Attack:')) {
+ var typeRegex = /(melee|ranged|melee or ranged)\s*(spell|weapon)\s*attack:\s?/gi;
+ var actionType = typeRegex.exec(data[repString + '_content']);
+ if (actionType && actionType[1] && actionType[2]) {
+ actionType[1] = actionType[1].toLowerCase();
+ actionType[2] = actionType[2].toUpperCase();
+ if (actionType[1] === 'melee' || actionType[1] === 'melee or ranged') {
+ data[repString + '_attack_type'] = 'MELEE_' + actionType[2] + '_ATTACK';
+ setAbilityBasedOnAttackType(data, repString);
+ if (actionType[1] === 'melee or ranged') {
+ // generateDuplicateRepeatingItem(data, repString, 'thrown'); TODO: Fix
+ }
+ } else if (actionType[1] === 'ranged') {
+ data[repString + '_attack_type'] = 'RANGED_' + actionType[2] + '_ATTACK';
+ setAbilityBasedOnAttackType(data, repString);
+ }
+
+ if (section && !section.includes('spell')) {
+ data[repString + '_content'] = data[repString + '_content'].replace(typeRegex, '');
+ }
+ }
+ if (section && section.includes('spell') && (0, _utilities.exists)(data.spell_ability)) {
+ data[repString + '_attack_ability'] = (0, _abilities.getFormattedAbility)(data.spell_ability);
+ }
+ }
+ if (data[repString + '_attack_type'] && (data[repString + '_attack_type'].includes('Melee') || data[repString + '_attack_type'].includes('Ranged'))) {
+ if (data[repString + '_attack_type'].toLowerCase() === 'melee weapon') {
+ data[repString + '_attack_type'] = 'MELEE_WEAPON_ATTACK';
+ setAbilityBasedOnAttackType(data, repString);
+ } else if (data[repString + '_attack_type'].toLowerCase() === 'ranged weapon') {
+ data[repString + '_attack_type'] = 'RANGED_WEAPON_ATTACK';
+ setAbilityBasedOnAttackType(data, repString);
+ } else if (data[repString + '_attack_type'].toLowerCase() === 'melee') {
+ data[repString + '_attack_type'] = 'MELEE_SPELL_ATTACK';
+ setAbilityBasedOnAttackType(data, repString);
+ } else if (data[repString + '_attack_type'].toLowerCase() === 'ranged') {
+ data[repString + '_attack_type'] = 'RANGED_SPELL_ATTACK';
+ setAbilityBasedOnAttackType(data, repString);
+ }
+ if (section && section.includes('spell') && (0, _utilities.exists)(data.spell_ability)) {
+ data[repString + '_attack_ability'] = (0, _abilities.getFormattedAbility)(data.spell_ability);
+ }
+ }
+ if (section && section.includes('spell') && data[repString + '_attack_type'] && data[repString + '_attack_type'].includes('WEAPON')) {
+ data[repString + '_attack_type'] = data[repString + '_attack_type'].replace('WEAPON', 'SPELL');
+ }
+};
+
+var setAmmo = function setAmmo(repeatingInfo, ammoString) {
+ (0, _server.getSetItems)('setAmmo', {
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['roll_formula'],
+ name: 'repeating_offense',
+ repeatingInfo: repeatingInfo
+ }],
+ process: function process(data, repStrings) {
+ repStrings.forEach(function (repString) {
+ (0, _utilities.addToRollFormula)(data, repString, ammoString);
+ });
+ }
+ });
+};
+
+var findAmmo = function findAmmo() {
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+ name = _ref.name,
+ perUse = _ref.perUse,
+ repeatingInfo = _ref.repeatingInfo,
+ weight = _ref.weight;
+
+ (0, _server.getSetItems)('findAmmo', {
+ collectionArray: ['ammo_auto_use'],
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['name', 'uses'],
+ name: 'repeating_ammo'
+ }],
+ process: function process(data, repStrings) {
+ var ammoRepString = void 0;
+ var ammo = repStrings.filter(function (repString) {
+ return data[repString + '_name'] === name;
+ });
+ if (ammo && ammo[0]) {
+ ammoRepString = ammo[0];
+ } else {
+ console.warn('cannot find ammo field by the name ' + name + ', adding it');
+ ammoRepString = 'repeating_ammo_' + generateRowID();
+ data[ammoRepString + '_name'] = name;
+ data[ammoRepString + '_uses'] = 1;
+ if (name.toLowerCase().includes('arrows')) {
+ data[ammoRepString + '_weight'] = .05; // eslint-disable-line no-floating-decimal
+ } else if (name.toLowerCase().includes('blowgun needles')) {
+ data[ammoRepString + '_weight'] = .02; // eslint-disable-line no-floating-decimal
+ } else if (name.toLowerCase().includes('sling bullets') || name.toLowerCase().includes('bolts')) {
+ data[ammoRepString + '_weight'] = .075; // eslint-disable-line no-floating-decimal
+ } else {
+ data[ammoRepString + '_weight'] = weight;
+ }
+ }
+ setAmmo(repeatingInfo, '{{ammo=[[@{' + ammoRepString + '_uses}-' + ((0, _utilities.exists)(data.ammo_auto_use) ? 1 : 0) * (parseFloat(perUse) || 1) + ']]}} {{ammo_name=' + name + '}}');
+ }
+ });
+};
+
+var updateAmmo = exports.updateAmmo = function updateAmmo(data, repString) {
+ if ((0, _utilities.exists)(data[repString + '_ammo_field_name'])) {
+ findAmmo({
+ name: data[repString + '_ammo_field_name'],
+ perUse: data[repString + '_ammo_per_use'],
+ repeatingInfo: {
+ rowId: repString.replace('repeating_offense_', '')
+ },
+ weight: data[repString + '_weight']
+ });
+ }
+};
+
+var updateOtherDamage = exports.updateOtherDamage = function updateOtherDamage(data, repString, repeatingInfo) {
+ if ((0, _utilities.exists)(data[repString + '_other_damage_toggle'])) {
+ (0, _damage.updateDamages)(data, repString, repeatingInfo, 'other');
+ }
+};
+
+var updateContent = exports.updateContent = function updateContent(data, repString) {
+ if ((0, _utilities.exists)(data[repString + '_content_toggle']) && (0, _utilities.exists)(data[repString + '_content'])) {
+ if ((0, _utilities.exists)(data.use_custom_saving_throws)) {
+ _constants.CUSTOM_SAVING_THROWS.forEach(function (customSavingThrow) {
+ _constants.ABILITIES.forEach(function (ability) {
+ if ((0, _utilities.exists)(data[customSavingThrow + '_' + ability])) {
+ var regex = new RegExp((0, _utilities.capitalize)(ability) + ' saving throw', 'gi');
+ data[repString + '_content'] = data[repString + '_content'].replace(regex, getTranslationByKey(customSavingThrow.toUpperCase()) + ' saving throw');
+ }
+ });
+ });
+ }
+ (0, _distance.convertDistance)(data, repString + '_content');
+ (0, _utilities.addToRollFormula)(data, repString, '{{content=@{content}}}');
+ }
+};
+
+var updateExtras = exports.updateExtras = function updateExtras(data, repString) {
+ if ((0, _utilities.exists)(data[repString + '_emote'])) {
+ (0, _utilities.addToRollFormula)(data, repString, '{{emote=@{emote}}}');
+ }
+ if ((0, _utilities.exists)(data[repString + '_freetext'])) {
+ (0, _utilities.addToRollFormula)(data, repString, '{{freetext=@{freetext}}}');
+ }
+};
+
+var updateUses = exports.updateUses = function updateUses(data, repString) {
+ if ((0, _utilities.existsAllowZero)(data[repString + '_uses'])) {
+ (0, _utilities.addToRollFormula)(data, repString, '{{uses=@{uses}}}');
+ }
+ if ((0, _utilities.existsAllowZero)(data[repString + '_uses_max'])) {
+ (0, _utilities.addToRollFormula)(data, repString, '{{uses_max=@{uses|max}}}');
+ }
+ if ((0, _utilities.isUndefined)(data[repString + '_per_use']) && ((0, _utilities.existsAllowZero)(data[repString + '_uses']) || (0, _utilities.existsAllowZero)(data[repString + '_uses_max']))) {
+ data[repString + '_per_use'] = 1;
+ }
+ if ((0, _utilities.existsAllowZero)(data[repString + '_per_use'])) {
+ (0, _utilities.addToRollFormula)(data, repString, '{{per_use=@{per_use}}}');
+ }
+ if ((0, _utilities.existsAllowZero)(data[repString + '_uses']) || (0, _utilities.existsAllowZero)(data[repString + '_uses_max']) || (0, _utilities.existsAllowZero)(data[repString + '_per_use'])) {
+ (0, _utilities.addToRollFormula)(data, repString, '{{repeating_item=' + repString + '}}');
+ }
+};
+
+var updateRecharge = exports.updateRecharge = function updateRecharge(data, repString) {
+ if ((0, _utilities.exists)(data[repString + '_recharge'])) {
+ if (data[repString + '_recharge'].toLowerCase().includes('short')) {
+ data[repString + '_recharge'] = 'SHORT_OR_LONG_REST';
+ } else if (data[repString + '_recharge'].toLowerCase().includes('long')) {
+ data[repString + '_recharge'] = 'LONG_REST';
+ }
+ (0, _utilities.addToRollFormula)(data, repString, '{{recharge=@{recharge}}}');
+ }
+};
+
+var updateCost = exports.updateCost = function updateCost(data, repString) {
+ if ((0, _utilities.exists)(data[repString + '_cost'])) {
+ (0, _utilities.addToRollFormula)(data, repString, '{{cost=@{cost}}}');
+ }
+};
+
+var updateUsesForChatMacro = exports.updateUsesForChatMacro = function updateUsesForChatMacro(data, repString, action) {
+ if ((0, _utilities.exists)(data[repString + '_uses']) || (0, _utilities.exists)(data[repString + '_uses_max']) || (0, _utilities.exists)(data[repString + '_recharge']) || (0, _utilities.exists)(data[repString + '_cost'])) {
+ action.name += ' (';
+ if ((0, _utilities.exists)(data[repString + '_uses'])) {
+ action.name += '' + data[repString + '_uses'];
+ }
+ if ((0, _utilities.exists)(data[repString + '_recharge'])) {
+ if ((0, _utilities.exists)(data[repString + '_uses_max'])) {
+ action.name += '/' + data[repString + '_uses_max'];
+ }
+ if ((0, _utilities.exists)(data[repString + '_uses_max'])) {
+ action.name += ', ';
+ }
+ action.name += getTranslationByKey(data[repString + '_recharge']);
+ }
+ if ((0, _utilities.exists)(data[repString + '_cost'])) {
+ if ((0, _utilities.exists)(data[repString + '_uses_max']) || (0, _utilities.exists)(data[repString + '_recharge'])) {
+ action.name += ', ';
+ }
+ action.name += getTranslationByKey(data[repString + '_cost']);
+ }
+ action.name += ')';
+ }
+};
+
+var weighActionComponents = exports.weighActionComponents = function weighActionComponents(data, repString, options) {
+ var weight = 0;
+ if (!options.toggle || (0, _utilities.exists)(data[repString + '_' + options.toggle])) {
+ if (options.weightMultiplier && data[options.weightMultiplier] === 'HALF') {
+ weight = Math.floor((parseFloat(data[repString + '_weight']) || options.weightDefault) / 2);
+ } else if (options.weightMultiplier && data[options.weightMultiplier] === '0') {
+ weight = 0;
+ } else {
+ weight = parseFloat(data[repString + '_weight']) || options.weightDefault || 0;
+ }
+ if ((0, _utilities.exists)(data[repString + '_weight_per_use']) || options.repeatingSectionTotal === 'weight_ammo') {
+ weight = (0, _utilities.round)(parseInt(data[repString + '_uses'] || 0, 10) * weight);
+ }
+ }
+ var originalWeight = data[repString + '_weight_total'] || 0;
+
+ data[repString + '_weight_total'] = weight;
+
+ if (!data[options.repeatingSectionTotal]) {
+ data[options.repeatingSectionTotal] = 0;
+ }
+ if (options.repeatingInfo && options.repeatingInfo.rowId) {
+ if (originalWeight !== data[repString + '_weight_total']) {
+ data[options.repeatingSectionTotal] += data[repString + '_weight_total'] - originalWeight;
+ }
+ } else {
+ data[options.repeatingSectionTotal] += weight;
+ }
+};
+
+var changeWeightSystem = exports.changeWeightSystem = function changeWeightSystem(data, repString, defaultWeight) {
+ var localWeightSystem = data[repString + '_weight_system'] || 'POUNDS';
+
+ var weight = parseFloat(data[repString + '_weight']) || defaultWeight;
+ if ((0, _utilities.exists)(weight) && localWeightSystem.toUpperCase() !== data.weight_system) {
+ if (data.weight_system === 'POUNDS') {
+ // convert to pounds
+ data[repString + '_weight'] = (0, _utilities.round)(weight * 2.204622621848776);
+ } else if (data.weight_system === 'KILOGRAMS') {
+ // convert to kilos
+ data[repString + '_weight'] = (0, _utilities.round)(weight * 0.45359237);
+ }
+ }
+ data[repString + '_weight_system'] = data.weight_system;
+};
+
+var parseRechargeFromSRD = function parseRechargeFromSRD(data, repString) {
+ var rechargeShortRestRegex = /\s*?\(Recharges\safter\sa\s(.*)\)/gi;
+ var rechargeDayRegex = /\s*?\((\d+)\/Day\)/gi;
+ var rechargeTurnRegex = /\s*?\((\d+)\/Turn\)/gi;
+ var rechargeRangeRegex = /\s*?\(Recharge\s*?(\d+)-(\d+)\)/gi;
+ var rechargeValueRegex = /\s*?\(Recharge\s*?(\d+)\)/gi;
+ if ((0, _utilities.exists)(data[repString + '_name']) && typeof data[repString + '_name'] === 'string') {
+ var rechargeShortRestResult = rechargeShortRestRegex.exec(data[repString + '_name']);
+ var rechargeDayResult = rechargeDayRegex.exec(data[repString + '_name']);
+ var rechargeTurnResult = rechargeTurnRegex.exec(data[repString + '_name']);
+ var rechargeRangeResult = rechargeRangeRegex.exec(data[repString + '_name']);
+ var rechargeValueResult = rechargeValueRegex.exec(data[repString + '_name']);
+ if (rechargeShortRestResult) {
+ data[repString + '_recharge'] = 'SHORT_OR_LONG_REST';
+ data[repString + '_uses'] = 1;
+ data[repString + '_uses_max'] = 1;
+ data[repString + '_name'] = data[repString + '_name'].replace(rechargeShortRestRegex, '');
+ } else if (rechargeDayResult && rechargeDayResult[1]) {
+ data[repString + '_recharge'] = 'LONG_REST';
+ data[repString + '_uses'] = rechargeDayResult[1];
+ data[repString + '_uses_max'] = rechargeDayResult[1];
+ data[repString + '_name'] = data[repString + '_name'].replace(rechargeDayRegex, '');
+ } else if (rechargeTurnResult && rechargeTurnResult[1]) {
+ data[repString + '_recharge'] = 'TURN';
+ data[repString + '_uses'] = rechargeTurnResult[1];
+ data[repString + '_uses_max'] = rechargeTurnResult[1];
+ data[repString + '_name'] = data[repString + '_name'].replace(rechargeTurnRegex, '');
+ } else if (rechargeRangeResult && rechargeRangeResult[1] && rechargeRangeResult[2]) {
+ data[repString + '_recharge'] = 'RECHARGE_' + rechargeRangeResult[1] + '_' + rechargeRangeResult[2];
+ data[repString + '_uses'] = 1;
+ data[repString + '_uses_max'] = 1;
+ data[repString + '_name'] = data[repString + '_name'].replace(rechargeRangeRegex, '');
+ } else if (rechargeValueResult && rechargeValueResult[1]) {
+ data[repString + '_recharge'] = 'RECHARGE_' + rechargeValueResult[1];
+ data[repString + '_uses'] = 1;
+ data[repString + '_uses_max'] = 1;
+ data[repString + '_name'] = data[repString + '_name'].replace(rechargeValueRegex, '');
+ }
+ }
+};
+
+var parseCostFromSRD = exports.parseCostFromSRD = function parseCostFromSRD(data, repString) {
+ var costRegex = /\s*?\(Costs\s(\d+)\sActions\)/gi;
+ if ((0, _utilities.exists)(data[repString + '_name'])) {
+ var costResult = costRegex.exec(data[repString + '_name']);
+ if (costResult && costResult[1]) {
+ data[repString + '_cost'] = 'COSTS_' + costResult[1] + '_ACTIONS';
+ data[repString + '_name'] = data[repString + '_name'].replace(costRegex, '');
+ }
+ }
+};
+
+var parseActionComponents = exports.parseActionComponents = function parseActionComponents(data, repString) {
+ parseAttackType(data, repString);
+ (0, _damage.parseDamageFromSRD)(data, repString);
+ (0, _heal.parseHealingFromSRD)(data, repString);
+ (0, _heal.parseHealFromSRD)(data, repString);
+ parseRechargeFromSRD(data, repString);
+ parseCostFromSRD(data, repString);
+ if (repString && !repString.includes('utility') && !repString.includes('racialtrait') && !repString.includes('classfeature') && !repString.includes('feat') && !repString.includes('trait')) {
+ (0, _attack.parseAttack)(data, repString);
+ }
+
+ (0, _savingThrow.parseSavingThrow)(data, repString);
+};
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.parseHealFromSRD = exports.parseHealingFromSRD = exports.updateHeal = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilities = __webpack_require__(3);
+
+var _utilities = __webpack_require__(0);
+
+var updateHeal = exports.updateHeal = function updateHeal(data, repString) {
+ if ((0, _utilities.exists)(data[repString + '_heal_toggle'])) {
+ var healFormula = '';
+ var section = (0, _utilities.getRepeatingSectionOfRepeatingString)(repString);
+ if ((0, _utilities.exists)(data[repString + '_heal_dice']) && (0, _utilities.exists)(data[repString + '_heal_die'])) {
+ var healResult = '' + data[repString + '_heal_dice'] + data[repString + '_heal_die'];
+ healFormula = (0, _utilities.addTo)(healFormula, healResult);
+ if ((0, _utilities.exists)(data.show_dice_modifiers) && (0, _utilities.exists)(data[repString + '_heal_dice_modifier'])) {
+ healFormula += data[repString + '_heal_dice_modifier'];
+ }
+ healFormula += '[' + getTranslationByKey('HEAL').toLowerCase() + ']';
+ }
+ if ((0, _utilities.exists)(data[repString + '_heal_ability'])) {
+ if (data[repString + '_heal_ability'] === 'SPELL_ABILITY') {
+ data[repString + '_heal_ability'] = (0, _abilities.getFormattedAbility)(data.spell_ability);
+ }
+ var healAbility = (0, _abilities.getAbilityMod)(data, data[repString + '_heal_ability']);
+ healFormula = (0, _utilities.addTo)(healFormula, healAbility + '[' + data[repString + '_heal_ability'].toLowerCase() + ']');
+ }
+ var healBonus = data[repString + '_heal_bonus'];
+ if ((0, _utilities.exists)(healBonus)) {
+ healFormula = (0, _utilities.addTo)(healFormula, healBonus + '[' + getTranslationByKey('BONUS').toLowerCase() + ']');
+ }
+ if ((0, _utilities.exists)(data[repString + '_heal_query_toggle'])) {
+ healFormula = (0, _utilities.addTo)(healFormula, _constants.HEAL_QUERY + '[' + getTranslationByKey('QUERY').toLowerCase() + ']');
+ }
+ if (section && section.includes('spell') && (0, _utilities.exists)(data.spell_heal_modifier)) {
+ healFormula = (0, _utilities.addTo)(healFormula, data.spell_heal_modifier + '[' + getTranslationByKey('SPELL_HEAL_MODIFIER').toLowerCase() + ']');
+ }
+ var level = (0, _utilities.getLevelOfRepeatingString)(repString);
+ if ((0, _utilities.exists)(data[repString + '_heal_higher_level_dice']) && (0, _utilities.exists)(data[repString + '_heal_die'])) {
+ healFormula = (0, _utilities.addTo)(healFormula, '((@{higher_level_query_' + level + '} - ' + level + ') * ' + data[repString + '_heal_higher_level_dice'] + ')' + data[repString + '_heal_die'] + '[' + getTranslationByKey('HIGHER_LEVEL').toLowerCase() + ']');
+ }
+ if ((0, _utilities.exists)(data[repString + '_higher_level_heal'])) {
+ healFormula = (0, _utilities.addTo)(healFormula, '(@{higher_level_heal} * (@{higher_level_query_' + level + '} - ' + level + '))[' + getTranslationByKey('HIGHER_LEVEL_FLAT_AMOUNT').toLowerCase() + ']');
+ }
+ (0, _utilities.addToRollFormula)(data, repString, '{{heal=[[' + healFormula + ']]}}');
+ }
+}; /* global getTranslationByKey:false */
+
+var parseHealingFromSRD = exports.parseHealingFromSRD = function parseHealingFromSRD(data, repString) {
+ if ((0, _utilities.exists)(data.healing_from_srd)) {
+ data[repString + '_heal_toggle'] = 1;
+ (0, _utilities.parseDiceAndDieFromSRD)(data, repString, 'heal', 'healing_from_srd');
+ }
+};
+
+var parseHealFromSRD = exports.parseHealFromSRD = function parseHealFromSRD(data, repString) {
+ if ((0, _utilities.exists)(data[repString + '_content']) && (0, _utilities.isUndefinedOrEmpty)(data[repString + '_heal_toggle'])) {
+ var healRegex = new RegExp('regain ' + _constants.REGEX.singleNumber.source + _constants.REGEX.openParenthesis.source + _constants.REGEX.diceAndDie.source + _constants.REGEX.plusMinusBonus.source + ' hit points', 'i');
+ var healResult = healRegex.exec(data[repString + '_content']);
+ if (healResult) {
+ if (healResult[1]) {
+ data[repString + '_heal_bonus'] = parseInt(healResult[1], 10);
+ }
+ if (healResult[2] && healResult[3]) {
+ data[repString + '_heal_dice'] = parseInt(healResult[2], 10);
+ data[repString + '_heal_die'] = healResult[3];
+ }
+ if (healResult[4]) {
+ data[repString + '_heal_bonus'] = parseInt(healResult[4].replace(' ', ''), 10);
+ }
+ }
+ }
+};
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.parseSavingThrow = exports.updateSavingThrow = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilities = __webpack_require__(3);
+
+var _damage = __webpack_require__(13);
+
+var _utilities = __webpack_require__(0);
+
+var updateSavingThrow = exports.updateSavingThrow = function updateSavingThrow() {
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+ data = _ref.data,
+ repString = _ref.repString,
+ repeatingInfo = _ref.repeatingInfo,
+ newRepeatingField = _ref.newRepeatingField;
+
+ if ((0, _utilities.exists)(data[repString + '_saving_throw_toggle'])) {
+ var section = (0, _utilities.getRepeatingSectionOfRepeatingString)(repString);
+ (0, _utilities.addToRollFormula)(data, repString, '{{saving_throw_vs_ability=' + data[repString + '_saving_throw_vs_ability'] + '}}');
+
+ if ((0, _utilities.exists)(data.use_custom_saving_throws)) {
+ _constants.CUSTOM_SAVING_THROWS.forEach(function (customSavingThrow) {
+ if ((0, _utilities.exists)(data[customSavingThrow + '_' + data[repString + '_saving_throw_vs_ability'].toLowerCase()])) {
+ data[repString + '_saving_throw_vs_ability'] = customSavingThrow.toUpperCase();
+ }
+ });
+ }
+ data[repString + '_saving_throw_dc'] = parseFloat(data.base_dc || 8);
+ if (section && section.includes('spell') && (0, _utilities.exists)(data.spell_ability) && (newRepeatingField || repeatingInfo && (repeatingInfo.field === 'saving_throw_toggle' || repeatingInfo.field === 'name'))) {
+ data[repString + '_saving_throw_ability'] = (0, _abilities.getFormattedAbility)(data.spell_ability);
+ }
+ data[repString + '_saving_throw_dc'] += (0, _abilities.getAbilityMod)(data, data[repString + '_saving_throw_ability']);
+ if (section && section.includes('spell') && (0, _utilities.exists)(data.spell_dc_modifier) && !isNaN(data.spell_dc_modifier)) {
+ data[repString + '_saving_throw_dc'] += parseFloat(data.spell_dc_modifier);
+ }
+ if (data[repString + '_saving_throw_bonus']) {
+ data[repString + '_saving_throw_dc'] += parseFloat(data[repString + '_saving_throw_bonus']);
+ }
+
+ var pb = (0, _utilities.getPB)(data);
+ if ((0, _utilities.exists)(pb) && isNaN(pb)) {
+ data[repString + '_saving_throw_dc'] = '[[' + data[repString + '_saving_throw_dc'] + ' + ' + pb + ']]';
+ } else {
+ data[repString + '_saving_throw_dc'] += pb;
+ }
+
+ if ((0, _utilities.exists)(data[repString + '_saving_throw_dc'])) {
+ (0, _utilities.addToRollFormula)(data, repString, '{{saving_throw_dc=' + data[repString + '_saving_throw_dc'] + '}}');
+ }
+ (0, _damage.updateDamages)(data, repString, {}, 'saving_throw');
+ if ((0, _utilities.exists)(data[repString + '_saving_throw_success'])) {
+ (0, _utilities.addToRollFormula)(data, repString, '{{saving_throw_success=' + data[repString + '_saving_throw_success'] + '}}');
+ }
+ if ((0, _utilities.exists)(data.attacks_vs_target_name) && data[repString + '_roll_formula'] && !data[repString + '_roll_formula'].includes('targetName')) {
+ (0, _utilities.addToRollFormula)(data, repString, '{{targetName=@{target|token_name}}}');
+ }
+ }
+};
+
+var getAnyCorrectAbilityBasedOnBonus = function getAnyCorrectAbilityBasedOnBonus(data, repString, fieldName, bonus) {
+ var abilityMods = [(0, _abilities.getAbilityMod)(data, 'strength'), (0, _abilities.getAbilityMod)(data, 'dexterity'), (0, _abilities.getAbilityMod)(data, 'constitution'), (0, _abilities.getAbilityMod)(data, 'intelligence'), (0, _abilities.getAbilityMod)(data, 'wisdom'), (0, _abilities.getAbilityMod)(data, 'charisma')];
+ var closest = (0, _utilities.findClosest)(abilityMods, bonus);
+ if (bonus) {
+ bonus -= closest;
+
+ if (closest === abilityMods[0]) {
+ data[repString + '_' + fieldName] = 'STR';
+ } else if (closest === abilityMods[1]) {
+ data[repString + '_' + fieldName] = 'DEX';
+ } else if (closest === abilityMods[2]) {
+ data[repString + '_' + fieldName] = 'CON';
+ } else if (closest === abilityMods[3]) {
+ data[repString + '_' + fieldName] = 'INT';
+ } else if (closest === abilityMods[4]) {
+ data[repString + '_' + fieldName] = 'WIS';
+ } else if (closest === abilityMods[5]) {
+ data[repString + '_' + fieldName] = 'CHA';
+ }
+ } else {
+ data[repString + '_' + fieldName] = 0;
+ }
+ return bonus;
+};
+
+var parseSavingThrow = exports.parseSavingThrow = function parseSavingThrow(data, repString) {
+ var savingThrowRe = /(?:DC)\s*?(\d+)\s*?([a-zA-Z]*)\s*?(?:saving throw)/;
+ var savingThrowRegex = new RegExp(savingThrowRe.source, 'i');
+
+ var savingThrow = savingThrowRegex.exec(data[repString + '_content']);
+ if (savingThrow && (0, _utilities.isUndefinedOrZero)(data[repString + '_saving_throw_ability'])) {
+ if (savingThrow[1]) {
+ var savingThrowTotal = savingThrow[1];
+ savingThrowTotal -= 8;
+ savingThrowTotal -= (0, _utilities.calculatePBFromLevelAndChallenge)(data.level, data.challenge);
+
+ savingThrowTotal = getAnyCorrectAbilityBasedOnBonus(data, repString, 'saving_throw_ability', savingThrowTotal);
+
+ if (savingThrowTotal) {
+ data[repString + '_saving_throw_bonus'] = savingThrowTotal;
+ }
+ data[repString + '_content'] = data[repString + '_content'];
+ data[repString + '_saving_throw_toggle'] = 1;
+ }
+ if (savingThrow[2]) {
+ data[repString + '_saving_throw_vs_ability'] = savingThrow[2].toUpperCase();
+ }
+ var saveSuccess = /\sor\s(.*)?\son a successful one./;
+ var saveSuccessRegex = new RegExp(saveSuccess.source, 'i');
+ var halfDamage = saveSuccessRegex.exec(data[repString + '_content']);
+ if (halfDamage && halfDamage[1]) {
+ data[repString + '_saving_throw_success'] = halfDamage[1];
+ }
+ (0, _damage.parseDamage)(data, repString, 'saving_throw_damage');
+ }
+};
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupArmorClass = exports.updateArmorClass = undefined;
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+/* global on:false */
+
+var updateArmorClass = exports.updateArmorClass = function updateArmorClass() {
+ (0, _server.getSetItems)('armorClass.update', {
+ collectionArray: ['is_npc', 'ac_srd', 'AC', 'ac_from_armor', 'ac_modifier'],
+ process: function process(data) {
+ if ((0, _utilities.exists)(data.is_npc) || data.ac_srd) {
+ return;
+ }
+ data.AC = 0;
+ if ((0, _utilities.exists)(data.ac_from_armor)) {
+ data.AC = parseFloat(data.ac_from_armor);
+ }
+ if ((0, _utilities.exists)(data.ac_modifier)) {
+ data.AC += parseFloat(data.ac_modifier);
+ }
+ }
+ });
+};
+
+var setupArmorClass = exports.setupArmorClass = function setupArmorClass() {
+ on('change:ac_from_armor change:ac_modifier', function () {
+ updateArmorClass();
+ });
+};
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupProficiencyBonus = exports.updatePB = exports.setPB = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilities = __webpack_require__(3);
+
+var _actions = __webpack_require__(4);
+
+var _savingThrows = __webpack_require__(8);
+
+var _server = __webpack_require__(1);
+
+var _spells = __webpack_require__(5);
+
+var _utilities = __webpack_require__(0);
+
+var updateDependents = function updateDependents() {
+ (0, _abilities.updateAbilitiesWithServer)();
+ (0, _actions.updateAllActions)();
+ (0, _savingThrows.updateAllSavingThrows)();
+ (0, _spells.updateSpells)();
+ (0, _spells.updateDCAndAttack)();
+}; /* global on:false */
+
+var setPB = exports.setPB = function setPB(levelOrChallenge, callback) {
+ (0, _server.getSetItems)('proficiencyBonus.set', {
+ collectionArray: _constants.FIELDS.pb.concat(['pb', 'pb_display']),
+ process: function process(data) {
+ data.pb = (0, _utilities.calculatePB)(levelOrChallenge);
+ (0, _utilities.formatPBProfDice)(data);
+ },
+ processCallback: function processCallback() {
+ if (callback) {
+ callback();
+ }
+ updateDependents();
+ }
+ });
+};
+
+var updatePB = exports.updatePB = function updatePB() {
+ (0, _server.getSetItems)('proficiencyBonus.update', {
+ collectionArray: _constants.FIELDS.pb.concat(['pb', 'pb_display']),
+ process: function process(data) {
+ data.pb = (0, _utilities.calculatePBFromLevelAndChallenge)(data.level, data.challenge);
+ (0, _utilities.formatPBProfDice)(data);
+ },
+ processCallback: function processCallback() {
+ updateDependents();
+ }
+ });
+};
+
+var setupProficiencyBonus = exports.setupProficiencyBonus = function setupProficiencyBonus() {
+ on('change:proficiency_dice', function () {
+ updatePB();
+ });
+};
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupClasses = exports.updateLevels = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _classFeatures = __webpack_require__(21);
+
+var _hitDice = __webpack_require__(11);
+
+var _proficiencyBonus = __webpack_require__(19);
+
+var _savingThrows = __webpack_require__(8);
+
+var _server = __webpack_require__(1);
+
+var _spells = __webpack_require__(5);
+
+var _utilities = __webpack_require__(0);
+
+/* global on:false, removeRepeatingRow:false */
+
+var xpTable = [0, 300, 900, 2700, 6500, 14000, 23000, 34000, 48000, 64000, 85000, 100000, 120000, 140000, 165000, 195000, 225000, 265000, 305000, 355000, 385000, 405000, 435000, 465000, 495000, 525000, 555000, 585000, 605000, 635000, 665000];
+
+var updateLevels = exports.updateLevels = function updateLevels(eventInfo) {
+ var repeatingInfo = void 0;
+ if (eventInfo) {
+ repeatingInfo = (0, _utilities.getRepeatingInfo)('repeating_class', eventInfo);
+ if (!repeatingInfo) {
+ return;
+ }
+ }
+
+ var spellcasting = {
+ full: 0,
+ fullPsionics: 0,
+ half: 0,
+ halfPsionics: 0,
+ third: 0,
+ thirdPsionics: 0,
+ warlock: 0
+ };
+ var totalLevel = 0;
+ var classLevels = {};
+ var classesWithSpellcasting = 0;
+
+ var updateSavingThrows = false;
+
+ (0, _server.getSetItems)('classes.updateLevels', {
+ collectionArray: ['level', 'is_npc', 'caster_level', 'caster_type', 'class_and_level', 'level', 'xp_next_level', 'spell_level_filter_0', 'has_warlock_slots', 'warlock_spell_slots_calc', 'warlock_spell_slot_level', 'proficiencies', 'show_spells', 'spell_ability', 'spell_slots_toggle', 'spell_points_toggle', 'prepared_matters', 'prepared_matters_var'].concat(_constants.SAVING_THROWS.map(function (savingThrow) {
+ return savingThrow + '_saving_throw_proficient';
+ })).concat(_constants.CLASSES.map(function (className) {
+ return className + '_level';
+ })).concat(_constants.CLASSES.map(function (className) {
+ return 'has_' + className + '_levels';
+ })).concat(_constants.CLASSES.map(function (className) {
+ return className + '_toggle';
+ })),
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['level', 'name', 'custom_name', 'spellcasting', 'custom_class_toggle'],
+ name: 'repeating_class'
+ }],
+ process: function process(data, repStrings) {
+ repStrings.forEach(function (repString) {
+ var name = data[repString + '_name'];
+ if (!data[repString + '_name'] || (0, _utilities.isZero)(data[repString + '_name'])) {
+ removeRepeatingRow(repString);
+ } else {
+ data[repString + '_name'] = data[repString + '_name'].toUpperCase();
+ name = name.toLowerCase();
+ if (name === 'custom') {
+ data[repString + '_custom_class_toggle'] = 1;
+ if ((0, _utilities.exists)(data[repString + '_custom_name'])) {
+ name = data[repString + '_custom_name'].toLowerCase();
+ } else {
+ name = 'custom';
+ }
+ } else if (data[repString + '_custom_class_toggle']) {
+ data[repString + '_custom_class_toggle'] = 0;
+ }
+
+ data[repString + '_level'] = parseInt(data[repString + '_level'] || 0, 10);
+ totalLevel += data[repString + '_level'];
+ if (classLevels[name]) {
+ classLevels[name] += data[repString + '_level'];
+ } else {
+ classLevels[name] = data[repString + '_level'];
+ }
+
+ if (repeatingInfo && repeatingInfo.field === 'name') {
+ if (name in _constants.CLASS_DETAILS) {
+ data[repString + '_hd'] = _constants.CLASS_DETAILS[name].hd;
+ }
+ }
+
+ if (repeatingInfo && repeatingInfo.field === 'name') {
+ if (name in _constants.CLASS_DETAILS && _constants.CLASS_DETAILS[name].spellcasting) {
+ if (data[repString + '_spellcasting'] === 'none') {
+ data[repString + '_spellcasting'] = _constants.CLASS_DETAILS[name].spellcasting.type;
+ data.show_spells = 1;
+ if (_constants.CLASS_DETAILS[name].spellcasting.ability && (0, _utilities.isZero)(data.spell_ability)) {
+ data.spell_ability = _constants.CLASS_DETAILS[name].spellcasting.ability.toUpperCase();
+ }
+ if (_constants.CLASS_DETAILS[name].spellcasting.slots) {
+ data.spell_slots_toggle = 1;
+ }
+ if (_constants.CLASS_DETAILS[name].spellcasting.points) {
+ data.spell_points_toggle = 1;
+ }
+ if (_constants.CLASS_DETAILS[name].spellcasting.cantrips) {
+ data.spell_level_filter_0 = 1;
+ }
+ if (_constants.CLASS_DETAILS[name].spellcasting.prepared) {
+ data.prepared_matters = 1;
+ data.prepared_matters_var = true;
+ }
+ }
+ } else {
+ data[repString + '_spellcasting'] = 'none';
+ }
+ }
+
+ if (repeatingInfo && repeatingInfo.field === 'spellcasting') {
+ if (data[repString + '_spellcasting'] !== 'none') {
+ data.show_spells = 1;
+ }
+ }
+
+ if (data[repString + '_spellcasting'] === 'warlock') {
+ spellcasting[data[repString + '_spellcasting']] += data[repString + '_level'];
+ } else if (data[repString + '_spellcasting'] && data[repString + '_spellcasting'] !== 'none') {
+ classesWithSpellcasting += 1;
+ spellcasting[data[repString + '_spellcasting']] += data[repString + '_level'];
+ }
+
+ if (name in _constants.CLASS_DETAILS && 'proficiencies' in _constants.CLASS_DETAILS[name]) {
+ if (data.proficiencies === '') {
+ data.proficiencies = 'Armor: ' + _constants.CLASS_DETAILS[name].proficiencies.armor + '\nWeapons: ' + _constants.CLASS_DETAILS[name].proficiencies.weapons + '\nTools: ' + _constants.CLASS_DETAILS[name].proficiencies.tools;
+ _constants.ABILITIES.forEach(function (ability) {
+ if (_constants.CLASS_DETAILS[name] && _constants.CLASS_DETAILS[name].proficiencies && _constants.CLASS_DETAILS[name].proficiencies.savingThrows && _constants.CLASS_DETAILS[name].proficiencies.savingThrows.includes(ability)) {
+ data[ability + '_saving_throw_proficient'] = 1;
+ updateSavingThrows = true;
+ }
+ });
+ }
+ }
+ }
+ });
+
+ _constants.CLASSES.forEach(function (className) {
+ if (classLevels[className] > 0) {
+ data[className + '_level'] = classLevels[className];
+ } else if (data[className + '_level']) {
+ data[className + '_level'] = 0;
+ }
+ });
+ var classAndLevel = [];
+ Object.keys(classLevels).forEach(function (prop) {
+ if (classLevels[prop] > 0) {
+ classAndLevel.push((0, _utilities.capitalize)(prop) + ' ' + classLevels[prop]);
+ }
+ });
+ if (classAndLevel.length > 0) {
+ data.class_and_level = classAndLevel.join(', ');
+ }
+
+ data.level = totalLevel;
+ (0, _proficiencyBonus.setPB)(totalLevel);
+
+ var xpForNextLevel = 0;
+ if (!totalLevel) {
+ totalLevel = 0;
+ }
+ if (totalLevel > 30) {
+ xpForNextLevel = xpTable[30];
+ } else {
+ xpForNextLevel = xpTable[totalLevel];
+ }
+ if (xpForNextLevel > 0) {
+ data.xp_next_level = xpForNextLevel;
+ }
+
+ _constants.CLASSES.forEach(function (className) {
+ if (data[className + '_level'] > 0) {
+ data['has_' + className + '_levels'] = 1;
+ data[className + '_toggle'] = 1;
+ } else if (!(0, _utilities.isUndefinedOrEmpty)(data['has_' + className + '_levels'])) {
+ data['has_' + className + '_levels'] = 0;
+ }
+ });
+
+ var casterLevel = 0;
+ if (!(0, _utilities.exists)(data.is_npc)) {
+ if (classesWithSpellcasting > 1) {
+ casterLevel += spellcasting.full;
+ casterLevel += Math.floor(spellcasting.half / 2);
+ casterLevel += Math.floor(spellcasting.third / 3);
+ } else {
+ casterLevel = spellcasting.full + spellcasting.half + spellcasting.third;
+ }
+ data.caster_level = casterLevel;
+ }
+
+ if (classesWithSpellcasting > 1 || spellcasting.full) {
+ data.caster_type = 'full';
+ } else if (spellcasting.half) {
+ data.caster_type = 'half';
+ } else if (spellcasting.third) {
+ data.caster_type = 'third';
+ }
+
+ if (spellcasting.warlock) {
+ data.show_spells = 1;
+ data.warlock_slots_toggle = 1;
+
+ var warlockSpellSlots = void 0;
+ if (spellcasting.warlock >= 17) {
+ warlockSpellSlots = 4;
+ } else if (spellcasting.warlock >= 11) {
+ warlockSpellSlots = 3;
+ } else if (spellcasting.warlock >= 2) {
+ warlockSpellSlots = 2;
+ } else {
+ warlockSpellSlots = 1;
+ }
+ data.warlock_spell_slots_calc = warlockSpellSlots;
+
+ var warlockSpellsMaxLevel = void 0;
+ if (spellcasting.warlock >= 9) {
+ warlockSpellsMaxLevel = 5;
+ } else if (spellcasting.warlock >= 7) {
+ warlockSpellsMaxLevel = 4;
+ } else if (spellcasting.warlock >= 5) {
+ warlockSpellsMaxLevel = 3;
+ } else if (spellcasting.warlock >= 3) {
+ warlockSpellsMaxLevel = 2;
+ } else {
+ warlockSpellsMaxLevel = 1;
+ }
+ data.warlock_spell_slot_level = (0, _utilities.ordinalSpellLevel)(warlockSpellsMaxLevel);
+ } else {
+ if (!(0, _utilities.isUndefined)(data.warlock_spell_slots_calc)) {
+ data.warlock_spell_slots_calc = 0;
+ }
+ if (!(0, _utilities.isUndefined)(data.warlock_spell_slot_level)) {
+ data.warlock_spell_slot_level = (0, _utilities.ordinalSpellLevel)(1);
+ }
+ }
+ },
+ processCallback: function processCallback() {
+ (0, _hitDice.updateHitDice)();
+ (0, _classFeatures.determineClassFeatures)();
+ if (eventInfo && eventInfo.sourceType === 'player') {
+ (0, _spells.setSpellSlots)();
+ }
+ (0, _spells.updateHasSpellSlots)();
+ (0, _spells.updateHasWarlockSlots)();
+ (0, _spells.updateHasSpellPoints)();
+ if (updateSavingThrows) {
+ (0, _savingThrows.updateAllSavingThrows)();
+ }
+ }
+ });
+};
+
+var watchForClassLevelChanges = function watchForClassLevelChanges() {
+ var classFeatureWatch = _constants.ABILITIES.concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_score_modifier';
+ }));
+
+ on(classFeatureWatch.map(function (field) {
+ return 'change:' + field;
+ }).join(' '), function () {
+ (0, _classFeatures.determineClassFeatures)();
+ });
+};
+
+var setupClasses = exports.setupClasses = function setupClasses() {
+ on('change:repeating_class', function (eventInfo) {
+ updateLevels(eventInfo);
+ });
+ on('remove:repeating_class', function () {
+ updateLevels();
+ });
+ watchForClassLevelChanges();
+};
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupClassFeature = exports.determineClassFeatures = exports.setClassFeature = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilities = __webpack_require__(3);
+
+var _actions = __webpack_require__(4);
+
+var _equipment = __webpack_require__(10);
+
+var _features = __webpack_require__(29);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+var classFeaturesList = {
+ artificer: {
+ 1: ['MAGIC_ITEM_ANALYSIS'],
+ 2: ['TOOL_EXPERTISE', 'WONDROUS_INVENTION'],
+ 4: ['INFUSE_MAGIC'],
+ 5: ['SUPERIOR_ATTUNEMENT'],
+ 6: ['MECHANICAL_SERVANT'],
+ 20: ['SOUL_OF_ARTIFICE']
+ },
+ barbarian: {
+ 1: ['RAGE', 'UNARMORED_DEFENSE'],
+ 2: ['RECKLESS_ATTACK', 'DANGER_SENSE'],
+ 5: ['EXTRA_ATTACK', 'FAST_MOVEMENT'],
+ 7: ['FERAL_INSTINCT'],
+ 9: ['BRUTAL_CRITICAL'],
+ 11: ['RELENTLESS_RAGE'],
+ 15: ['PERSISTENT_RAGE'],
+ 18: ['INDOMITABLE_MIGHT'],
+ 20: ['PRIMAL_CHAMPION']
+ },
+ bard: {
+ 1: ['BARDIC_INSPIRATION'],
+ 2: ['JACK_OF_ALL_TRADES', 'SONG_OF_REST'],
+ 3: ['EXPERTISE'],
+ 6: ['COUNTERCHARM'],
+ 10: ['MAGICAL_SECRETS'],
+ 20: ['SUPERIOR_INSPIRATION']
+ },
+ cleric: {
+ 2: ['CHANNEL_DIVINITY', 'CHANNEL_DIVINITY_TURN_UNDEAD'],
+ 10: ['DIVINE_INTERVENTION']
+ },
+ druid: {
+ 1: ['DRUIDIC'],
+ 2: ['WILD_SHAPE'],
+ 18: ['TIMELESS_BODY', 'BEAST_SPELLS'],
+ 20: ['ARCHDRUID']
+ },
+ fighter: {
+ 1: ['FIGHTING_STYLE', 'SECOND_WIND'],
+ 2: ['ACTION_SURGE'],
+ 5: ['EXTRA_ATTACK'],
+ 9: ['INDOMITABLE']
+ },
+ monk: {
+ 1: ['UNARMORED_DEFENSE', 'MARTIAL_ARTS'],
+ 2: ['KI', 'FLURRY_OF_BLOWS', 'PATIENT_DEFENSE', 'STEP_OF_THE_WIND', 'UNARMORED_MOVEMENT'],
+ 3: ['DEFLECT_MISSILES'],
+ 4: ['SLOW_FALL'],
+ 5: ['EXTRA_ATTACK', 'STUNNING_STRIKE'],
+ 6: ['KI_EMPOWERED_STRIKES'],
+ 7: ['EVASION', 'STILLNESS_OF_MIND'],
+ 10: ['PURITY_OF_BODY'],
+ 13: ['TONGUE_OF_THE_SUN_AND_MOON'],
+ 14: ['DIAMOND_SOUL'],
+ 15: ['TIMELESS_BODY'],
+ 18: ['EMPTY_BODY'],
+ 20: ['PERFECT_SELF']
+ },
+ paladin: {
+ 1: ['DIVINE_SENSE', 'LAY_ON_HANDS'],
+ 2: ['FIGHTING_STYLE', 'DIVINE_SMITE'],
+ 3: ['DIVINE_HEALTH', 'CHANNEL_DIVINITY'],
+ 5: ['EXTRA_ATTACK'],
+ 6: ['AURA_OF_PROTECTION'],
+ 10: ['AURA_OF_COURAGE'],
+ 11: ['IMPROVED_DIVINE_SMITE'],
+ 14: ['CLEANSING_TOUCH']
+ },
+ ranger: {
+ 1: ['FAVORED_ENEMY', 'NATURAL_EXPLORER'],
+ 2: ['FIGHTING_STYLE'],
+ 3: ['PRIMEVAL_AWARENESS'],
+ 5: ['EXTRA_ATTACK'],
+ 8: ['LANDS_STRIDE'],
+ 10: ['HIDE_IN_PLAIN_SIGHT'],
+ 14: ['VANISH'],
+ 18: ['FERAL_SENSES'],
+ 20: ['FOE_SLAYER']
+ },
+ rangerua: {
+ 1: ['FAVORED_ENEMY', 'NATURAL_EXPLORER'],
+ 2: ['FIGHTING_STYLE'],
+ 3: ['PRIMEVAL_AWARENESS'],
+ 6: ['GREATER_FAVORED_ENEMY'],
+ 8: ['FLEET_OF_FOOT'],
+ 10: ['HIDE_IN_PLAIN_SIGHT'],
+ 14: ['VANISH'],
+ 18: ['FERAL_SENSES'],
+ 20: ['FOE_SLAYER']
+ },
+ rogue: {
+ 1: ['EXPERTISE', 'SNEAK_ATTACK', 'THIEVES_CANT'],
+ 2: ['CUNNING_ACTION'],
+ 5: ['UNCANNY_DODGE'],
+ 7: ['EVASION'],
+ 11: ['RELIABLE_TALENT'],
+ 14: ['BLINDSENSE'],
+ 15: ['SLIPPERY_MIND'],
+ 18: ['ELUSIVE'],
+ 20: ['STROKE_OF_LUCK']
+ },
+ sorcerer: {
+ 2: ['SORCERY_POINTS', 'FLEXIBLE_CASTING'],
+ 3: ['METAMAGIC'],
+ 20: ['SORCEROUS_RESTORATION']
+ },
+ warlock: {
+ 2: ['ELDRITCH_INVOCATIONS'],
+ 3: ['PACT_BOON'],
+ 11: ['MYSTIC_ARCANUM'],
+ 20: ['ELDRITCH_MASTER']
+ },
+ wizard: {
+ 1: ['ARCANE_RECOVERY'],
+ 18: ['SPELL_MASTERY'],
+ 20: ['SIGNATURE_SPELLS']
+ }
+}; /* global on:false, getTranslationByKey:false, generateRowID:false */
+
+var setClassFeature = exports.setClassFeature = function setClassFeature(obj) {
+ obj.type = 'classfeature';
+ (0, _features.setFeature)(obj);
+};
+
+var setStandardClassFeature = function setStandardClassFeature(className, name, obj) {
+ var setObj = {
+ content: getTranslationByKey('CLASS_FEATURE_' + className + '_' + name + '_TEXT'),
+ name: getTranslationByKey('CLASS_FEATURE_' + className + '_' + name),
+ storageName: 'CLASS_FEATURE_' + className + '_' + name
+ };
+ if ((0, _utilities.objIsNotEmpty)(obj)) {
+ Object.keys(obj).forEach(function (key) {
+ setObj[key] = obj[key];
+ });
+ }
+ setClassFeature(setObj);
+};
+
+var removeClassFeature = function removeClassFeature(className, name) {
+ (0, _features.removeFeature)('classfeature', 'CLASS_FEATURE_' + className + '_' + name);
+};
+
+var findAndChangeClassFeature = function findAndChangeClassFeature(storageName, change) {
+ (0, _features.findAndChangeFeature)('classfeature', storageName, change);
+};
+
+var handleSpecialClassFeatures = function handleSpecialClassFeatures(data, className, feature) {
+ var obj = void 0;
+ if (className === 'BARBARIAN') {
+ if (feature === 'RAGE') {
+ var rageUses = 2;
+ if (data.barbarian_level >= 20) {
+ rageUses = '';
+ } else if (data.barbarian_level >= 17) {
+ rageUses = 6;
+ } else if (data.barbarian_level >= 12) {
+ rageUses = 5;
+ } else if (data.barbarian_level >= 6) {
+ rageUses = 4;
+ } else if (data.barbarian_level >= 3) {
+ rageUses = 3;
+ }
+
+ var rageDamage = 2;
+ if (data.barbarian_level >= 16) {
+ rageDamage = 4;
+ } else if (data.barbarian_level >= 9) {
+ rageDamage = 3;
+ }
+
+ obj = {
+ content: getTranslationByKey('CLASS_FEATURE_BARBARIAN_RAGE_TEXT').replace('RAGE_DAMAGE', rageDamage),
+ recharge: 'LONG_REST',
+ uses_max: rageUses
+ };
+ } else if (feature === 'UNARMORED_DEFENSE') {
+ var repString = 'repeating_armor_' + generateRowID();
+ data[repString + '_name'] = getTranslationByKey('CLASS_FEATURE_BARBARIAN_UNARMORED_DEFENSE');
+ data[repString + '_ac_base'] = 10;
+ data[repString + '_ac_ability'] = 'DEX';
+ data[repString + '_ac_second_ability'] = 'CON';
+ obj = {
+ updateArmor: true
+ };
+ }
+ } else if (className === 'BARD') {
+ if (feature === 'BARDIC_INSPIRATION') {
+ var die = void 0;
+ if (data.bard_level >= 15) {
+ die = 'd12';
+ } else if (data.bard_level >= 10) {
+ die = 'd10';
+ } else if (data.bard_level >= 5) {
+ die = 'd8';
+ } else {
+ die = 'd6';
+ }
+ findAndChangeClassFeature('BARDIC_INSPIRATION', function (repString) {
+ if ((0, _utilities.isUndefinedOrEmpty)(data[repString + '_content'])) {
+ data[repString + '_content'] = getTranslationByKey('CLASS_FEATURE_BARD_BARDIC_INSPIRATION');
+ }
+ if ((0, _utilities.exists)(data[repString + '_content'])) {
+ data[repString + '_content'] = data[repString + '_content'].replace('d6', die);
+ }
+ if (data.bard_level >= 5) {
+ data[repString + '_recharge'] = 'SHORT_OR_LONG_REST';
+ } else {
+ data[repString + '_recharge'] = 'LONG_REST';
+ }
+ data[repString + '_uses_max'] = Math.max((0, _abilities.getAbilityMod)(data, 'charisma'), 1);
+ });
+ obj = {
+ recharge: 'LONG_REST',
+ uses_max: Math.max((0, _abilities.getAbilityMod)(data, 'charisma'), 1)
+ };
+ }if (feature === 'SONG_OF_REST') {
+ var healDie = void 0;
+ if (data.bard_level >= 17) {
+ healDie = 'd12';
+ } else if (data.bard_level >= 13) {
+ healDie = 'd10';
+ } else if (data.bard_level >= 9) {
+ healDie = 'd8';
+ } else {
+ healDie = 'd6';
+ }
+ if (healDie) {
+ findAndChangeClassFeature('SONG_OF_REST', function (repString) {
+ data[repString + '_heal_die'] = healDie;
+ });
+ }
+ obj = {
+ heal_dice: 1,
+ heal_die: 'd6'
+ };
+ }
+ } else if (className === 'CLERIC') {
+ if (feature === 'CHANNEL_DIVINITY') {
+ var channelDivinityUses = 1;
+ if (data.cleric_level >= 18) {
+ channelDivinityUses = 3;
+ } else if (data.cleric_level >= 6) {
+ channelDivinityUses = 2;
+ }
+ obj = {
+ recharge: 'SHORT_OR_LONG_REST',
+ uses_max: channelDivinityUses
+ };
+ } else if (feature === 'CHANNEL_DIVINITY_TURN_UNDEAD') {
+ var turnUndeadText = getTranslationByKey('CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT');
+ if (data.cleric_level >= 5) {
+ var turnUndeadDestroyCR = void 0;
+ if (data.cleric_level >= 17) {
+ turnUndeadDestroyCR = '4';
+ } else if (data.cleric_level >= 14) {
+ turnUndeadDestroyCR = '3';
+ } else if (data.cleric_level >= 11) {
+ turnUndeadDestroyCR = '2';
+ } else if (data.cleric_level >= 8) {
+ turnUndeadDestroyCR = '1';
+ } else {
+ turnUndeadDestroyCR = '1/2';
+ }
+ turnUndeadText += '\n' + getTranslationByKey('CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2').replace('CHALLENGE_RATING', turnUndeadDestroyCR);
+ }
+ obj = {
+ content: turnUndeadText,
+ saving_throw_ability: 'WIS',
+ saving_throw_vs_ability: 'WISDOM'
+ };
+ } else if (feature === 'DIVINE_INTERVENTION') {
+ obj = {
+ freeform: '{{text_top=[[d100]] > [[@{cleric_level}]]}}',
+ uses_max: 1
+ };
+ }
+ } else if (className === 'DRUID' && feature === 'WILD_SHAPE') {
+ var wildShapeHours = Math.floor(data.druid_level / 2);
+ var wildShapeUses = 2;
+ var wildShapeCR = '1/4';
+ var wildShapeLimitations = getTranslationByKey('CLASS_FEATURE_WILD_SHAPE_NO_FLYING_OR_SWIMMING');
+
+ if (data.druid_level >= 4) {
+ wildShapeCR = '1/2';
+ wildShapeLimitations = getTranslationByKey('CLASS_FEATURE_WILD_SHAPE_NO_FLYING');
+ } else if (data.druid_level >= 8) {
+ wildShapeCR = 1;
+ wildShapeLimitations = '';
+ } else if (data.druid_level >= 20) {
+ wildShapeUses = '';
+ }
+ obj = {
+ content: getTranslationByKey('CLASS_FEATURE_DRUID_WILD_SHAPE_TEXT').replace('WILD_SHAPE_HOURS', wildShapeHours).replace('CHALLENGE_RATING', wildShapeCR).replace('LIMITATIONS', ' ' + wildShapeLimitations),
+ recharge: 'SHORT_OR_LONG_REST',
+ uses_max: wildShapeUses
+ };
+ } else if (className === 'FIGHTER') {
+ if (feature === 'SECOND_WIND') {
+ obj = {
+ heal_bonus: '@{fighter_level}',
+ heal_dice: 1,
+ heal_die: 'd10',
+ recharge: 'SHORT_OR_LONG_REST',
+ uses_max: 1
+ };
+ } else if (feature === 'ACTION_SURGE') {
+ var actionSurgeUses = 1;
+ if (data.fighter_level >= 17) {
+ actionSurgeUses = 2;
+ }
+ obj = {
+ recharge: 'SHORT_OR_LONG_REST',
+ uses_max: actionSurgeUses
+ };
+ } else if (feature === 'INDOMITABLE') {
+ var indomitableUses = 1;
+ if (data.fighter_level >= 17) {
+ indomitableUses = 3;
+ } else if (data.fighter_level >= 13) {
+ indomitableUses = 2;
+ }
+ obj = {
+ recharge: 'LONG_REST',
+ uses_max: indomitableUses
+ };
+ } else if (feature === 'EXTRA_ATTACK') {
+ var extraAttackTimes = 'twice';
+ if (data.fighter_level >= 11) {
+ extraAttackTimes = 'three times';
+ } else if (data.fighter_level >= 20) {
+ extraAttackTimes = 'four times';
+ }
+ obj = {
+ content: getTranslationByKey('CLASS_FEATURE_FIGHTER_EXTRA_ATTACK_TEXT').replace('You can attack twice', 'You can attack ' + extraAttackTimes)
+ };
+ }
+ } else if (className === 'MONK') {
+ if (feature === 'UNARMORED_DEFENSE') {
+ var _repString = 'repeating_armor_' + generateRowID();
+ data[_repString + '_name'] = getTranslationByKey('CLASS_FEATURE_MONK_UNARMORED_DEFENSE');
+ data[_repString + '_ac_base'] = 10;
+ data[_repString + '_ac_ability'] = 'DEX';
+ data[_repString + '_ac_second_ability'] = 'WIS';
+ obj = {
+ updateArmor: true
+ };
+ } else if (feature === 'UNARMORED_MOVEMENT') {
+ var unarmoredMovementFeet = void 0;
+ if (data.monk_level >= 18) {
+ unarmoredMovementFeet = 30;
+ } else if (data.monk_level >= 14) {
+ unarmoredMovementFeet = 25;
+ } else if (data.monk_level >= 10) {
+ unarmoredMovementFeet = 20;
+ } else if (data.monk_level >= 6) {
+ unarmoredMovementFeet = 15;
+ } else {
+ unarmoredMovementFeet = 10;
+ }
+ obj = {
+ content: getTranslationByKey('CLASS_FEATURE_MONK_UNARMORED_MOVEMENT_TEXT').replace('UNARMORED_MOVEMENT_FEET', unarmoredMovementFeet)
+ };
+ } else if (feature === 'KI') {
+ obj = {
+ recharge: 'SHORT_OR_LONG_REST',
+ uses_max: data.monk_level
+ };
+ } else if (feature === 'STUNNING_STRIKE') {
+ obj = {
+ saving_throw_ability: 'WIS',
+ saving_throw_vs_ability: 'CONSTITUTION'
+ };
+ } else if (feature === 'DIAMOND_SOUL') {
+ data.death_saving_throw_proficient = 1;
+ }
+ } else if (className === 'PALADIN') {
+ if (feature === 'DIVINE_SENSE') {
+ obj = {
+ recharge: 'LONG_REST',
+ uses_max: Math.max(1 + (0, _abilities.getAbilityMod)(data, 'charisma'), 1)
+ };
+ } else if (feature === 'LAY_ON_HANDS') {
+ obj = {
+ heal_query_toggle: _constants.HEAL_QUERY,
+ per_use: _constants.HEAL_QUERY,
+ recharge: 'LONG_REST',
+ uses_max: 5 * data.paladin_level
+ };
+ } else if (feature === 'DIVINE_SMITE') {
+ obj = {
+ freeform: '{{subheader=(as ?{Spell Level|1|2|3|4|5})}}',
+ other_damage_dice: '(?{Spell Level|1|2|3|4|5, (4)} + 1)',
+ other_damage_die: 'd8',
+ other_damage_type: getTranslationByKey('RADIANT'),
+ other_second_damage_condition: 'PLUS',
+ other_second_damage_dice: 1,
+ other_second_damage_die: 'd8',
+ other_second_damage_type: getTranslationByKey('VS_FIEND_OR_UNDEAD')
+ };
+ } else if (feature === 'CHANNEL_DIVINITY') {
+ obj = {
+ recharge: 'SHORT_OR_LONG_REST',
+ uses_max: 1
+ };
+ } else if (feature === 'AURA_OF_PROTECTION') {
+ var auraRange = 10;
+ if (data.paladin_level >= 18) {
+ auraRange = 30;
+ }
+ obj = {
+ content: getTranslationByKey('CLASS_FEATURE_PALADIN_AURA_OF_PROTECTION_TEXT').replace('AURA_RANGE', auraRange)
+ };
+ } else if (feature === 'AURA_OF_COURAGE') {
+ var _auraRange = 10;
+ if (data.paladin_level >= 18) {
+ _auraRange = 30;
+ }
+ obj = {
+ content: getTranslationByKey('CLASS_FEATURE_PALADIN_AURA_OF_COURAGE_TEXT').replace('AURA_RANGE', _auraRange)
+ };
+ } else if (feature === 'IMPROVED_DIVINE_SMITE') {
+ obj = {
+ other_damage_dice: 1,
+ other_damage_die: 'd8',
+ other_damage_type: 'radiant'
+ };
+ } else if (feature === 'CLEANSING_TOUCH') {
+ obj = {
+ recharge: 'LONG_REST',
+ uses_max: Math.max((0, _abilities.getAbilityMod)(data, 'charisma'), 1)
+ };
+ }
+ } else if (className === 'ROGUE') {
+ if (feature === 'SNEAK_ATTACK') {
+ obj = {
+ other_damage_dice: Math.ceil(parseInt(data.rogue_level || 1, 10) / 2),
+ other_damage_die: 'd6'
+ };
+ } else if (feature === 'STROKE_OF_LUCK') {
+ obj = {
+ recharge: 'SHORT_OR_LONG_REST',
+ uses_max: 1
+ };
+ }
+ } else if (className === 'SORCERER' && feature === 'SORCERY_POINTS') {
+ if (data.sorcerer_level >= 2) {
+ obj = {
+ recharge: 'LONG_REST',
+ uses_max: data.sorcerer_level
+ };
+ }
+ } else if (className === 'WARLOCK') {
+ if (feature === 'ELDRITCH_INVOCATIONS') {
+ var eldritchInvocations = void 0;
+ if (data.warlock_level >= 17) {
+ eldritchInvocations = 8;
+ } else if (data.warlock_level >= 15) {
+ eldritchInvocations = 7;
+ } else if (data.warlock_level >= 12) {
+ eldritchInvocations = 6;
+ } else if (data.warlock_level >= 9) {
+ eldritchInvocations = 5;
+ } else if (data.warlock_level >= 7) {
+ eldritchInvocations = 4;
+ } else if (data.warlock_level >= 5) {
+ eldritchInvocations = 3;
+ } else {
+ eldritchInvocations = 2;
+ }
+ obj = {
+ content: getTranslationByKey('CLASS_FEATURE_WARLOCK_ELDRITCH_INVOCATIONS_TEXT').replace('NUMBER_OF_INVOCATIONS_KNOWN', eldritchInvocations)
+ };
+ } else if (feature === 'ELDRITCH_MASTER') {
+ obj = {
+ recharge: 'LONG_REST'
+ };
+ }
+ } else if (className === 'WIZARD' && feature === 'ARCANE_RECOVERY') {
+ obj = {
+ recharge: 'LONG_REST',
+ uses_max: 1
+ };
+ }
+ return obj;
+};
+
+var handleSpecialClassFeaturesRemove = function handleSpecialClassFeaturesRemove(data, feature) {
+ if (feature === 'DIAMOND_SOUL') {
+ data.death_saving_throw_prof = '';
+ }
+};
+
+var toggleClassFeature = function toggleClassFeature(classToToggle, feature, forceOn) {
+ var updateArmorDuringCallback = false;
+ (0, _server.getSetItems)(classToToggle + ' ' + feature, {
+ collectionArray: ['class_feature_' + classToToggle.toLowerCase() + '_' + feature.toLowerCase() + '_toggle', 'ac_ability'].concat(_constants.CLASSES.map(function (className) {
+ return className + '_level';
+ })).concat(_constants.FIELDS.abilityScores),
+ process: function process(data) {
+ if (forceOn || (0, _utilities.exists)(data['class_feature_' + classToToggle.toLowerCase() + '_' + feature.toLowerCase() + '_toggle'])) {
+ var obj = handleSpecialClassFeatures(data, classToToggle, feature);
+ if (obj && obj.updateArmor) {
+ updateArmorDuringCallback = true;
+ delete obj.updateArmor;
+ }
+ setStandardClassFeature(classToToggle, feature, obj);
+ } else {
+ handleSpecialClassFeaturesRemove(data, feature);
+ removeClassFeature(classToToggle, feature);
+ }
+ },
+ processCallback: function processCallback() {
+ if (updateArmorDuringCallback) {
+ (0, _equipment.updateArmor)();
+ }
+ }
+ });
+};
+
+var turnOnClassFeature = function turnOnClassFeature(data, className, feature) {
+ data['class_feature_' + className.toLowerCase() + '_' + feature.toLowerCase() + '_toggle'] = 1;
+ toggleClassFeature(className, feature, 'on');
+};
+
+var determineClassFeatures = exports.determineClassFeatures = function determineClassFeatures() {
+ (0, _server.getSetItems)('classes.set', {
+ collectionArray: ['class_features_turned_on'].concat(_constants.FIELDS.abilityScores).concat(_constants.CLASSES.map(function (className) {
+ return className + '_level';
+ })).concat(_constants.CLASSES.map(function (className) {
+ return className + '_toggle';
+ })),
+ process: function process(data) {
+ _constants.CLASSES.forEach(function (className) {
+ if ((0, _utilities.exists)(data[className + '_level'])) {
+ data[className + '_level'] = parseInt(data[className + '_level'] || 0, 10);
+ data[className + '_toggle'] = 1;
+ if (className in classFeaturesList) {
+ Object.keys(classFeaturesList[className]).forEach(function (level) {
+ if (data[className + '_level'] >= level) {
+ classFeaturesList[className][level].forEach(function (feature) {
+ if ((0, _utilities.isUndefinedOrEmpty)(data.class_features_turned_on) || data.class_features_turned_on && !data.class_features_turned_on.includes(feature)) {
+ turnOnClassFeature(data, className.toUpperCase(), feature);
+
+ if ((0, _utilities.isUndefinedOrEmpty)(data.class_features_turned_on)) {
+ data.class_features_turned_on = '';
+ }
+ data.class_features_turned_on += ' ' + feature;
+ }
+ });
+ }
+ });
+ }
+ }
+ });
+ }
+ });
+};
+
+var setupClassFeature = exports.setupClassFeature = function setupClassFeature() {
+ _constants.CLASSES.forEach(function (className) {
+ var featuresList = ['METAMAGIC_CAREFUL_SPELL', 'METAMAGIC_DISTANT_SPELL', 'METAMAGIC_EMPOWERED_SPELL', 'METAMAGIC_EXTENDED_SPELL', 'METAMAGIC_HEIGHTENED_SPELL', 'METAMAGIC_QUICKENED_SPELL', 'METAMAGIC_SUBTLE_SPELL', 'METAMAGIC_TWINNED_SPELL'];
+ if (className in classFeaturesList) {
+ Object.keys(classFeaturesList[className]).forEach(function (level) {
+ featuresList = featuresList.concat(classFeaturesList[className][level]);
+ });
+ featuresList.forEach(function (feature) {
+ on('change:class_feature_' + className + '_' + feature.toLowerCase() + '_toggle', function () {
+ toggleClassFeature(className.toUpperCase(), feature);
+ });
+ });
+ }
+ });
+
+ on('change:class_feature_barbarian_brutal_critical_toggle', function () {
+ (0, _actions.updateAllActionsWithAttack)();
+ });
+};
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupResistances = exports.updateDamageResistances = undefined;
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+/* global on:false */
+
+var updateDamageResistances = exports.updateDamageResistances = function updateDamageResistances() {
+ (0, _server.getSetItems)('resistances.updateDamageResistances', {
+ collectionArray: ['damage_resistances_var', 'damage_vulnerabilities', 'damage_resistances', 'damage_immunities', 'condition_immunities'],
+ process: function process(data) {
+ var resistancesVar = [];
+
+ if ((0, _utilities.exists)(data.damage_vulnerabilities)) {
+ data.damage_vulnerabilities = (0, _utilities.lowercaseDamageTypes)(data.damage_vulnerabilities);
+ resistancesVar.push('{{Damage Vulnerabilities=@{damage_vulnerabilities}}}');
+ }
+ if ((0, _utilities.exists)(data.damage_resistances)) {
+ data.damage_resistances = (0, _utilities.lowercaseDamageTypes)(data.damage_resistances);
+ resistancesVar.push('{{Damage Resistances=@{damage_resistances}}}');
+ }
+ if ((0, _utilities.exists)(data.damage_immunities)) {
+ data.damage_immunities = (0, _utilities.lowercaseDamageTypes)(data.damage_immunities);
+ resistancesVar.push('{{Damage Immunities=@{damage_immunities}}}');
+ }
+ if ((0, _utilities.exists)(data.condition_immunities)) {
+ data.condition_immunities = (0, _utilities.lowercaseDamageTypes)(data.condition_immunities);
+ resistancesVar.push('{{Condition Immunities=@{condition_immunities}}}');
+ }
+ data.damage_resistances_var = resistancesVar.join(' ');
+ }
+ });
+};
+
+var setupResistances = exports.setupResistances = function setupResistances() {
+ on('change:damage_vulnerabilities change:damage_resistances change:damage_immunities change:condition_immunities', function () {
+ updateDamageResistances();
+ });
+};
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupSenses = exports.updateSenses = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _distance = __webpack_require__(9);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+/* global on:false, getTranslationByKey:false */
+
+var updateSenses = exports.updateSenses = function updateSenses() {
+ (0, _server.getSetItems)('senses.update', {
+ collectionArray: ['blindsight_blind_beyond', 'senses', 'senses_string', 'distance_system'].concat(_constants.SENSES),
+ process: function process(data) {
+ var senses = [];
+
+ if (!(0, _utilities.isUndefinedOrEmpty)(data.blindsight)) {
+ (0, _distance.convertDistance)(data, 'blindsight');
+ senses.push(getTranslationByKey('BLINDSIGHT').toLowerCase() + ' ' + data.blindsight + ((0, _utilities.exists)(data.blindsight_blind_beyond) ? ' (' + getTranslationByKey('BLIND_BEYOND').toLowerCase() + ')' : ''));
+ }
+ if (!(0, _utilities.isUndefinedOrEmpty)(data.darkvision)) {
+ (0, _distance.convertDistance)(data, 'darkvision');
+ senses.push(getTranslationByKey('DARKVISION').toLowerCase() + ' ' + data.darkvision);
+ }
+ if (!(0, _utilities.isUndefinedOrEmpty)(data.tremorsense)) {
+ (0, _distance.convertDistance)(data, 'tremorsense');
+ senses.push(getTranslationByKey('TREMORSENSE').toLowerCase() + ' ' + data.tremorsense);
+ }
+ if (!(0, _utilities.isUndefinedOrEmpty)(data.truesight)) {
+ (0, _distance.convertDistance)(data, 'truesight');
+ senses.push(getTranslationByKey('TRUESIGHT').toLowerCase() + ' ' + data.truesight);
+ }
+ data.senses_string = senses.join(', ');
+ }
+ });
+};
+
+var setupSenses = exports.setupSenses = function setupSenses() {
+ var sensesMap = _constants.SENSES.concat(['blindsight_blind_beyond', 'distance_system']).map(function (sense) {
+ return 'change:' + sense;
+ }).join(' ');
+ on(sensesMap, function () {
+ updateSenses();
+ });
+};
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupSpeeds = exports.updateSpeeds = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _distance = __webpack_require__(9);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+/* global on:false, getTranslationByKey:false */
+
+var updateSpeeds = exports.updateSpeeds = function updateSpeeds() {
+ (0, _server.getSetItems)('speed.update', {
+ collectionArray: ['speed_fly_hover', 'speed_string', 'distance_system'].concat(_constants.SPEEDS),
+ process: function process(data) {
+ var speed = [];
+
+ if (!(0, _utilities.isUndefinedOrEmpty)(data.speed)) {
+ (0, _distance.convertDistance)(data, 'speed');
+ speed.push(data.speed);
+ }
+ if (!(0, _utilities.isUndefinedOrEmpty)(data.speed_burrow)) {
+ (0, _distance.convertDistance)(data, 'speed_burrow');
+ speed.push(getTranslationByKey('BURROW').toLowerCase() + ' ' + data.speed_burrow);
+ }
+ if (!(0, _utilities.isUndefinedOrEmpty)(data.speed_climb)) {
+ (0, _distance.convertDistance)(data, 'speed_climb');
+ speed.push(getTranslationByKey('CLIMB').toLowerCase() + ' ' + data.speed_climb);
+ }
+ if (!(0, _utilities.isUndefinedOrEmpty)(data.speed_fly)) {
+ (0, _distance.convertDistance)(data, 'speed_fly');
+ speed.push(getTranslationByKey('FLY').toLowerCase() + ' ' + data.speed_fly + ((0, _utilities.exists)(data.speed_fly_hover) ? ' (' + getTranslationByKey('HOVER').toLowerCase() + ')' : ''));
+ }
+ if (!(0, _utilities.isUndefinedOrEmpty)(data.speed_swim)) {
+ (0, _distance.convertDistance)(data, 'speed_swim');
+ speed.push(getTranslationByKey('SWIM').toLowerCase() + ' ' + data.speed_swim);
+ }
+ data.speed_string = speed.join(', ');
+ }
+ });
+};
+
+var setupSpeeds = exports.setupSpeeds = function setupSpeeds() {
+ var speedsMap = _constants.SPEEDS.concat(['speed_fly_hover', 'distance_system']).map(function (speed) {
+ return 'change:' + speed;
+ }).join(' ');
+ on(speedsMap, function () {
+ updateSpeeds();
+ });
+};
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupModifiers = exports.updateModifiers = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilities = __webpack_require__(3);
+
+var _abilityChecks = __webpack_require__(6);
+
+var _actions = __webpack_require__(4);
+
+var _armorClass = __webpack_require__(18);
+
+var _savingThrows = __webpack_require__(8);
+
+var _server = __webpack_require__(1);
+
+var _spells = __webpack_require__(5);
+
+var _utilities = __webpack_require__(0);
+
+var addToModifierTotal = function addToModifierTotal(data, repString, prefix) {
+ if ((0, _utilities.exists)(data[repString + '_' + prefix + '_modifier_dice']) && (0, _utilities.exists)(data[repString + '_' + prefix + '_modifier_die'])) {
+ if ((0, _utilities.exists)(data[prefix + '_modifier_dice'])) {
+ data[prefix + '_modifier_dice'] += ' + ';
+ } else {
+ data[prefix + '_modifier_dice'] = '';
+ }
+ data[prefix + '_modifier_dice'] += data[repString + '_' + prefix + '_modifier_dice'];
+ data[prefix + '_modifier_dice'] += data[repString + '_' + prefix + '_modifier_die'];
+ data[prefix + '_modifier_dice'] += 'cf0cs0';
+ if ((0, _utilities.exists)(data.show_dice_modifiers) && (0, _utilities.exists)(data[repString + '_' + prefix + '_modifier_dice_modifier'])) {
+ data[prefix + '_modifier_dice'] += data[repString + '_' + prefix + '_modifier_dice_modifier'];
+ }
+ }
+ if ((0, _utilities.exists)(data[repString + '_' + prefix + '_modifier_ability']) || (0, _utilities.exists)(data[repString + '_' + prefix + '_modifier'])) {
+ data[prefix + '_modifier'] = parseInt(data[prefix + '_modifier'] || 0, 10);
+ if ((0, _utilities.exists)(data[repString + '_' + prefix + '_modifier_ability'])) {
+ data[prefix + '_modifier'] += (0, _abilities.getAbilityMod)(data, data[repString + '_' + prefix + '_modifier_ability']);
+ }
+ if ((0, _utilities.exists)(data[repString + '_' + prefix + '_modifier'])) {
+ if (!isNaN(data[repString + '_' + prefix + '_modifier'])) {
+ data[prefix + '_modifier'] += parseInt(data[repString + '_' + prefix + '_modifier'] || 0, 10);
+ } else {
+ if ((0, _utilities.exists)(data[prefix + '_modifier_dice'])) {
+ data[prefix + '_modifier_dice'] += ' + ';
+ } else {
+ data[prefix + '_modifier_dice'] = '';
+ }
+ data[prefix + '_modifier_dice'] += data[repString + '_' + prefix + '_modifier'];
+ }
+ }
+ }
+}; /* global on:false */
+
+var updateModifiers = exports.updateModifiers = function updateModifiers() {
+ var updatedSections = [];
+ var updatedFields = [];
+ var categoriesToAdd = [{
+ fields: ['ability_score'],
+ name: 'ability_score'
+ }, {
+ fields: ['ability_check', 'initiative'],
+ name: 'ability_check'
+ }, {
+ fields: ['attack', 'weapon_attack', 'melee_weapon_attack', 'ranged_weapon_attack', 'spell_attack'],
+ name: 'attack'
+ }, {
+ fields: ['damage', 'weapon_damage', 'melee_weapon_damage', 'ranged_weapon_damage', 'spell_damage'],
+ name: 'damage'
+ }, {
+ fields: ['spell_dc', 'spell_heal'],
+ name: 'spell'
+ }, {
+ fields: ['ac'],
+ name: 'ac'
+ }, {
+ fields: ['saving_throw'],
+ name: 'saving_throw'
+ }];
+ _constants.ABILITIES.forEach(function (ability) {
+ categoriesToAdd[0].fields.push(ability + '_score');
+ categoriesToAdd[1].fields.push(ability + '_check');
+ });
+ for (var i = 0; i <= 23; i += 1) {
+ categoriesToAdd[1].fields.push('skill_' + i);
+ categoriesToAdd[1].fields.push('skill_' + i + '_passive');
+ }
+ _constants.SAVING_THROWS.concat(_constants.CUSTOM_SAVING_THROWS).forEach(function (savingThrow) {
+ categoriesToAdd[6].fields.push(savingThrow + '_saving_throw');
+ });
+ var fieldsToAdd = [];
+ categoriesToAdd.forEach(function (category) {
+ category.fields.forEach(function (field) {
+ fieldsToAdd.push(field);
+ });
+ });
+ (0, _server.getSetItems)('modifiers.update', {
+ collectionArray: ['show_dice_modifiers'].concat(_constants.ABILITIES).concat(fieldsToAdd.map(function (field) {
+ return field + '_modifier';
+ })).concat(fieldsToAdd.map(function (field) {
+ return field + '_modifier_dice';
+ })),
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['active', 'type'].concat(categoriesToAdd.map(function (category) {
+ return category.name + '_toggle';
+ })).concat(fieldsToAdd.map(function (field) {
+ return field + '_modifier_dice';
+ })).concat(fieldsToAdd.map(function (field) {
+ return field + '_modifier_die';
+ })).concat(fieldsToAdd.map(function (field) {
+ return field + '_modifier_dice_modifier';
+ })).concat(fieldsToAdd.map(function (field) {
+ return field + '_modifier_ability';
+ })).concat(fieldsToAdd.map(function (field) {
+ return field + '_modifier';
+ })).concat(fieldsToAdd.map(function (field) {
+ return '' + field;
+ })).concat(_constants.REPEATING_FIELDS.default),
+ name: 'repeating_modifier'
+ }],
+ process: function process(data, repStrings) {
+ var originalValues = {};
+ fieldsToAdd.forEach(function (field) {
+ originalValues[field + '_modifier'] = data[field + '_modifier'];
+ originalValues[field + '_modifier_dice'] = data[field + '_modifier_dice'];
+ if ((0, _utilities.exists)(data[field + '_modifier'])) {
+ data[field + '_modifier'] = 0;
+ }
+ if ((0, _utilities.exists)(data[field + '_modifier_dice'])) {
+ data[field + '_modifier_dice'] = '';
+ }
+ });
+ repStrings.forEach(function (repString) {
+ if ((0, _utilities.exists)(data[repString + '_active']) || (0, _utilities.isUndefined)(data[repString + '_active'])) {
+ categoriesToAdd.forEach(function (category) {
+ if ((0, _utilities.exists)(data[repString + '_' + category.name + '_toggle']) || (0, _utilities.isUndefined)(data[repString + '_' + category.name + '_toggle'])) {
+ category.fields.forEach(function (field) {
+ addToModifierTotal(data, repString, field);
+ });
+ }
+ });
+ }
+ });
+
+ fieldsToAdd.forEach(function (field) {
+ if (data[field + '_modifier'] !== originalValues[field + '_modifier'] || data[field + '_modifier_dice'] !== originalValues[field + '_modifier_dice']) {
+ updatedFields.push(field);
+ updatedSections.push(categoriesToAdd.find(function (category) {
+ return category.fields.includes(field);
+ }).name);
+ }
+ });
+ },
+ processCallback: function processCallback() {
+ if (updatedSections.includes('ability_score')) {
+ (0, _abilities.updateAbilitiesWithServer)();
+ } else {
+ if (updatedSections.includes('ability_check')) {
+ (0, _abilityChecks.updateAbilityChecks)();
+ (0, _abilityChecks.updateSkill)();
+ }
+ if (updatedFields.includes('attack') || updatedFields.includes('weapon_attack') || updatedFields.includes('melee_weapon_attack') || updatedFields.includes('ranged_weapon_attack') || updatedFields.includes('damage') || updatedFields.includes('weapon_damage') || updatedFields.includes('melee_weapon_damage') || updatedFields.includes('ranged_weapon_damage')) {
+ (0, _actions.updateAllActionsWithAttack)();
+ // updateProvidedAttacks();
+ }
+ if (updatedFields.includes('attack') || updatedFields.includes('spell_attack') || updatedFields.includes('damage') || updatedFields.includes('spell_damage') || updatedFields.includes('spell_dc') || updatedFields.includes('spell_heal')) {
+ (0, _spells.updateSpells)();
+ (0, _spells.updateDCAndAttack)();
+ }
+ if (updatedSections.includes('ac')) {
+ (0, _armorClass.updateArmorClass)();
+ }
+ if (updatedSections.includes('saving_throw')) {
+ (0, _savingThrows.updateAllSavingThrows)();
+ }
+ }
+ }
+ });
+};
+
+var setupModifiers = exports.setupModifiers = function setupModifiers() {
+ on('change:repeating_modifier', function (eventInfo) {
+ var repeatingInfo = (0, _utilities.getRepeatingInfo)('repeating_modifier', eventInfo);
+ if (repeatingInfo && repeatingInfo.field !== 'toggle_details') {
+ updateModifiers();
+ }
+ });
+ on('remove:repeating_modifier', function () {
+ updateModifiers();
+ });
+};
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupSettings = exports.updateWeightSystem = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilities = __webpack_require__(3);
+
+var _abilityChecks = __webpack_require__(6);
+
+var _actions = __webpack_require__(4);
+
+var _savingThrows = __webpack_require__(8);
+
+var _server = __webpack_require__(1);
+
+var _spells = __webpack_require__(5);
+
+var _utilities = __webpack_require__(0);
+
+/* global on:false */
+
+var updateShapedD20 = function updateShapedD20() {
+ (0, _server.getSetItems)('settings.updateShapedD20', {
+ collectionArray: ['roll_setting'].concat(_constants.FIELDS.d20),
+ process: function process(data) {
+ if (data.shaped_d20 === '1d20') {
+ data.roll_setting = 'roll2';
+ (0, _abilities.updateAbilitiesWithServer)();
+ (0, _abilityChecks.updateAbilityChecks)();
+ (0, _abilityChecks.updateSkill)();
+ (0, _abilityChecks.updateAbilityChecksMacro)();
+ (0, _savingThrows.updateAllSavingThrows)();
+ (0, _actions.updateAllActionsWithAttack)();
+ (0, _spells.updateSpells)();
+ (0, _spells.updateDCAndAttack)();
+ } else if (data.roll_setting === 'roll2') {
+ data.roll_setting = 'ignore';
+ (0, _abilities.updateAbilitiesWithServer)();
+ (0, _abilityChecks.updateAbilityChecks)();
+ (0, _abilityChecks.updateSkill)();
+ (0, _abilityChecks.updateAbilityChecksMacro)();
+ (0, _savingThrows.updateAllSavingThrows)();
+ (0, _actions.updateAllActionsWithAttack)();
+ (0, _spells.updateSpells)();
+ (0, _spells.updateDCAndAttack)();
+ }
+ }
+ });
+};
+
+var updateDiceSystem = function updateDiceSystem() {
+ (0, _server.getSetItems)('settings.updateDiceSystem', {
+ collectionArray: ['dice_system'],
+ process: function process(data) {
+ data.shaped_d20 = data.dice_system;
+ }
+ });
+};
+
+var updateWeightSystem = exports.updateWeightSystem = function updateWeightSystem() {
+ (0, _server.getSetItems)('settings.updateWeightSystem', {
+ collectionArray: ['weight_system', 'weight_per_coin', 'carrying_capacity_multiplier', 'max_push_drag_lift_multiplier', 'encumbered_multiplier', 'heavily_encumbered_multiplier'],
+ process: function process(data) {
+ if (data.weight_system === 'POUNDS') {
+ data.weight_per_coin = 0.02;
+ data.carrying_capacity_multiplier = 15;
+ data.max_push_drag_lift_multiplier = 30;
+ data.encumbered_multiplier = 5;
+ data.heavily_encumbered_multiplier = 10;
+ } else if (data.weight_system === 'KILOGRAMS') {
+ data.weight_per_coin = 0.009;
+ data.carrying_capacity_multiplier = 7;
+ data.max_push_drag_lift_multiplier = 14;
+ data.encumbered_multiplier = 2.5;
+ data.heavily_encumbered_multiplier = 5;
+ }
+ }
+ });
+};
+
+var updatePreparedMatters = function updatePreparedMatters() {
+ (0, _server.getSetItems)('settings.updatePreparedMatters', {
+ collectionArray: ['prepared_matters', 'prepared_matters_var'],
+ process: function process(data) {
+ if ((0, _utilities.exists)(data.prepared_matters)) {
+ data.prepared_matters_var = true;
+ } else {
+ data.prepared_matters_var = '';
+ }
+ }
+ });
+};
+
+var setupSettings = exports.setupSettings = function setupSettings() {
+ on('change:shaped_d20', function () {
+ updateShapedD20();
+ });
+ on('change:dice_system', function () {
+ updateDiceSystem();
+ });
+ on('change:weight_system', function () {
+ updateWeightSystem();
+ });
+ on('change:prepared_matters', function () {
+ updatePreparedMatters();
+ });
+ on('change:attacks_vs_target_ac change:attacks_vs_target_name change:critical_damage_houserule change:automatically_roll_damage_for_attacks', function () {
+ (0, _actions.updateAllActionsWithAttack)();
+ (0, _spells.updateSpells)();
+ });
+ on('change:automatically_roll_damage_for_saving_throws', function () {
+ (0, _actions.updateAllActions)();
+ (0, _spells.updateSpells)();
+ });
+};
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _abilities = __webpack_require__(3);
+
+var _abilityChecks = __webpack_require__(6);
+
+var _actions = __webpack_require__(4);
+
+var _armorClass = __webpack_require__(18);
+
+var _attachers = __webpack_require__(28);
+
+var _classes = __webpack_require__(20);
+
+var _classFeatures = __webpack_require__(21);
+
+var _conditions = __webpack_require__(30);
+
+var _equipment = __webpack_require__(10);
+
+var _hitDice = __webpack_require__(11);
+
+var _hitPoints = __webpack_require__(31);
+
+var _initialize = __webpack_require__(32);
+
+var _modifiers = __webpack_require__(25);
+
+var _npc = __webpack_require__(14);
+
+var _processing = __webpack_require__(7);
+
+var _proficiencyBonus = __webpack_require__(19);
+
+var _RacialTraits = __webpack_require__(36);
+
+var _resistances = __webpack_require__(22);
+
+var _rest = __webpack_require__(37);
+
+var _savingThrows = __webpack_require__(8);
+
+var _senses = __webpack_require__(23);
+
+var _settings = __webpack_require__(26);
+
+var _speeds = __webpack_require__(24);
+
+var _spells = __webpack_require__(5);
+
+var _ImportData = __webpack_require__(38);
+
+var _compendiumDrop = __webpack_require__(39);
+
+(0, _abilities.setupAbilities)();
+(0, _abilityChecks.setupAbilityChecks)();
+(0, _actions.setupActions)();
+(0, _armorClass.setupArmorClass)();
+(0, _attachers.setupAttachers)();
+(0, _classes.setupClasses)();
+(0, _classFeatures.setupClassFeature)();
+(0, _conditions.setupConditions)();
+(0, _equipment.setupEquipment)();
+(0, _hitDice.setupHitDice)();
+(0, _hitPoints.setupHitPoints)();
+(0, _initialize.setupInitialize)();
+(0, _modifiers.setupModifiers)();
+(0, _npc.setupNPC)();
+(0, _processing.setupProcessing)();
+(0, _proficiencyBonus.setupProficiencyBonus)();
+(0, _RacialTraits.setupRacialTraits)();
+(0, _resistances.setupResistances)();
+(0, _rest.setupRests)();
+(0, _savingThrows.setupSavingThrows)();
+(0, _senses.setupSenses)();
+(0, _settings.setupSettings)();
+(0, _speeds.setupSpeeds)();
+(0, _spells.setupSpells)();
+(0, _ImportData.setupImportData)();
+(0, _compendiumDrop.listenForCompendiumDrop)();
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupAttachers = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+var updateAttachers = function updateAttachers() {
+ var collectionArray = ['initiative', 'death_saving_throw', 'hit_dice', 'offense', 'utility', 'spell', 'skill', 'crit'].concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_check';
+ })).concat(_constants.ABILITIES.map(function (ability) {
+ return ability + '_saving_throw';
+ })).concat(_constants.CUSTOM_SAVING_THROWS.map(function (customSavingThrow) {
+ return customSavingThrow + '_saving_throw';
+ }));
+
+ for (var level = 0; level <= 9; level += 1) {
+ collectionArray.push('spell_level_' + level);
+ }
+
+ (0, _server.getSetItems)('attachers.update', {
+ collectionArray: collectionArray.map(function (attacher) {
+ return 'attacher_' + attacher;
+ }),
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['name', 'freetext', 'freeform'].concat(collectionArray.map(function (attacher) {
+ return attacher + '_attacher';
+ })),
+ name: 'repeating_attacher'
+ }],
+ process: function process(data, repStrings) {
+ collectionArray.forEach(function (itemToPush) {
+ data['attacher_' + itemToPush] = '';
+ });
+ repStrings.forEach(function (repString) {
+ collectionArray.forEach(function (itemToPush) {
+ var attacher = data[repString + '_' + itemToPush + '_attacher'];
+ if ((0, _utilities.exists)(attacher) && attacher === 'on') {
+ var attacherName = data[repString + '_name'] || '';
+
+ var freeText = data[repString + '_freetext'];
+ if ((0, _utilities.exists)(attacherName) && (0, _utilities.exists)(freeText)) {
+ var critAttacher = data[repString + '_crit_attacher'];
+ if (critAttacher === 'on') {
+ data['attacher_' + itemToPush] += '{{crit_name=' + attacherName + '}} ';
+ data['attacher_' + itemToPush] += '{{crit_text=' + freeText + '}} ';
+ } else {
+ data['attacher_' + itemToPush] += '{{' + attacherName + '=' + freeText + '}} ';
+ }
+ }
+ var freeForm = data[repString + '_freeform'];
+ if ((0, _utilities.exists)(freeForm)) {
+ data['attacher_' + itemToPush] += freeForm + ' ';
+ }
+ }
+ });
+ });
+ }
+ });
+}; /* global on:false */
+
+var setupAttachers = exports.setupAttachers = function setupAttachers() {
+ on('change:repeating_attacher remove:repeating_attacher', function () {
+ updateAttachers();
+ });
+};
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.findAndChangeFeature = exports.removeFeature = exports.setFeature = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _actions = __webpack_require__(4);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+/* global generateRowID:false, removeRepeatingRow:false */
+
+var setFeature = exports.setFeature = function setFeature(obj) {
+ if (!obj.name) {
+ obj.name = obj.storageName;
+ }
+ var itemId = void 0;
+
+ (0, _server.getSetItems)('features.set', {
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['storage_name', 'name', 'per_use', 'uses', 'content', 'saving_throw_toggle', 'damage_toggle', 'heal_toggle'].concat(Object.keys(obj)),
+ name: 'repeating_' + obj.type
+ }],
+ process: function process(data, repStrings) {
+ repStrings.forEach(function (repString) {
+ if (data[repString + '_storage_name'] === obj.storageName) {
+ itemId = (0, _utilities.getIdOfRepeatingString)(repString);
+ }
+ });
+ if (!itemId) {
+ itemId = generateRowID();
+ }
+
+ var repString = 'repeating_' + obj.type + '_' + itemId;
+ if (!obj.clear && (0, _utilities.isUndefinedOrEmpty)(data[repString + '_storage_name'])) {
+ data[repString + '_storage_name'] = obj.storageName;
+ }
+ if (!obj.clear && data[repString + '_name'] !== obj.name) {
+ data[repString + '_name'] = obj.name;
+ }
+ delete obj.storageName;
+
+ if (obj.clear) {
+ delete obj.clear;
+ Object.keys(obj).forEach(function (prop) {
+ if (!(0, _utilities.isUndefinedOrEmpty)(data[repString + '_' + prop])) {
+ data[repString + '_' + prop] = obj[prop];
+ }
+ });
+ } else {
+ Object.keys(obj).forEach(function (prop) {
+ if ((prop === 'name' || prop === 'content') && ((0, _utilities.isUndefinedOrEmpty)(data[repString + '_' + prop]) || (0, _utilities.calculatePercentDifference)(data[repString + '_' + prop].length, obj[prop].length) < 10)) {
+ data[repString + '_' + prop] = obj[prop];
+ } else if (data[repString + '_' + prop] !== obj[prop]) {
+ data[repString + '_' + prop] = obj[prop];
+ }
+ });
+ if (obj.saving_throw_ability || obj.saving_throw_vs_ability) {
+ data[repString + '_saving_throw_toggle'] = 1;
+ }
+ if (obj.heal_dice || obj.heal_die || obj.heal_ability || obj.heal_bonus || obj.heal_query_toggle) {
+ data[repString + '_heal_toggle'] = 1;
+ }
+ if (obj.uses_max && !obj.uses && (0, _utilities.isUndefinedOrEmpty)(data[repString + '_uses'])) {
+ data[repString + '_uses'] = obj.uses_max;
+ }
+ if (obj.content && (0, _utilities.getRepeatingSectionOfRepeatingString)(repString) === obj.type && ((0, _utilities.isUndefinedOrEmpty)(data[repString + '_content']) || (0, _utilities.calculatePercentDifference)(data[repString + '_content'].length, obj.content.length) < 10)) {
+ data[repString + '_content'] = obj.content;
+ }
+ }
+ },
+ processCallback: function processCallback() {
+ (0, _actions.updateActions)([obj.type], itemId);
+ }
+ });
+};
+
+var removeFeature = exports.removeFeature = function removeFeature(type, storageName) {
+ (0, _server.getSetItems)('features.remove', {
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['storage_name'],
+ name: 'repeating_' + type
+ }],
+ process: function process(data, repStrings) {
+ var repStringToRemove = repStrings.filter(function (repString) {
+ return data[repString + '_storage_name'] === storageName;
+ });
+ if (repStringToRemove) {
+ removeRepeatingRow(repStringToRemove);
+ }
+ }
+ });
+};
+
+var findAndChangeFeature = exports.findAndChangeFeature = function findAndChangeFeature(type, storageName, change) {
+ (0, _server.getSetItems)('features.findAndChange', {
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['storage_name'].concat(_constants.REPEATING_FIELDS.content).concat(_constants.REPEATING_FIELDS.uses),
+ name: 'repeating_' + type
+ }],
+ process: function process(data, repStrings) {
+ var repStringToChange = repStrings.filter(function (repString) {
+ return data[repString + '_storage_name'] === storageName;
+ });
+ if (repStringToChange && change) {
+ change(repStringToChange);
+ }
+ }
+ });
+};
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupConditions = exports.updateConditions = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+var updateConditions = exports.updateConditions = function updateConditions() {
+ (0, _server.getSetItems)('conditions.update', {
+ collectionArray: _constants.CONDITIONS.concat(['exhaustion_level']),
+ process: function process(data) {
+ var conditionsList = [];
+
+ _constants.CONDITIONS.forEach(function (condition) {
+ if ((0, _utilities.exists)(data[condition])) {
+ conditionsList.push(getTranslationByKey(condition.toUpperCase()));
+ }
+ });
+ if ((0, _utilities.exists)(data.exhaustion_level)) {
+ conditionsList.push(getTranslationByKey('EXHAUSTION_LEVEL') + ': ' + data.exhaustion_level);
+ }
+ data.conditions_string = conditionsList.join(', ');
+ }
+ });
+}; /* global on:false, getTranslationByKey:false */
+
+var setupConditions = exports.setupConditions = function setupConditions() {
+ var conditionsMap = _constants.CONDITIONS.concat(['exhaustion_level']).map(function (condition) {
+ return 'change:' + condition;
+ }).join(' ');
+ on(conditionsMap, function () {
+ updateConditions();
+ });
+};
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupHitPoints = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+var resetDeathSavingThrows = function resetDeathSavingThrows(eventinfo) {
+ (0, _server.getSetItems)('hitPoints.resetDeathSavingThrows', {
+ collectionArray: ['hp', 'death_saving_throw_successes', 'death_saving_throw_failures'].concat(_constants.CONDITIONS),
+ process: function process(data) {
+ if (parseInt(data.hp || 0, 10) > 0) {
+ if ((0, _utilities.exists)(data.death_saving_throw_successes) || (0, _utilities.exists)(data.death_saving_throw_failures)) {
+ data.death_saving_throw_successes = 0;
+ data.death_saving_throw_failures = 0;
+ data.sheet_chat_output = '{{' + getTranslationByKey('DEATH_SAVING_THROWS') + ' ' + getTranslationByKey('RESET') + '=}}';
+ }
+ if (parseInt(eventinfo.previousValue, 10) <= 0 && (data.unconscious === '1' || data.unconscious === 1)) {
+ console.log('in if');
+ data.unconscious = 0;
+ }
+ } else {
+ data.unconscious = 1;
+ }
+ }
+ });
+}; /* global on:false, getTranslationByKey:false */
+
+var setupHitPoints = exports.setupHitPoints = function setupHitPoints() {
+ on('change:hp', function (eventinfo) {
+ resetDeathSavingThrows(eventinfo);
+ });
+};
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupInitialize = undefined;
+
+var _abilities = __webpack_require__(3);
+
+var _abilityChecks = __webpack_require__(6);
+
+var _constants = __webpack_require__(2);
+
+var _conversion = __webpack_require__(33);
+
+var _server = __webpack_require__(1);
+
+var _upgrade = __webpack_require__(34);
+
+var _utilities = __webpack_require__(0);
+
+var _package = __webpack_require__(35);
+
+/* global on:false, generateRowID:false, getTranslationByKey:false, removeRepeatingRow:false */
+
+var generateSkills = function generateSkills(replace) {
+ (0, _server.getSetItems)('initialize.generateSkills', {
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['storage_name', 'name', 'ability', 'proficiency', 'skill_d20'],
+ name: 'repeating_skill'
+ }],
+ process: function process(data, repStrings) {
+ var sortedSkills = [];
+ Object.keys(_constants.SKILLS).forEach(function (skill) {
+ sortedSkills.push({
+ ability: _constants.SKILLS[skill],
+ name: skill,
+ translation: getTranslationByKey(skill)
+ });
+ });
+ sortedSkills.sort(function (a, b) {
+ if (a.translation.toLowerCase() < b.translation.toLowerCase()) {
+ return -1;
+ } else if (a.translation.toLowerCase() > b.translation.toLowerCase()) {
+ return 1;
+ }
+ return 0;
+ });
+ if (replace) {
+ repStrings.forEach(function (repString) {
+ var skillFound = sortedSkills.find(function (skill) {
+ return skill.name === data[repString + '_storage_name'];
+ });
+
+ if (skillFound) {
+ if (data[repString + '_proficiency']) {
+ skillFound.proficiency = data[repString + '_proficiency'];
+ }
+ if (data[repString + '_skill_d20']) {
+ skillFound.skillD20 = data[repString + '_skill_d20'];
+ }
+ }
+ removeRepeatingRow(repString);
+ });
+ }
+ sortedSkills.forEach(function (skill) {
+ var skillId = void 0;
+
+ if (replace) {
+ skillId = generateRowID();
+ } else {
+ skillId = (0, _utilities.getSkillIdByStorageName)(data, repStrings, skill.name);
+ if (!skillId) {
+ skillId = generateRowID();
+ }
+ }
+ var repString = 'repeating_skill_' + skillId;
+ data[repString + '_storage_name'] = skill.name;
+ data[repString + '_name'] = getTranslationByKey(skill.name);
+ data[repString + '_ability'] = (0, _abilities.getFormattedAbility)(_constants.SKILLS[skill.name]);
+ if (replace) {
+ if (skill.proficiency) {
+ data[repString + '_proficiency'] = skill.proficiency;
+ }
+ if (skill.skillD20) {
+ data[repString + '_skill_d20'] = skill.skillD20;
+ }
+ }
+ });
+ },
+ processCallback: function processCallback() {
+ (0, _abilityChecks.updateSkill)();
+ }
+ });
+};
+
+var setVersion = function setVersion(data) {
+ if ((0, _utilities.isUndefinedOrEmpty)(data.version) || !data.version || data.version !== _package.version) {
+ data.version = _package.version;
+ data.character_sheet = 'Shaped v' + _package.version;
+ }
+};
+
+var sheetOpened = function sheetOpened() {
+ var _process = void 0;
+ var convertOGL = void 0;
+ (0, _server.getSetItems)('initialize.sheetOpened', {
+ collectionArray: ['version', 'sheet_processing_complete', 'character_sheet', 'npc', 'base_level', 'convertedFromOGL'].concat(_constants.ABILITIES),
+ process: function process(data) {
+ data.sheet_processing_complete = '';
+ convertOGL = (0, _utilities.isUndefinedOrEmpty)(data.character_sheet) && (0, _utilities.isUndefinedOrEmpty)(data.convertedFromOGL) && ((0, _utilities.exists)(data.npc) || (0, _utilities.exists)(data.base_level));
+ if ((0, _utilities.isUndefinedOrEmpty)(data.version) || convertOGL) {
+ _process = convertOGL ? 'ogl_conversion' : 'new_character';
+ data.level = 0;
+ generateSkills();
+ if (convertOGL) {
+ (0, _conversion.convertFromOGL)();
+ }
+ } else {
+ (0, _upgrade.upgradeSheet)(data.version);
+ }
+ setVersion(data);
+ },
+ serverCallCallback: function serverCallCallback() {
+ if ((0, _utilities.exists)(_process)) {
+ (0, _server.getSetItems)('intialize.sheetOpenedComplete', {
+ collectionArray: ['sheet_processing_complete'],
+ process: function process(data) {
+ data.sheet_processing_complete = _process;
+ }
+ });
+ }
+ }
+ });
+};
+
+var setupInitialize = exports.setupInitialize = function setupInitialize() {
+ on('change:generate_skills', function () {
+ generateSkills();
+ });
+ on('change:regenerate_skills', function () {
+ generateSkills('replace');
+ });
+ on('sheet:opened change:sheet_opened', function () {
+ sheetOpened();
+ });
+};
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.convertFromOGL = exports.convertSpells = exports.convertSpellHealing = exports.convertSpellDamage = exports.convertSpellSave = exports.convertSpellAttack = exports.convertSpellHigherLevel = exports.convertSpellDescription = exports.convertSpellDuration = exports.convertSpellComponents = exports.convertSpellRange = exports.convertSpellCastingTime = exports.convertSpellRitual = exports.convertSpellPrepared = exports.convertSpellSchool = exports.convertSpellLevel = exports.convertSpellName = exports.convertNPCSkills = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilities = __webpack_require__(3);
+
+var _npc = __webpack_require__(14);
+
+var _processing = __webpack_require__(7);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+/* global generateRowID:false, removeRepeatingRow:false, getTranslationByKey:false */
+
+var parseSpellcastingAbility = function parseSpellcastingAbility(data) {
+ if (data.spellcasting_ability) {
+ data.spell_ability = (0, _abilities.getFormattedAbility)(data.spellcasting_ability).replace('0*', '').replace('_mod', '').replace('+', '').toUpperCase();
+ }
+};
+
+var parseSizeTypeAlignment = function parseSizeTypeAlignment(data) {
+ if ((0, _utilities.exists)(data.npc_type)) {
+ var match = data.npc_type.match(/(.*?) (.*?), (.*)/i);
+ if (!data.npc_type || !match || !match[1] || !match[2] || !match[3]) {
+ console.error('Character doesn’t have valid type/size/alignment format');
+ return;
+ }
+ data.size = match[1].toUpperCase();
+ data.type = match[2];
+ data.alignment = match[3];
+ }
+};
+
+var parseHD = function parseHD(data) {
+ data.hp_from_srd = data.hp_max + ' (' + data.npc_hpformula + ')';
+};
+
+var parseSavingThrows = function parseSavingThrows(data) {
+ var savingThrowsArray = [];
+
+ _constants.ABILITIES.forEach(function (ability) {
+ var saveValue = data['npc_' + (0, _abilities.getAbilityShortName)(ability).toLowerCase() + '_save'];
+ if ((0, _utilities.exists)(saveValue)) {
+ savingThrowsArray.push((0, _abilities.getAbilityShortName)(ability, true) + ' +' + saveValue);
+ }
+ });
+ if (savingThrowsArray && savingThrowsArray.length > 0) {
+ data.saving_throws_from_srd = savingThrowsArray.join(', ');
+ }
+};
+
+var oglSkillName = function oglSkillName(skill) {
+ return skill.replace('ANIMALHANDLING', 'ANIMAL_HANDLING').replace('SLEIGHTOFHAND', 'SLEIGHT_OF_HAND').toLowerCase();
+};
+
+var convertNPCSkills = exports.convertNPCSkills = function convertNPCSkills(data) {
+ var skills = [];
+ Object.keys(_constants.SKILLS).forEach(function (skill) {
+ var skillValue = data['npc_' + oglSkillName(skill) + '_base'];
+ if ((0, _utilities.exists)(skillValue)) {
+ skills.push(getTranslationByKey(skill) + ' +' + skillValue);
+ }
+ });
+ if (skills && skills.length > 1) {
+ data.skills_from_srd = skills.join(', ');
+ }
+};
+
+var convertJackOfAllTrades = function convertJackOfAllTrades(data) {
+ if ((0, _utilities.exists)(data.jack_of_all_trades)) {
+ data.class_feature_bard_jack_of_all_trades_toggle = 1;
+ data.jack_of_all_trades = '';
+ }
+};
+
+var convertProficienciesAndLanguages = function convertProficienciesAndLanguages(data) {
+ if (data.other_proficiencies_and_languages) {
+ var proficieniesMatch = data.other_proficiencies_and_languages.match(/Proficiencies. (.*)/i);
+ if (proficieniesMatch && proficieniesMatch[1]) {
+ data.proficiencies = proficieniesMatch[1];
+ }
+ var languagesMatch = data.other_proficiencies_and_languages.match(/Languages. (.*)/i);
+ if (languagesMatch && languagesMatch[1]) {
+ data.languages = languagesMatch[1];
+ }
+ }
+};
+
+var convertClass = function convertClass(data) {
+ if (data.class) {
+ var repString = 'repeating_class_' + generateRowID();
+ data[repString + '_name'] = data.class.toLowerCase();
+ data[repString + '_level'] = parseInt(data.base_level || 0, 10);
+
+ for (var i = 1; i <= 3; i += 1) {
+ if (data['multiclass' + i + '_flag']) {
+ repString = 'repeating_class_' + generateRowID();
+ data[repString + '_name'] = data['multiclass' + i].toLowerCase();
+ data[repString + '_level'] = parseInt(data['multiclass' + i + '_lvl'] || 0, 10);
+ }
+ }
+ }
+};
+
+var convertPCSkills = function convertPCSkills(data) {
+ var skillsRepStrings = (0, _utilities.getRepStringsFromData)(data).filter(function (repString) {
+ return repString.includes('repeating_skill');
+ });
+ Object.keys(_constants.SKILLS).forEach(function (skill) {
+ var skillId = (0, _utilities.getSkillIdByStorageName)(data, skillsRepStrings, skill);
+ var repString = 'repeating_skill_' + skillId;
+
+ if (data[oglSkillName(skill) + '_type'] === '2') {
+ data[repString + '_proficiency'] = 'expertise';
+ } else if (data[oglSkillName(skill) + '_prof']) {
+ data[repString + '_proficiency'] = 'proficient';
+ }
+ });
+};
+
+var convertTraits = function convertTraits(data) {
+ var traitsRepStrings = (0, _utilities.getRepStringsFromData)(data).filter(function (repString) {
+ return repString.includes('repeating_npctrait');
+ });
+ traitsRepStrings.forEach(function (repString) {
+ var repStringNew = 'repeating_trait_' + generateRowID();
+ data[repStringNew + '_name'] = data[repString + '_name'].replace('.', '');
+ data[repStringNew + '_content'] = data[repString + '_desc'];
+ removeRepeatingRow(repString);
+ });
+};
+
+var convertActions = function convertActions(data) {
+ var repStrings = (0, _utilities.getRepStringsFromData)(data).filter(function (repString) {
+ return repString.includes('repeating_npcaction') || repString.includes('repeating_npcaction-1') || repString.includes('repeating_npcreaction');
+ });
+
+ repStrings.forEach(function (repString) {
+ var repeatingName = 'action';
+ if (repString.includes('repeating_npcaction-l')) {
+ repeatingName = 'legendaryaction';
+ } else if (repString.includes('repeating_npcreaction')) {
+ repeatingName = 'reaction';
+ }
+
+ var repStringNew = 'repeating_' + repeatingName + '_' + generateRowID();
+
+ if ((0, _utilities.exists)(data[repString + '_name'])) {
+ data[repStringNew + '_name'] = data[repString + '_name'].replace('.', '');
+ data[repStringNew + '_content'] = '';
+ if ((0, _utilities.exists)(data[repString + '_attack_flag']) && data[repString + '_attack_type_display']) {
+ data[repStringNew + '_attack_toggle'] = 1;
+ data[repStringNew + '_content'] += data[repString + '_attack_type_display'] + ' ' + data[repString + '_attack_tohitrange'] + ' Hit: ';
+ }
+ if (data[repString + '_attack_onhit']) {
+ data[repStringNew + '_content'] += '' + data[repString + '_attack_onhit'];
+ if (data[repString + '_description']) {
+ data[repStringNew + '_content'] += ' ' + data[repString + '_description'];
+ }
+ } else if (data[repString + '_description']) {
+ data[repStringNew + '_content'] += '' + data[repString + '_description'];
+ } else if (data[repString + '_desc']) {
+ data[repStringNew + '_content'] += '' + data[repString + '_desc'];
+ }
+ if ((0, _utilities.exists)(data[repStringNew + '_content'])) {
+ data[repStringNew + '_content'] = data[repStringNew + '_content'].replace(/Attack:\s?\+(\d+)/i, 'Attack: +$1 to hit').replace(/Range /, 'range ').replace(/Reach /, 'reach ').trim().replace(/.*(\\n)/, '').trim().replace(/.*(\\n)/, '').trim().replace(/.*(\\n)/, '');
+ }
+ }
+ removeRepeatingRow(repString);
+ });
+};
+
+var convertSpellName = exports.convertSpellName = function convertSpellName(data, repString, repStringNew, nameLevelMatch) {
+ if (nameLevelMatch && nameLevelMatch[1]) {
+ data[repStringNew + '_name'] = nameLevelMatch[1];
+ } else {
+ data[repStringNew + '_name'] = data[repString + '_spellname'] || data[repString + '_spellname_base'];
+ }
+};
+
+var convertSpellLevel = exports.convertSpellLevel = function convertSpellLevel(data, repStringNew, level) {
+ data[repStringNew + '_spell_level'] = (0, _utilities.ordinalSpellLevel)(level);
+};
+
+var convertSpellSchool = exports.convertSpellSchool = function convertSpellSchool(data, repString, repStringNew) {
+ if ((0, _utilities.exists)(data[repString + '_spellschool'])) {
+ data[repStringNew + '_school'] = data[repString + '_spellschool'].toUpperCase();
+ }
+};
+
+var convertSpellPrepared = exports.convertSpellPrepared = function convertSpellPrepared(data, repString, repStringNew) {
+ if ((0, _utilities.exists)(data[repString + '_spellprepared'])) {
+ data[repStringNew + '_is_prepared'] = 'Yes';
+ }
+};
+
+var convertSpellRitual = exports.convertSpellRitual = function convertSpellRitual(data, repString, repStringNew) {
+ if ((0, _utilities.exists)(data[repString + '_spellritual'])) {
+ data[repStringNew + '_ritual'] = 'Yes';
+ }
+};
+
+var convertSpellCastingTime = exports.convertSpellCastingTime = function convertSpellCastingTime(data, repString, repStringNew) {
+ if ((0, _utilities.exists)(data[repString + '_spellcastingtime'])) {
+ data[repStringNew + '_casting_time'] = data[repString + '_spellcastingtime'].toUpperCase().trim().replace(/\s/g, '_');
+ }
+};
+
+var convertSpellRange = exports.convertSpellRange = function convertSpellRange(data, repString, repStringNew) {
+ if ((0, _utilities.exists)(data[repString + '_spellrange'])) {
+ data[repStringNew + '_range'] = data[repString + '_spellrange'];
+ }
+};
+
+var convertSpellComponents = exports.convertSpellComponents = function convertSpellComponents(data, repString, repStringNew) {
+ var components = [];
+ if (data[repString + '_spellcomp_v'] === '{{v=1}}') {
+ components.push('V');
+ }
+ if (data[repString + '_spellcomp_s'] === '{{s=1}}') {
+ components.push('S');
+ }
+ if (data[repString + '_spellcomp_m'] === '{{m=1}}') {
+ components.push('M');
+ }
+ if (components && components.length > 0) {
+ data[repStringNew + '_components'] = 'COMPONENTS_' + components.join('_');
+ }
+ if ((0, _utilities.exists)(data[repString + '_spellcomp_materials'])) {
+ data[repStringNew + '_materials'] = data[repString + '_spellcomp_materials'];
+ }
+};
+
+var convertSpellDuration = exports.convertSpellDuration = function convertSpellDuration(data, repString, repStringNew) {
+ if ((0, _utilities.exists)(data[repString + '_spellduration'])) {
+ var duration = '';
+ if ((0, _utilities.exists)(data[repString + '_spellconcentration'])) {
+ duration += 'CONCENTRATION_';
+ }
+ duration += data[repString + '_spellduration'].toUpperCase().trim().replace(/\s/g, '_');
+ data[repStringNew + '_duration'] = duration;
+ }
+};
+
+var convertSpellDescription = exports.convertSpellDescription = function convertSpellDescription(data, repString, repStringNew) {
+ if ((0, _utilities.exists)(data[repString + '_spelldescription'])) {
+ data[repStringNew + '_content'] = data[repString + '_spelldescription'].trim();
+ data[repStringNew + '_content_toggle'] = 1;
+ }
+};
+
+var convertSpellHigherLevel = exports.convertSpellHigherLevel = function convertSpellHigherLevel(data, repString, repStringNew) {
+ if ((0, _utilities.exists)(data[repString + '_spellathigherlevels'])) {
+ data[repStringNew + '_higher_level'] = data[repString + '_spellathigherlevels'];
+ data[repStringNew + '_higher_level_toggle'] = 1;
+ }
+};
+
+var convertSpellAttack = exports.convertSpellAttack = function convertSpellAttack(data, repString, repStringNew) {
+ if (data[repString + '_spellattack'] === 'Melee' || data[repString + '_spellattack'] === 'Ranged') {
+ data[repStringNew + '_attack_toggle'] = 1;
+ if (data[repString + '_spellattack'] === 'Melee') {
+ data[repStringNew + '_attack_type'] = 'MELEE_SPELL_ATTACK';
+ } else if (data[repString + '_spellattack'] === 'Ranged') {
+ data[repStringNew + '_attack_type'] = 'RANGED_SPELL_ATTACK';
+ }
+ }
+};
+
+var convertSpellSave = exports.convertSpellSave = function convertSpellSave(data, repString, repStringNew) {
+ if ((0, _utilities.exists)(data[repString + '_spellsave'])) {
+ data[repStringNew + '_saving_throw_vs_ability'] = data[repString + '_spellsave'].toUpperCase();
+ data[repStringNew + '_saving_throw_toggle'] = 1;
+ }
+ if ((0, _utilities.exists)(data[repString + '_spellsavesuccess'])) {
+ data[repStringNew + '_saving_throw_success'] = data[repString + '_spellsavesuccess'];
+ data[repStringNew + '_saving_throw_toggle'] = 1;
+ }
+};
+
+var convertSpellDamage = exports.convertSpellDamage = function convertSpellDamage(data, repString, repStringNew) {
+ var prefix = (0, _utilities.getDamagePrefix)(data, repStringNew);
+ if ((0, _utilities.exists)(data[repString + '_spelldamage'])) {
+ data[repStringNew + '_spelldamage'] = data[repString + '_spelldamage'];
+
+ if (data[repString + '_spelldamage'].includes('@{level}')) {
+ data[repStringNew + '_' + prefix + '_damage_dice'] = data[repString + '_spelldamage'].replace(/d\d+/, '');
+ (0, _utilities.parseDiceAndDie)(data, repStringNew, prefix + '_damage', 'spelldamage');
+ } else if (!isNaN(data[repString + '_spelldamage']) || data[repString + '_spelldamage'].includes('@{')) {
+ data[repStringNew + '_' + prefix + '_damage_bonus'] = data[repString + '_spelldamage'];
+ } else {
+ (0, _utilities.parseDiceAndDie)(data, repStringNew, prefix + '_damage', 'spelldamage');
+ }
+ data[repStringNew + '_spelldamage'] = '';
+ }
+ if ((0, _utilities.exists)(data[repString + '_spelldamagetype'])) {
+ data[repStringNew + '_' + prefix + '_damage_type'] = data[repString + '_spelldamagetype'].toLowerCase();
+ }
+
+ if ((0, _utilities.exists)(data[repString + '_spelldamage2'])) {
+ data[repStringNew + '_spelldamage2'] = data[repString + '_spelldamage2'];
+
+ if (data[repString + '_spelldamage2'].includes('@{level}')) {
+ data[repStringNew + '_' + prefix + '_second_damage_dice'] = data[repString + '_spelldamage2'].replace(/d\d+/, '');
+ (0, _utilities.parseDiceAndDie)(data, repStringNew, prefix + '_second_damage', 'spelldamage2');
+ } else if (!isNaN(data[repString + '_spelldamage2']) || data[repString + '_spelldamage2'].includes('@{')) {
+ data[repStringNew + '_' + prefix + '_second_damage_bonus'] = data[repString + '_spelldamage2'];
+ } else {
+ (0, _utilities.parseDiceAndDie)(data, repStringNew, prefix + '_second_damage', 'spelldamage2');
+ }
+ data[repStringNew + '_spelldamage2'] = '';
+ }
+ if ((0, _utilities.exists)(data[repString + '_spelldamagetype2'])) {
+ data[repStringNew + '_' + prefix + '_second_damage_type'] = data[repString + '_spelldamagetype2'].toLowerCase();
+ }
+ if ((0, _utilities.exists)(data[repString + '_spellhldie'])) {
+ data[repStringNew + '_' + prefix + '_higher_level_dice'] = data[repString + '_spellhldie'];
+ }
+};
+
+var convertSpellHealing = exports.convertSpellHealing = function convertSpellHealing(data, repString, repStringNew) {
+ if ((0, _utilities.exists)(data[repString + '_spellhealing'])) {
+ data[repStringNew + '_spellhealing'] = data[repString + '_spellhealing'];
+
+ if (!isNaN(data[repString + '_spellhealing']) || data[repString + '_spellhealing'].includes('@{')) {
+ data[repStringNew + '_heal_bonus'] = data[repString + '_spellhealing'];
+ } else {
+ (0, _utilities.parseDiceAndDie)(data, repStringNew, 'heal', 'spellhealing');
+ }
+ }
+};
+
+var convertSpells = exports.convertSpells = function convertSpells(data) {
+ var spellRepStrings = (0, _utilities.getRepStringsFromData)(data).filter(function (repString) {
+ return repString.includes('repeating_spell-npc') || repString.includes('repeating_spell-cantrip') || repString.includes('repeating_spell-1') || repString.includes('repeating_spell-2') || repString.includes('repeating_spell-3') || repString.includes('repeating_spell-4') || repString.includes('repeating_spell-5') || repString.includes('repeating_spell-6') || repString.includes('repeating_spell-7') || repString.includes('repeating_spell-8') || repString.includes('repeating_spell-9');
+ });
+ var levelFromPreviousField = 0;
+ var _iteratorNormalCompletion = true;
+ var _didIteratorError = false;
+ var _iteratorError = undefined;
+
+ try {
+ for (var _iterator = spellRepStrings[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var repString = _step.value;
+
+ data.show_spells = 1;
+ var level = (0, _utilities.getLevelOfRepeatingString)(repString) || levelFromPreviousField;
+ var nameLevelMatch = void 0;
+ if ((0, _utilities.isUndefinedOrEmpty)(data[repString + '_spellname']) && (0, _utilities.isUndefinedOrEmpty)(data[repString + '_spellname_base'])) {
+ removeRepeatingRow(repString);
+ continue;
+ } else if (data[repString + '_spellname_base']) {
+ if (data[repString + '_spellname_base'].includes('INNATE') || data[repString + '_spellname_base'].includes('CANTRIPS') || data[repString + '_spellname_base'].includes(' LEVEL')) {
+ var levelFromName = parseInt(data[repString + '_spellname_base'] || 0, 10);
+ if (levelFromName) {
+ levelFromPreviousField = levelFromName;
+ }
+ removeRepeatingRow(repString);
+ continue;
+ }
+ nameLevelMatch = data[repString + '_spellname_base'].match(/(.*) \((.*)\)/i);
+ if (nameLevelMatch && nameLevelMatch[2] && nameLevelMatch[2] !== 'Cantrip') {
+ level = parseInt(nameLevelMatch[2].replace('Level ', ''), 10);
+ }
+ }
+
+ var repStringNew = 'repeating_spell' + level + '_' + generateRowID();
+
+ convertSpellName(data, repString, repStringNew, nameLevelMatch);
+ convertSpellLevel(data, repStringNew, level);
+ convertSpellSchool(data, repString, repStringNew);
+ convertSpellPrepared(data, repString, repStringNew);
+ convertSpellRitual(data, repString, repStringNew);
+ convertSpellCastingTime(data, repString, repStringNew);
+ convertSpellRange(data, repString, repStringNew);
+ convertSpellComponents(data, repString, repStringNew);
+ convertSpellDuration(data, repString, repStringNew);
+ convertSpellDescription(data, repString, repStringNew);
+ convertSpellHigherLevel(data, repString, repStringNew);
+ convertSpellAttack(data, repString, repStringNew);
+ convertSpellSave(data, repString, repStringNew);
+ convertSpellDamage(data, repString, repStringNew);
+ convertSpellHealing(data, repString, repStringNew);
+
+ removeRepeatingRow(repString);
+ }
+ } catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+ }
+};
+
+var convertFromOGL = exports.convertFromOGL = function convertFromOGL() {
+ (0, _processing.addToProcessing)('convertFromOGL', function () {
+ var oldToNew = {
+ experience: 'xp',
+ hp_temp: 'temp_HP',
+ npc: 'is_npc',
+ npc_ac: 'AC',
+ npc_actype: 'ac_note',
+ npc_challenge: 'challenge_rating_from_srd',
+ npc_condition_immunities: 'condition_immunities',
+ npc_immunities: 'damage_immunities',
+ npc_languages: 'languages',
+ npc_legendary_actions: 'legendary_action_amount',
+ npc_name: 'character_name',
+ npc_resistances: 'damage_resistances',
+ npc_senses: 'senses_from_srd',
+ npc_speed: 'speed_from_srd',
+ npc_vulnerabilities: 'damage_vulnerabilities'
+ };
+ (0, _server.getSetItems)('conversion.convertFromOGL', {
+ collectionArray: ['npc_type', 'hp_max', 'npc_hpformula', 'jack_of_all_trades', 'other_proficiencies_and_languages', 'spellcasting_ability'].concat(_constants.ABILITIES.map(function (ability) {
+ return 'npc_' + (0, _abilities.getAbilityShortName)(ability).toLowerCase() + '_save';
+ })).concat(Object.keys(_constants.SKILLS).map(function (skill) {
+ return 'npc_' + oglSkillName(skill) + '_base';
+ })).concat(Object.keys(_constants.SKILLS).map(function (skill) {
+ return oglSkillName(skill) + '_prof';
+ })).concat(Object.keys(_constants.SKILLS).map(function (skill) {
+ return oglSkillName(skill) + '_type';
+ })).concat(Object.keys(oldToNew)).concat(['class', 'base_level', 'multiclass1_flag']),
+ collectionArrayRepeatingSections: [{
+ collectionArrayAddItems: ['proficiency'],
+ name: 'repeating_skill'
+ }, {
+ collectionArrayAddItems: ['name', 'desc'],
+ name: 'repeating_npctrait'
+ }, {
+ collectionArrayAddItems: ['name', 'attack_flag', 'attack_type_display', 'attack_tohitrange', 'attack_tohit', 'attack_onhit', 'description'],
+ name: 'repeating_npcaction'
+ }, {
+ collectionArrayAddItems: ['name', 'attack_flag', 'attack_type_display', 'attack_tohitrange', 'attack_tohit', 'attack_onhit', 'description'],
+ name: 'repeating_npcaction-l'
+ }, {
+ collectionArrayAddItems: ['name', 'attack_flag', 'attack_type_display', 'attack_tohitrange', 'attack_tohit', 'attack_onhit', 'desc'],
+ name: 'repeating_npcreaction'
+ }].concat(['npc', 'cantrip'].concat(_constants.SPELL_LEVELS).map(function (spellLevel) {
+ return {
+ collectionArrayAddItems: ['spellname_base', 'spellname', 'spellprepared', 'spellritual', 'spellschool', 'spellcastingtime', 'spellrange', 'spelltarget', 'spellcomp_v', 'spellcomp_s', 'spellcomp_m', 'spellcomp_materials', 'spellconcentration', 'spellduration', 'spelldescription', 'spellathigherlevels', 'spellattack', 'spelldamage', 'spelldamagetype', 'spelldamage2', 'spelldamagetype2', 'spellhealing', 'spellsave', 'spellsavesuccess', 'spellhldie'],
+ name: 'repeating_spell-' + spellLevel
+ };
+ })),
+ process: function process(data) {
+ data.tab = 'character';
+ data.convertedFromOGL = 'true';
+ Object.keys(oldToNew).forEach(function (key) {
+ if (data[key]) {
+ data[oldToNew[key]] = data[key];
+ }
+ });
+ parseSpellcastingAbility(data);
+ parseSizeTypeAlignment(data);
+ parseHD(data);
+ parseSavingThrows(data);
+ convertNPCSkills(data);
+ convertJackOfAllTrades(data);
+ convertProficienciesAndLanguages(data);
+ convertClass(data);
+ convertPCSkills(data);
+ convertTraits(data);
+ convertSpells(data);
+ convertActions(data);
+ },
+ processCallback: function processCallback() {
+ (0, _npc.parseMonsterFromSRDWithServer)();
+ }
+ });
+ });
+};
+
+//
+
+/*
+ NPC Convcersion
+ * weapons like "3 (1d6-1) bludgeoning damage plus 3 (1d6) poison damage" aren't converting both damages
+
+ PC Conversion:
+ * convert "attacks" to repeating attacks
+ * convert "repeating_inventory" to equipment: "itemcount" to "qty", "itemname", "itemweight", "equipped"
+ * convert armorClass to some armor
+
+ */
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.upgradeSheet = exports.spellsForSixteenTwo = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _abilityChecks = __webpack_require__(6);
+
+var _classes = __webpack_require__(20);
+
+var _hitDice = __webpack_require__(11);
+
+var _modifiers = __webpack_require__(25);
+
+var _processing = __webpack_require__(7);
+
+var _server = __webpack_require__(1);
+
+var _settings = __webpack_require__(26);
+
+var _utilities = __webpack_require__(0);
+
+var _spells = __webpack_require__(5);
+
+/*
+const actionsRepStrings = data => getRepStringsFromData(data).filter(repString => repString.includes('repeating_offense') || repString.includes('repeating_utility') || repString.includes('repeating_action') || repString.includes('repeating_reaction') || repString.includes('repeating_legendaryaction') || repString.includes('repeating_lairaction') || repString.includes('repeating_regionaleffect') || repString.includes('repeating_racialtrait') || repString.includes('repeating_classfeature') || repString.includes('repeating_feat') || repString.includes('repeating_trait'));
+const actionsAndSpellsRepStrings = data => getRepStringsFromData(data).filter(repString => repString.includes('repeating_offense') || repString.includes('repeating_utility') || repString.includes('repeating_action') || repString.includes('repeating_reaction') || repString.includes('repeating_legendaryaction') || repString.includes('repeating_lairaction') || repString.includes('repeating_regionaleffect') || repString.includes('repeating_racialtrait') || repString.includes('repeating_classfeature') || repString.includes('repeating_feat') || repString.includes('repeating_trait') || repString.includes('repeating_spell'));
+const spellsRepStrings = data => getRepStringsFromData(data).filter(repString => repString.includes('repeating_spell'));
+const traitsRepStrings = data => getRepStringsFromData(data).filter(repString => repString.includes('repeating_trait'));
+const racialFeaturesRepStrings = data => getRepStringsFromData(data).filter(repString => repString.includes('repeating_racialfeature'));
+const skillsRepStrings = data => getRepStringsFromData(data).filter(repString => repString.includes('repeating_skill'));
+const modifiersRepStrings = data => getRepStringsFromData(data).filter(repString => repString.includes('repeating_modifier'));
+const ammoRepStrings = data => getRepStringsFromData(data).filter(repString => repString.includes('repeating_ammo'));
+const equipmentRepStrings = data => getRepStringsFromData(data).filter(repString => repString.includes('repeating_equipment'));
+const armorRepStrings = data => getRepStringsFromData(data).filter(repString => repString.includes('repeating_armor'));
+*/
+
+var defaultTab = function defaultTab(data) {
+ data.tab = 'character';
+};
+
+var spellsForSixteenTwo = exports.spellsForSixteenTwo = function spellsForSixteenTwo(data) {
+ if ((0, _utilities.existsAllowZero)(data.warlock_spell_slots) && (0, _utilities.exists)(data.warlock_spell_slots_max)) {
+ data.warlock_spell_slots_expended = parseInt(data.warlock_spell_slots_max || 0, 10) - parseInt(data.warlock_spell_slots || 0, 10);
+ }
+ if ((0, _utilities.exists)(data.warlock_spell_slots_max)) {
+ data.warlock_spell_slots = data.warlock_spell_slots_max;
+ data.warlock_spell_slots_max = '';
+ }
+ _constants.SPELL_LEVELS.forEach(function (spellLevel) {
+ if ((0, _utilities.existsAllowZero)(data['spell_slots_l' + spellLevel]) && (0, _utilities.exists)(data['spell_slots_l' + spellLevel + '_max'])) {
+ data['spell_slots_level_' + spellLevel + '_expended'] = parseInt(data['spell_slots_l' + spellLevel + '_max'] || 0, 10) - parseInt(data['spell_slots_l' + spellLevel] || 0, 10);
+ }
+ if ((0, _utilities.exists)(data['spell_slots_l' + spellLevel + '_max'])) {
+ data['spell_slots_level_' + spellLevel] = data['spell_slots_l' + spellLevel + '_max'];
+ data['spell_slots_l' + spellLevel + '_max'] = '';
+ }
+ if ((0, _utilities.exists)(data['spell_slots_l' + spellLevel + '_calc'])) {
+ data['spell_slots_level_' + spellLevel + '_calc'] = data['spell_slots_l' + spellLevel + '_calc'];
+ data['spell_slots_l' + spellLevel + '_calc'] = '';
+ }
+ if ((0, _utilities.exists)(data['spell_slots_l' + spellLevel + '_bonus'])) {
+ data['spell_slots_level_' + spellLevel + '_bonus'] = data['spell_slots_l' + spellLevel + '_bonus'];
+ data['spell_slots_l' + spellLevel + '_bonus'] = '';
+ }
+ });
+};
+
+var versionCompare = function versionCompare(left, right) {
+ if (typeof left !== 'string' || typeof right !== 'string') {
+ return false;
+ }
+ var a = left.split('.');
+ var b = right.split('.');
+
+ var len = Math.max(a.length, b.length);
+
+ for (var i = 0; i < len; i += 1) {
+ if (a[i] && !b[i] && parseInt(a[i], 10) > 0 || parseInt(a[i], 10) > parseInt(b[i], 10)) {
+ return 1;
+ } else if (b[i] && !a[i] && parseInt(b[i], 10) > 0 || parseInt(a[i], 10) < parseInt(b[i], 10)) {
+ return -1;
+ }
+ }
+ return 0;
+};
+
+var runUpgrade = function runUpgrade(sheetVersion) {
+ var repeatingSections = [];
+ var collectionArray = [];
+
+ if (versionCompare(sheetVersion, '15.8.0') < 0) {
+ collectionArray = collectionArray.concat(['tab']);
+ }
+ if (versionCompare(sheetVersion, '16.2.0') < 0) {
+ collectionArray = collectionArray.concat(['warlock_spell_slots', 'warlock_spell_slots_max']).concat(_constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_slots_l' + spellLevel;
+ })).concat(_constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_slots_l' + spellLevel + '_max';
+ })).concat(_constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_slots_l' + spellLevel + '_calc';
+ })).concat(_constants.SPELL_LEVELS.map(function (spellLevel) {
+ return 'spell_slots_l' + spellLevel + '_bonus';
+ }));
+ }
+
+ collectionArray = (0, _utilities.uniqueArray)(collectionArray);
+
+ (0, _server.getSetItems)('upgrade.runUpgrade', {
+ alwaysExecuteCallback: true,
+ collectionArray: collectionArray,
+ collectionArrayRepeatingSections: repeatingSections,
+ process: function process(data) {
+ if (versionCompare(sheetVersion, '15.8.0') < 0) {
+ defaultTab(data);
+ }
+ if (versionCompare(sheetVersion, '17.0.0') < 0) {
+ spellsForSixteenTwo(data);
+ }
+ },
+ processCallback: function processCallback() {
+ if (versionCompare(sheetVersion, '15.0.0') < 0) {
+ (0, _modifiers.updateModifiers)();
+ }
+ if (versionCompare(sheetVersion, '15.5.0') < 0) {
+ (0, _abilityChecks.updateSkill)();
+ }
+ if (versionCompare(sheetVersion, '15.5.9') < 0) {
+ (0, _classes.updateLevels)();
+ (0, _hitDice.updateHitDice)();
+ }
+ if (versionCompare(sheetVersion, '16.0.0') < 0) {
+ (0, _settings.updateWeightSystem)();
+ }
+ if (versionCompare(sheetVersion, '17.0.0') < 0) {
+ (0, _spells.updateSpellSlots)({
+ higherLevelQueries: true,
+ spellSlots: true,
+ warlockSlots: true
+ });
+ }
+ (0, _processing.clearProcessing)();
+ }
+ });
+};
+
+var upgradeSheet = exports.upgradeSheet = function upgradeSheet(sheetVersion) {
+ var upgrades = ['15.0.0', '15.5.0', '15.5.9', '15.8.0', '16.0.0', '17.0.0'];
+ var upgradesToRun = [];
+
+ upgrades.forEach(function (version) {
+ if (versionCompare(sheetVersion, version) < 0) {
+ upgradesToRun.push(version);
+ }
+ });
+
+ if (upgradesToRun && upgradesToRun.length > 0) {
+ (0, _processing.addToProcessing)(upgradesToRun, function () {
+ runUpgrade(sheetVersion);
+ });
+ }
+};
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports) {
+
+module.exports = {"name":"5eShaped","version":"17.0.5","bin":"./","description":"5e Shaped character sheet for Roll20.net","main":"gulpfile.js","devDependencies":{"babel-core":"^6.26.0","babel-eslint":"^8.2.1","babel-loader":"^7.1.2","babel-preset-es2015":"^6.24.0","cache-loader":"^1.2.0","chai":"^4.1.2","chai-spies":"^1.0.0","cross-env":"^5.1.3","eslint":"^4.16.0","eslint-config-airbnb":"^16.1.0","eslint-plugin-import":"^2.8.0","eslint-plugin-jsx-a11y":"^6.0.3","eslint-plugin-react":"^7.6.1","gulp":"^3.9.1","gulp-autoprefixer":"^4.1.0","gulp-clean-css":"^3.9.2","gulp-concat":"^2.6.0","gulp-file-include":"^2.0.1","gulp-htmlmin":"^4.0.0","gulp-if":"^2.0.2","gulp-json-sort":"^1.0.0","gulp-nunjucks-render":"^2.2.2","gulp-rename":"^1.2.2","gulp-replace-task":"^0.11.0","gulp-sass":"^3.1.0","gulp-tap":"^1.0.1","gulp-util":"^3.0.8","gulp-wrapper":"1.0.0","istanbul-instrumenter-loader":"^3.0.0","json-loader":"^0.5.7","mocha":"^5.0.0","mocha-webpack":"^1.0.1","nyc":"^11.4.1","request":"2.83.0","sass-lint":"^1.12.1","sinon":"^4.2.2","streamqueue":"^1.1.2","webpack-node-externals":"^1.6.0","webpack-stream":"^4.0.0"},"repository":{"type":"git","url":"https://bitbucket.org/mlenser/5eshaped/"},"scripts":{"coverage":"cross-env NODE_ENV=coverage nyc npm test","lint":"eslint ./sheet/**/*.js ./test/**/*.js","sass-lint":"sass-lint ./sheet/**/*.scss -v -q","test":"mocha-webpack --opts test/mocha.webpack.opts","version-bump-patch":"npm version patch --no-git-tag-version","version-bump-minor":"npm version minor --no-git-tag-version","version-bump-major":"npm version major --no-git-tag-version"},"nyc":{"extension":[".js"],"all":true,"instrument":false,"sourceMap":false,"reporter":["lcov","text-summary","text"]},"author":"Mark Lenser (Kryx)","private":true}
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupRacialTraits = undefined;
+
+var _actions = __webpack_require__(4);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+var updateD20Mod = function updateD20Mod() {
+ (0, _server.getSetItems)('features.updateD20Mod', {
+ collectionArray: ['halfling_luck'],
+ process: function process(data) {
+ if ((0, _utilities.exists)(data.halfling_luck)) {
+ data.d20_mod = 'ro<1';
+ } else {
+ data.d20_mod = '';
+ }
+ }
+ });
+}; /* global on:false */
+
+var setupRacialTraits = exports.setupRacialTraits = function setupRacialTraits() {
+ on('change:savage_attacks', function () {
+ (0, _actions.updateAllActionsWithAttack)();
+ });
+ on('change:halfling_luck', function () {
+ updateD20Mod();
+ });
+};
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupRests = undefined;
+
+var _constants = __webpack_require__(2);
+
+var _server = __webpack_require__(1);
+
+var _utilities = __webpack_require__(0);
+
+var recoverBasedOnType = function recoverBasedOnType(type, field) {
+ if (type === 'long' && (field === 'LONG_REST' || field === 'SHORT_OR_LONG_REST' || field === 'TURN' || field.includes('RECHARGE'))) {
+ return true;
+ } else if (type === 'short' && (field === 'SHORT_OR_LONG_REST' || field === 'TURN' || field.includes('RECHARGE'))) {
+ return true;
+ } else if (type === 'turn' && field === 'TURN') {
+ return true;
+ }
+ return false;
+}; /* global on:false, getTranslationByKey:false */
+
+var recoverHitPoints = function recoverHitPoints(data, scriptOutput, type) {
+ var currentHP = parseInt(data.hp || 0, 10);
+ var hpMax = parseInt(data.hp_max || 0, 10) - parseInt(data.hp_max_reduced || 0, 10);
+ if (type === 'long') {
+ if (data.hit_points_recovered_on_a_long_rest === 'ALL' || data.hit_points_recovered_on_a_long_rest === 'HALF') {
+ if (data.hit_points_recovered_on_a_long_rest === 'ALL') {
+ if ((0, _utilities.exists)(data.hp_max)) {
+ data.hp = hpMax;
+ }
+ } else if (data.hit_points_recovered_on_a_long_rest === 'HALF') {
+ if ((0, _utilities.exists)(data.hp_max)) {
+ data.hp = Math.min(parseInt(data.hp || 0, 10) + Math.floor(hpMax / 2), hpMax);
+ }
+ }
+ var hitPointsRegained = parseInt(data.hp || 0, 10) - currentHP;
+ if (hitPointsRegained > 0) {
+ scriptOutput.push('{{heal=' + hitPointsRegained + '}}');
+ }
+ }
+ }
+};
+
+var recoverAllHitDice = function recoverAllHitDice(data, scriptOutput) {
+ _constants.HIT_DIE.forEach(function (hitDie) {
+ if ((0, _utilities.exists)(data['hd_d' + hitDie + '_max'])) {
+ var currentHitDice = parseInt(data['hd_d' + hitDie] || 0, 10);
+ data['hd_d' + hitDie] = data['hd_d' + hitDie + '_max'];
+ var hitDiceRecovered = parseInt(data['hd_d' + hitDie] || 0, 10) - currentHitDice;
+ if (hitDiceRecovered > 0) {
+ scriptOutput.push('{{' + hitDiceRecovered + 'd' + hitDie + ' ' + getTranslationByKey('HIT_DICE_RECOVERED') + '=' + data['hd_d' + hitDie] + '/' + data['hd_d' + hitDie + '_max'] + 'd' + hitDie + '}}');
+ }
+ }
+ });
+};
+
+var recoverSomeHitDice = function recoverSomeHitDice(data, scriptOutput, divider) {
+ var totalHitDice = 0;
+ _constants.HIT_DIE.forEach(function (hitDie) {
+ if ((0, _utilities.exists)(data['hd_d' + hitDie + '_max'])) {
+ totalHitDice += parseInt(data['hd_d' + hitDie + '_max'] || 0, 10);
+ }
+ });
+ var hitDiceToRecover = Math.max(1, Math.floor(totalHitDice / divider));
+ _constants.HIT_DIE.forEach(function (hitDie) {
+ if ((0, _utilities.exists)(data['hd_d' + hitDie + '_max'])) {
+ data['hd_d' + hitDie] = parseInt(data['hd_d' + hitDie] || 0, 10);
+ data['hd_d' + hitDie + '_max'] = parseInt(data['hd_d' + hitDie + '_max'] || 0, 10);
+ if (data['hd_d' + hitDie] < data['hd_d' + hitDie + '_max']) {
+ var hitDiceRecovered = 0;
+
+ while (data['hd_d' + hitDie] < data['hd_d' + hitDie + '_max'] && hitDiceToRecover > 0) {
+ data['hd_d' + hitDie] += 1;
+ hitDiceToRecover -= 1;
+ hitDiceRecovered += 1;
+ }
+
+ if (hitDiceRecovered > 0) {
+ scriptOutput.push('{{' + hitDiceRecovered + 'd' + hitDie + ' ' + getTranslationByKey('HIT_DICE_RECOVERED') + '=' + data['hd_d' + hitDie] + '/' + data['hd_d' + hitDie + '_max'] + 'd' + hitDie + '}}');
+ }
+ }
+ }
+ });
+};
+
+var recoverHitDice = function recoverHitDice(data, scriptOutput, type) {
+ if (type === 'long') {
+ if (data.hit_dice_recovered_on_a_long_rest === 'ALL') {
+ recoverAllHitDice(data, scriptOutput);
+ } else if (data.hit_dice_recovered_on_a_long_rest === 'HALF') {
+ recoverSomeHitDice(data, scriptOutput, 2);
+ }
+ } else if (type === 'short') {
+ if (data.hit_dice_recovered_on_a_short_rest === 'ALL') {
+ recoverAllHitDice(data, scriptOutput);
+ } else if (data.hit_dice_recovered_on_a_short_rest === 'HALF') {
+ recoverSomeHitDice(data, scriptOutput, 2);
+ } else if (data.hit_dice_recovered_on_a_short_rest === 'FOURTH') {
+ recoverSomeHitDice(data, scriptOutput, 4);
+ }
+ }
+};
+
+var recoverSpellSlots = function recoverSpellSlots(data, scriptOutput, type) {
+ if (type === 'long') {
+ _constants.SPELL_LEVELS.forEach(function (level) {
+ if (data['spell_slots_level_' + level + '_expended'] !== 0) {
+ data['spell_slots_level_' + level + '_expended'] = 0;
+ scriptOutput.push('{{' + getTranslationByKey('LEVEL') + ' ' + level + ' ' + getTranslationByKey('SPELL_SLOTS') + ' ' + getTranslationByKey('RECOVERED') + '=' + data['spell_slots_level_' + level + '_expended'] + '}}');
+ }
+ });
+ }
+};
+
+var recoverWarlockSlots = function recoverWarlockSlots(data, scriptOutput, type) {
+ if ((0, _utilities.exists)(data.warlock_spells_recharge) && recoverBasedOnType(type, data.warlock_spells_recharge) && data.warlock_spell_slots_expended !== 0) {
+ data.warlock_spell_slots_expended = 0;
+ scriptOutput.push('{{' + getTranslationByKey('WARLOCK_SLOTS') + ' ' + getTranslationByKey('RECOVERED') + '=' + data.warlock_spell_slots_expended + '}}');
+ }
+};
+
+var recoverSpellPoints = function recoverSpellPoints(data, scriptOutput, type) {
+ if ((0, _utilities.exists)(data.spell_points_recharge) && recoverBasedOnType(type, data.spell_points_recharge) && data.spell_points !== data.spell_points_max) {
+ data.spell_points = data.spell_points_max;
+ scriptOutput.push('{{' + getTranslationByKey('SPELL_POINTS') + ' ' + getTranslationByKey('RECOVERED') + '=' + data.spell_points + '/' + data.spell_points_max + '}}');
+ }
+};
+
+var reduceExhaustion = function reduceExhaustion(data, scriptOutput, type) {
+ if (type === 'long' && parseInt(data.exhaustion_level || 0, 10) > 0) {
+ data.exhaustion_level = parseInt(data.exhaustion_level || 0, 10) - 1;
+ var exhaustionLevelMessage = [];
+ for (var i = 6; i > 0; i -= 1) {
+ if (data.exhaustion_level >= i) {
+ exhaustionLevelMessage.push(getTranslationByKey('EXHAUSTION_LEVEL_' + i));
+ }
+ }
+ exhaustionLevelMessage = exhaustionLevelMessage.join(', ');
+
+ scriptOutput.push('{{' + getTranslationByKey('EXHAUSTION_LEVEL') + ' ' + getTranslationByKey('REDUCED_TO') + ' ' + data.exhaustion_level + '=' + exhaustionLevelMessage + '}}');
+ }
+};
+
+var recoverUses = function recoverUses(data, scriptOutput, type, repStrings) {
+ repStrings.forEach(function (repString) {
+ if ((0, _utilities.exists)(data[repString + '_recharge']) && recoverBasedOnType(type, data[repString + '_recharge']) && (0, _utilities.exists)(data[repString + '_uses_max']) && data[repString + '_uses'] !== data[repString + '_uses_max']) {
+ data[repString + '_uses'] = data[repString + '_uses_max'];
+ scriptOutput.push('{{' + data[repString + '_name'] + ' ' + getTranslationByKey('RECHARGED') + '=' + data[repString + '_uses'] + '/' + data[repString + '_uses_max'] + '}}');
+ }
+ });
+};
+
+var recoverLegendaryActionPoints = function recoverLegendaryActionPoints(data, scriptOutput, type) {
+ if ((type === 'turn' || type === 'short' || type === 'long') && (0, _utilities.exists)(data.legendary_action_amount_max) && data.legendary_action_amount !== data.legendary_action_amount_max) {
+ data.legendary_action_amount = data.legendary_action_amount_max;
+ scriptOutput.push('{{' + getTranslationByKey('LEGENDARY_ACTIONS') + ' ' + getTranslationByKey('RECOVERED') + '=' + data.legendary_action_amount + '/' + data.legendary_action_amount_max + '}}');
+ }
+};
+
+var rest = function rest(type, output) {
+ (0, _server.getSetItems)('rest.rest', {
+ collectionArray: [].concat(['hit_points_recovered_on_a_long_rest', 'hp', 'hp_max', 'hp_max_reduced']).concat(['hit_dice_recovered_on_a_long_rest', 'hit_dice_recovered_on_a_short_rest']).concat(_constants.HIT_DIE.map(function (hitDie) {
+ return 'hd_d' + hitDie;
+ })).concat(_constants.HIT_DIE.map(function (hitDie) {
+ return 'hd_d' + hitDie + '_max';
+ })).concat(_constants.SPELL_LEVELS.map(function (level) {
+ return 'spell_slots_level_' + level;
+ })).concat(_constants.SPELL_LEVELS.map(function (level) {
+ return 'spell_slots_level_' + level + '_expended';
+ })).concat(['warlock_spells_recharge', 'warlock_spell_slots', 'warlock_spell_slots_expended']).concat(['spell_points_recharge', 'spell_points', 'spell_points_max']).concat(['exhaustion_level']).concat(['legendary_action_amount', 'legendary_action_amount_max']),
+ collectionArrayRepeatingSections: _constants.ACTION_TYPES.concat(['armor', 'equipment']).concat(_constants.SPELL_LEVELS.map(function (level) {
+ return 'spell' + level;
+ })).map(function (repeatingSection) {
+ return {
+ collectionArrayAddItems: ['name'].concat(_constants.REPEATING_FIELDS.uses).concat(_constants.REPEATING_FIELDS.recharge),
+ name: 'repeating_' + repeatingSection
+ };
+ }),
+ process: function process(data, repStrings) {
+ var scriptOutput = [];
+ var showOutput = output;
+
+ recoverHitDice(data, scriptOutput, type);
+ recoverHitPoints(data, scriptOutput, type);
+ recoverSpellSlots(data, scriptOutput, type);
+ recoverWarlockSlots(data, scriptOutput, type);
+ recoverSpellPoints(data, scriptOutput, type);
+ reduceExhaustion(data, scriptOutput, type);
+ recoverUses(data, scriptOutput, type, repStrings);
+ recoverLegendaryActionPoints(data, scriptOutput, type);
+
+ if (scriptOutput.length === 0) {
+ scriptOutput.push('{{text=' + getTranslationByKey('NOTHING_RECHARGED') + '}}');
+ } else if (!showOutput) {
+ showOutput = 'output';
+ }
+
+ var restTitle = void 0;
+ if (type === 'short') {
+ restTitle = getTranslationByKey('SHORT_REST');
+ } else if (type === 'long') {
+ restTitle = getTranslationByKey('LONG_REST');
+ } else if (type === 'turn') {
+ restTitle = getTranslationByKey('TURN_RECHARGE');
+ }
+ scriptOutput.push('{{title=' + restTitle + '}}');
+ scriptOutput.push('{{character_name=@{character_name}}} @{show_character_name}');
+ if (showOutput) {
+ data.sheet_chat_output = scriptOutput.join(' ');
+ }
+ }
+ });
+};
+
+var setupRests = exports.setupRests = function setupRests() {
+ on('change:short_rest', function () {
+ rest('short', 'output');
+ });
+ on('change:long_rest', function () {
+ rest('long', 'output');
+ });
+ on('change:recharge_turn', function () {
+ rest('turn');
+ });
+};
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.setupImportData = undefined;
+
+var _npc = __webpack_require__(14);
+
+var _server = __webpack_require__(1);
+
+var _spells = __webpack_require__(5);
+
+var importData = function importData() {
+ var importObject = void 0;
+ (0, _server.getSetItems)('importData.import', {
+ collectionArray: ['import_data'],
+ process: function process(data) {
+ if (data.import_data) {
+ importObject = JSON.parse(data.import_data);
+ Object.assign(data, importObject.npc_data, importObject.spell_data);
+
+ if (importObject.npc_data) {
+ (0, _npc.parseMonsterFromSRDWithServer)();
+ } else if (importObject.spell_data) {
+ (0, _spells.updateSpells)({
+ newRepeatingField: true
+ });
+ (0, _spells.updateSpellsChatMacro)();
+ (0, _spells.countSpells)();
+ }
+ data.import_data = '';
+ }
+ }
+ });
+}; /* global on:false */
+var setupImportData = exports.setupImportData = function setupImportData() {
+ on('change:import_data', function () {
+ importData();
+ });
+};
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.listenForCompendiumDrop = undefined;
+
+var _equipment = __webpack_require__(10);
+
+var _npc = __webpack_require__(14);
+
+var _spells = __webpack_require__(5);
+
+var listenForCompendiumDrop = exports.listenForCompendiumDrop = function listenForCompendiumDrop() {
+ on('change:category_from_srd', function (eventinfo) {
+ if (eventinfo.newValue === 'Spells') {
+ (0, _spells.parseSpellFromSRDWithServer)();
+ } else if (eventinfo.newValue === 'Monsters') {
+ (0, _npc.parseMonsterFromSRDWithServer)();
+ } else if (eventinfo.newValue === 'Items') {
+ (0, _equipment.parseItemFromSRDWithServer)();
+ }
+ });
+ on('sheet:compendium-drop', function () {
+ (0, _npc.monsterDroppedOnTabletop)();
+ });
+}; /* global on:false */
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/5eShaped/changelog.md b/5eShaped/changelog.md
index aa71de9cfa..67e10f3441 100644
--- a/5eShaped/changelog.md
+++ b/5eShaped/changelog.md
@@ -11,6 +11,104 @@ Bugs fall into the patch category.
The sheet will always upgrade itself unless I specify otherwise, though some things like roll template fields changing will require users who have added custom macros to fix.
+## 17.0.5
+
+### Bug Fixes
+* [#693: Tooltips for carry capacity and push/drag cut off at default sheet size](https://bitbucket.org/mlenser/5eshaped/issues/693/tooltips-for-carry-capacity-and-push-drag)
+* [#691: Feature uses tied to modifiers aren't being read](https://bitbucket.org/mlenser/5eshaped/issues/691/feature-uses-tied-to-modifiers-arent-being)
+* [#692: Repeat attack / damage needs some point of reference](https://bitbucket.org/mlenser/5eshaped/issues/692/repeat-attack-damage-needs-some-point-of)
+
+## 17.0.4
+
+### Bug Fixes
+* [#686: Spell tooltips do not respect newlines in the spell's description](https://bitbucket.org/mlenser/5eshaped/issues/686/spell-tooltips-do-not-respect-newlines-in)
+* [#687: Attacks and Traits are blank when](https://bitbucket.org/mlenser/5eshaped/issues/687/attacks-and-traits-are-blank-when)
+
+## 17.0.3
+
+### Bug Fixes
+* Monsters imported from the script now correctly output their content. Closes [#682: Imported Actions/Traits don't send content to chat](https://bitbucket.org/mlenser/5eshaped/issues/682/imported-actions-traits-dont-send-content)
+* Skill rows that run out of room now cause the name to shrink better, primarily on firefox. Closes [#684: Formatting Skills error](https://bitbucket.org/mlenser/5eshaped/issues/684/formatting-skills-error)
+
+## 17.0.2
+
+### Bug Fixes
+* [#675: Warlock slots not generating](https://bitbucket.org/mlenser/5eshaped/issues/675/warlock-slots-not-generating-v-1701)
+* Spells known and spells chat macro now update when dragging a spell from the SRD. Closes [#677: Spells Macro Not Updating](https://bitbucket.org/mlenser/5eshaped/issues/677/spells-macro-not-updating)
+
+## 17.0.1
+
+### Bug Fixes
+* `Roll 2` now indicates to the user that it is a legacy feature that does not work with all sheet features.
+* [#672: coin weight calculation resulting in high decimal values](https://bitbucket.org/mlenser/5eshaped/issues/672/coin-weight-calculation-resulting-in-high)
+* Spells manually changed in any way resulted in an error which prevented the scripts from running properly. This has been fixed. Closes [#674: Adding custom spells does not output description to chat or use spell slot](https://bitbucket.org/mlenser/5eshaped/issues/674/adding-custom-spells-does-not-output)
+
+## 17.0.0
+
+### Breaking Changes
+* Spells now track the number of slots expended instead of the remaining slots. This aligns with the paper and OGL sheets. Upgrades should handle this change for you.
+* NPC saving throws and skills will only show proficient/expertise items while in presentation mode. Closes [#669: Don't generate skills by default that have no proficiency or expertise on NPC sheets](https://bitbucket.org/mlenser/5eshaped/issues/669/dont-generate-skills-by-default-that-have)
+
+### Features
+* Spell UI has been updated with bubbles for spell slots and new UI wrappers.
+* Spells now have tooltips to display the full contents of the spell. Closes [#374: Enable 'condense' toggling for spells on a more granular basis](https://bitbucket.org/mlenser/5eshaped/issues/374/enable-condense-toggling-for-spells-on-a)
+* NPC skills will now show in a grid layout in edit mode.
+* Falling to 0 hp now sets the unconscious condition. Gaining HP removes it. Closes [#3: Conditions](https://bitbucket.org/mlenser/5eshaped/issues/3/conditions)
+* Cleaned up the Stablock macro to translate the size of PCs/NPCs. Race will now show instead of type for PCs. Offense and utility added for PCs as well.
+* Settings page reorganized.
+
+### Bug Fixes
+* [#670: Not assigning a weight value to equipment completely breaks weight calculations](https://bitbucket.org/mlenser/5eshaped/issues/670/not-assigning-a-weight-value-to-equipment)
+
+## 16.1.2
+
+### Bug Fixes
+* [#572: Modifiers adding a second time on critical damage](https://bitbucket.org/mlenser/5eshaped/issues/572/modifiers-adding-a-second-time-on-critical)
+
+## 16.1.1
+
+### Bug Fixes
+* [#664: Spelling errors in translation.json](https://bitbucket.org/mlenser/5eshaped/issues/664/spelling-errors-in-translationjson)
+* [#663: Saving Throw Bonus Formatting Error](https://bitbucket.org/mlenser/5eshaped/issues/663/saving-throw-bonus-formatting-error)
+* Crit range is shown by default as turning it on wasn’t intuitive enough.
+
+## 16.1.0
+
+### Features
+* Shaped sheet can now process OGL spells from PC sheets or NPC sheets (only NPC sheets from the Curse of Strahd module and newer use this format for spells). Closes [#659: NPC Spells not converting from OGL to Shaped](https://bitbucket.org/mlenser/5eshaped/issues/659/npc-spells-not-converting-from-ogl-to)
+
+### UI Adjustments
+* The sheet is a bit wider now and no longer assumes my stylish CSS so it should fit on the default width (~888px depending on browser) without a horizontal scrollbar.
+* Firefox UI cleaned up. Closes [#661: Tie bar behind exhastion states not centered](https://bitbucket.org/mlenser/5eshaped/issues/661/tie-bar-behind-exhastion-states-not)
+
+## 16.0.0
+
+### Breaking Changes
+* Importing data from the compendium, script, or OGL content has been completely revamped to use the same system for as much as possible.
+
+### Features
+* [#656: Missing comma in Modifiers -> Saving throw](https://bitbucket.org/mlenser/5eshaped/issues/656/missing-comma-in-modifiers-saving-throw)
+* Conditions have been added.
+
+### Bug Fixes
+* [#654: Magic Missile](https://bitbucket.org/mlenser/5eshaped/issues/654/magic-missile)
+* New characters sheets will be created with edit mode enabled
+* [#655: OGL skills do not convert](https://bitbucket.org/mlenser/5eshaped/issues/655/ogl-skills-do-not-convert)
+* OGL conversion, Compendium drop, and Script import of monsters, spells, and items should be fully working (update the script to 12.0.0)
+ * A processing notification now shows while these items are processing, regardless of origin
+* [#38: Spell Save DC Not calculating properly in !shaped-spells](https://bitbucket.org/mlenser/5eshapedscript/issues/38/spell-save-dc-not-calculating-properly-in)
+* Weapons dropped on a NPC sheet are added as actions
+
+### UI Adjustments
+* Styled boxes have been added
+* Tabs renamed to "Character"/"NPC", "Spells", and the cog.
+* "Character" tab for PCs will now show the appearance and backstory details below the normal sheet
+* "All" option removed as it is now only useful for showing settings below other sheets which doesn't have much value
+* Repeating buttons restyled a bit
+* PC Core page column widths adjusted a bit
+* Font sizes adjusted to match the new UI
+* Passive skills moved to the core page and restyled
+
## 15.7.4
### Bug Fixes
diff --git a/5eShaped/translation.json b/5eShaped/translation.json
index 8da3b7b7e9..310e718716 100644
--- a/5eShaped/translation.json
+++ b/5eShaped/translation.json
@@ -113,6 +113,8 @@
"BIG": "Big",
"BITE": "Bite",
"BLINDED": "Blinded",
+ "BLINDED_1": "A blinded creature can’t see and automatically fails any ability check that requires sight.",
+ "BLINDED_2": "Attack rolls against the creature have advantage, and the creature’s attack rolls have disadvantage.",
"BLINDSIGHT": "Blindsight",
"BLIND_BEYOND": "blind beyond this radius",
"BLUDGEONING": "bludgeoning",
@@ -130,10 +132,13 @@
"CAN_HAVE": "Can have",
"CARRIED": "Carried",
"CARRYING_CAPACITY": "Carrying capacity",
- "CARRYING_PUSH_DRAG_LIFT": "Push\/Drag\/Lift",
- "CASTERS_FULL": "Full (9th level: Bard, Cleric, Druid, Sorcerer, Wizard)",
- "CASTERS_HALF": "Half (5th level: Paladin, Ranger)",
- "CASTERS_THIRD": "Third (3rd level: Arcane Archetypes)",
+ "CARRYING_CAPACITY_1": "This is the weight that you can carry",
+ "CARRYING_PUSH_DRAG_LIFT": "Push, Drag, or Lift",
+ "CARRYING_PUSH_DRAG_LIFT_FEET": "While pushing or dragging weight in excess of your carrying capacity, your speed drops to 5 feet.",
+ "CARRYING_PUSH_DRAG_LIFT_METERS": "While pushing or dragging weight in excess of your carrying capacity, your speed drops to 1.5 meters.",
+ "CASTERS_4TH": "4th level spellcasting",
+ "CASTERS_5TH": "5th level spellcasting",
+ "CASTERS_9TH": "9th level spellcasting",
"CASTING_TIME": "Casting Time",
"CHA": "Cha",
"CHALLENGE": "Challenge",
@@ -143,6 +148,8 @@
"CHARISMA": "Charisma",
"CHARISMA_SAVING_THROW": "Charisma saving throw",
"CHARMED": "Charmed",
+ "CHARMED_1": "A charmed creature can’t attack the charmer or target the charmer with harmful abilities or magical effects.",
+ "CHARMED_2": "The charmer has advantage on any ability check to interact socially with the creature.",
"CHECK": "Check",
"CHECK_MODIFIER": "Check modifier",
"CHOOSE_WHEN_ROLLING": "Choose when rolling",
@@ -155,7 +162,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’t be charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’t be charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +215,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +240,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +256,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +316,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +360,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -462,6 +469,7 @@
"DARKVISION": "Darkvision",
"DC": "DC",
"DEAFENED": "Deafened",
+ "DEAFENED_1": "A deafened creature can’t hear and automatically fails any ability check that requires hearing.",
"DEATH": "Death",
"DEATH_SAVES": "Death saves",
"DEATH_SAVING_THROW": "Death saving throw",
@@ -506,6 +514,7 @@
"DOCUMENTATION": "Documentation",
"DONT": "Don’t",
"DRAGON": "Dragon",
+ "DROP": "Drop",
"DRUID": "Druid",
"DURATION": "Duration",
"EFFECT": "Effect",
@@ -513,7 +522,12 @@
"EMOTE": "Emote",
"ENCHANTMENT": "Enchantment",
"ENCUMBERED": "Encumbered",
- "ENCUMBERED_HEAVILY": "H. Encumbered",
+ "ENCUMBERED_FEET": "Speed reduced by 10 feet",
+ "ENCUMBERED_HEAVILY": "Heavily Encumbered",
+ "ENCUMBERED_HEAVILY_2": "You have disadvantage on ability checks, attack rolls, and saving throws that use Strength, Dexterity, or Constitution.",
+ "ENCUMBERED_HEAVILY_FEET": "Speed reduced by 20 feet",
+ "ENCUMBERED_HEAVILY_METERS": "Speed reduced by 6 meters",
+ "ENCUMBERED_METERS": "Speed reduced by 3 meters",
"ENCUMBRANCE_MULTIPLIER": "Encumbrance multiplier",
"ENGINEERING": "Engineering",
"EQUIPMENT": "Equipment",
@@ -557,12 +571,18 @@
"FREEFORM": "Freeform",
"FREETEXT": "Freetext",
"FRIGHTENED": "Frightened",
+ "FRIGHTENED_1": "A frightened creature has disadvantage on ability checks and attack rolls while the source of its fear is within line of sight.",
+ "FRIGHTENED_2": "The creature can’t willingly move closer to the source of its fear.",
"GARGANTUAN": "Gargantuan",
"GENDER": "Gender",
+ "GENERATE": "Generate",
"GENERATE_SKILLS": "Generate skills",
"GM": "GM",
"GOLD_PIECES": "Gold pieces",
"GRAPPLED": "Grappled",
+ "GRAPPLED_1": "A grappled creature’s speed becomes 0, and it can’t benefit from any bonus to its speed.",
+ "GRAPPLED_2": "The condition ends if the grappler is incapacitated (see the condition).",
+ "GRAPPLED_3": "The condition also ends if an effect removes the grappled creature from the reach of the grappler or grappling effect, such as when a creature is hurled away by the thunderwave spell.",
"HAIR": "Hair",
"HALF": "Half",
"HALFLING_LUCK": "Halfling Luck",
@@ -615,6 +635,7 @@
"ILLUSION": "Illusion",
"IMPORT": "Import",
"INCAPACITATED": "Incapacitated",
+ "INCAPACITATED_1": "An incapacitated creature can’t take actions or reactions.",
"INFLUENCE": "Influence",
"INITIATIVE": "Initiative",
"INNATE_SPELLCASTING": "Innate Spellcasting",
@@ -634,16 +655,20 @@
"INTIMIDATION": "Intimidation",
"INVESTIGATION": "Investigation",
"INVISIBLE": "Invisible",
+ "INVISIBLE_1": "An invisible creature is impossible to see without the aid of magic or a special sense. For the purpose of hiding, the creature is heavily obscured. The creature’s location can be detected by any noise it makes or any tracks it leaves.",
+ "INVISIBLE_2": "Attack rolls against the creature have disadvantage, and the creature’s attack rolls have advantage.",
"JACK_OF_ALL_TRADES": "Jack of all trades",
"KI": "Ki",
"KILOGRAMS": "Kilograms",
+ "KILOGRAMS_SHORT": "kg",
"KNOWN": "Known",
"LAIR_ACTIONS": "Lair Actions",
"LANGUAGES": "Languages",
"LARGE": "Large",
"LAWFUL_EVIL": "lawful evil",
- "LBS": "lbs",
"LEATHER": "Leather",
+ "LEGACY": "Legacy",
+ "LEGACY_TOOLTIP": "This cannot be used with all sheet features",
"LEGENDARY_ACTIONS": "Legendary Actions",
"LEGENDARY_ACTIONS_TEXT_1": "The",
"LEGENDARY_ACTIONS_TEXT_2": "can take",
@@ -656,7 +681,7 @@
"LIMIT": "Limit",
"LONGER": "Longer",
"LONGSWORD": "Longsword",
- "LONG_REST": "Long Rest",
+ "LONG_REST": "Long rest",
"MACROS": "Macros",
"MANA": "Mana",
"MANIPULATION": "Manipulation",
@@ -707,6 +732,10 @@
"OUTPUT": "Output",
"PALADIN": "Paladin",
"PARALYZED": "Paralyzed",
+ "PARALYZED_1": "A paralyzed creature is incapacitated (see the condition) and can’t move or speak.",
+ "PARALYZED_2": "The creature automatically fails Strength and Dexterity saving throws.",
+ "PARALYZED_3": "Attack rolls against the creature have advantage.",
+ "PARALYZED_4": "Any attack that hits the creature is a critical hit if the attacker is within 5 feet of the creature.",
"PASSIVE": "Passive",
"PASSIVE_ABILITY_CHECK": "Passive ability check",
"PASSIVE_SKILLS": "Passive skills",
@@ -718,6 +747,12 @@
"PER_LEVEL": "per level",
"PER_USE": "per use",
"PETRIFIED": "Petrified",
+ "PETRIFIED_1": "A petrified creature is transformed, along with any nonmagical object it is wearing or carrying, into a solid inanimate substance (usually stone). Its weight increases by a factor of ten, and it ceases aging.",
+ "PETRIFIED_2": "The creature is incapacitated (see the condition), can’t move or speak, and is unaware of its surroundings.",
+ "PETRIFIED_3": "Attack rolls against the creature have advantage.",
+ "PETRIFIED_4": "The creature automatically fails Strength and Dexterity saving throws.",
+ "PETRIFIED_5": "The creature has resistance to all damage.",
+ "PETRIFIED_6": "The creature is immune to poison and disease, although a poison or disease already in its system is suspended, not neutralized.",
"PIERCING": "piercing",
"PLATINUM_PIECES": "Platinum pieces",
"PLUS": "plus",
@@ -725,12 +760,14 @@
"POINTS_OF_ORIGIN": "Points of origin",
"POISON": "poison",
"POISONED": "Poisoned",
+ "POISONED_1": "A poisoned creature has disadvantage on attack rolls and ability checks.",
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Prepared",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processing",
"PROF": "Prof",
@@ -740,11 +777,14 @@
"PROFICIENT": "Proficient",
"PROFICIENT_ARMOR_WEIGHS": "Armor that you are proficient in weighs",
"PRONE": "Prone",
+ "PRONE_1": "A prone creature’s only movement option is to crawl, unless it stands up and thereby ends the condition.",
+ "PRONE_2": "The creature has disadvantage on attack rolls.",
+ "PRONE_3": "An attack roll against the creature has advantage if the attacker is within 5 feet of the creature. Otherwise, the attack roll has disadvantage.",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychic",
@@ -795,6 +835,9 @@
"RESOURCES": "Resources",
"REST": "Rest",
"RESTRAINED": "Restrained",
+ "RESTRAINED_1": "A restrained creature’s speed becomes 0, and it can’t benefit from any bonus to its speed.",
+ "RESTRAINED_2": "Attack rolls against the creature have advantage, and the creature’s attack rolls have disadvantage.",
+ "RESTRAINED_3": "The creature has disadvantage on Dexterity saving throws.",
"RING": "Ring",
"RITUAL": "Ritual",
"ROGUE": "Rogue",
@@ -825,8 +868,8 @@
"SHEET_OUTPUT": "Sheet output",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Shield",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
- "SHORT_REST": "Short Rest",
+ "SHORT_OR_LONG_REST": "Short or Long rest",
+ "SHORT_REST": "Short rest",
"SHOW_ALL": "Show all",
"SHOW_RESTS": "Show Rests",
"SHOW_SPELL_LEVEL_IF_ALL_SLOTS_ARE_USED": "Show levels if all slots are used",
@@ -866,6 +909,7 @@
"SKIN": "Skin",
"SLASHING": "slashing",
"SLEIGHTOFHAND": "Sleight of Hand",
+ "SLOT": "Slot",
"SLOTS": "Slots",
"SMALL": "Small",
"SOCIETY": "Society",
@@ -910,6 +954,9 @@
"STR_13": "Str 13",
"STR_15": "Str 15",
"STUNNED": "Stunned",
+ "STUNNED_1": "A stunned creature is incapacitated (see the condition), can’t move, and can speak only falteringly.",
+ "STUNNED_2": "The creature automatically fails Strength and Dexterity saving throws.",
+ "STUNNED_3": "Attack rolls against the creature have advantage.",
"SUCCESSES": "Successes",
"SUMMONER": "Summoner",
"SURVIVAL": "Survival",
@@ -936,6 +983,11 @@
"TYPE": "Type",
"UNARMORED": "Unarmored",
"UNCONSCIOUS": "Unconscious",
+ "UNCONSCIOUS_1": "An unconscious creature is incapacitated (see the condition), can’t move or speak, and is unaware of its surroundings.",
+ "UNCONSCIOUS_2": "The creature drops whatever it’s holding and falls prone.",
+ "UNCONSCIOUS_3": "The creature automatically fails Strength and Dexterity saving throws.",
+ "UNCONSCIOUS_4": "Attack rolls against the creature have advantage.",
+ "UNCONSCIOUS_5": "Any attack that hits the creature is a critical hit if the attacker is within 5 feet of the creature.",
"UNPROFICIENT": "Unproficient",
"UNTIL_DISPELLED": "Until dispelled",
"UNTIL_DISPELLED_OR_TRIGGERED": "Until dispelled or triggered",
diff --git a/5eShaped/translations/af.json b/5eShaped/translations/af.json
index 3ca2d0dee1..ba1ca81f98 100644
--- a/5eShaped/translations/af.json
+++ b/5eShaped/translations/af.json
@@ -131,9 +131,9 @@
"CARRIED": "Carried",
"CARRYING_CAPACITY": "Carrying capacity",
"CARRYING_PUSH_DRAG_LIFT": "Push\/Drag\/Lift",
- "CASTERS_FULL": "Full (9th level: Bard, Cleric, Druid, Sorcerer, Wizard)",
- "CASTERS_HALF": "Half (5th level: Paladin, Ranger)",
- "CASTERS_THIRD": "Third (3rd level: Arcane Archetypes)",
+ "CASTERS_4TH": "4th level spellcasting",
+ "CASTERS_5TH": "5th level spellcasting",
+ "CASTERS_9TH": "9th level spellcasting",
"CASTING_TIME": "Casting Time",
"CHA": "Cha",
"CHALLENGE": "Challenge",
@@ -155,7 +155,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +208,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +353,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -642,7 +642,6 @@
"LANGUAGES": "Languages",
"LARGE": "Large",
"LAWFUL_EVIL": "lawful evil",
- "LBS": "lbs",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "Legendary Actions",
"LEGENDARY_ACTIONS_TEXT_1": "The",
@@ -656,7 +655,7 @@
"LIMIT": "Limit",
"LONGER": "Longer",
"LONGSWORD": "Longsword",
- "LONG_REST": "Long Rest",
+ "LONG_REST": "Long rest",
"MACROS": "Macros",
"MANA": "Mana",
"MANIPULATION": "Manipulation",
@@ -728,9 +727,10 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Prepared",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processing",
"PROF": "Prof",
@@ -742,9 +742,9 @@
"PRONE": "Prone",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychic",
@@ -825,8 +825,8 @@
"SHEET_OUTPUT": "Sheet output",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Shield",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
- "SHORT_REST": "Short Rest",
+ "SHORT_OR_LONG_REST": "Short or Long rest",
+ "SHORT_REST": "Short rest",
"SHOW_ALL": "Show all",
"SHOW_RESTS": "Show Rests",
"SHOW_SPELL_LEVEL_IF_ALL_SLOTS_ARE_USED": "Show levels if all slots are used",
diff --git a/5eShaped/translations/cs.json b/5eShaped/translations/cs.json
index 064a7beb87..376e17ce3e 100644
--- a/5eShaped/translations/cs.json
+++ b/5eShaped/translations/cs.json
@@ -131,9 +131,9 @@
"CARRIED": "Neseno",
"CARRYING_CAPACITY": "Nesená váha",
"CARRYING_PUSH_DRAG_LIFT": "Push\/Drag\/Lift",
- "CASTERS_FULL": "Full (9th level: Bard, Cleric, Druid, Sorcerer, Wizard)",
- "CASTERS_HALF": "Half (5th level: Paladin, Ranger)",
- "CASTERS_THIRD": "Third (3rd level: Arcane Archetypes)",
+ "CASTERS_4TH": "4th level spellcasting",
+ "CASTERS_5TH": "5th level spellcasting",
+ "CASTERS_9TH": "9th level spellcasting",
"CASTING_TIME": "Vyvolání kouzla",
"CHA": "Cha",
"CHALLENGE": "Nebezpečnost",
@@ -155,7 +155,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +208,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Druhý dech",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Odražení střel",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamantová duše",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Prázdné tělo",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Bojová umění",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Trpělivá obrana",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Vlastní dokonalost",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Čistota těla",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +353,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -642,7 +642,6 @@
"LANGUAGES": "Jazyky",
"LARGE": "Velká",
"LAWFUL_EVIL": "lawful evil",
- "LBS": "lbs",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "Legendary Actions",
"LEGENDARY_ACTIONS_TEXT_1": "The",
@@ -728,9 +727,10 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Libry",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Připravené",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "Zatímco je deník ve stavu zpracovávání, nezavírej ho.",
"PROCESSING_TITLE": "Zpracovávám",
"PROF": "Prof",
@@ -742,9 +742,9 @@
"PRONE": "Ležící (sražený)",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychic",
diff --git a/5eShaped/translations/da.json b/5eShaped/translations/da.json
index 3ca2d0dee1..ba1ca81f98 100644
--- a/5eShaped/translations/da.json
+++ b/5eShaped/translations/da.json
@@ -131,9 +131,9 @@
"CARRIED": "Carried",
"CARRYING_CAPACITY": "Carrying capacity",
"CARRYING_PUSH_DRAG_LIFT": "Push\/Drag\/Lift",
- "CASTERS_FULL": "Full (9th level: Bard, Cleric, Druid, Sorcerer, Wizard)",
- "CASTERS_HALF": "Half (5th level: Paladin, Ranger)",
- "CASTERS_THIRD": "Third (3rd level: Arcane Archetypes)",
+ "CASTERS_4TH": "4th level spellcasting",
+ "CASTERS_5TH": "5th level spellcasting",
+ "CASTERS_9TH": "9th level spellcasting",
"CASTING_TIME": "Casting Time",
"CHA": "Cha",
"CHALLENGE": "Challenge",
@@ -155,7 +155,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +208,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +353,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -642,7 +642,6 @@
"LANGUAGES": "Languages",
"LARGE": "Large",
"LAWFUL_EVIL": "lawful evil",
- "LBS": "lbs",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "Legendary Actions",
"LEGENDARY_ACTIONS_TEXT_1": "The",
@@ -656,7 +655,7 @@
"LIMIT": "Limit",
"LONGER": "Longer",
"LONGSWORD": "Longsword",
- "LONG_REST": "Long Rest",
+ "LONG_REST": "Long rest",
"MACROS": "Macros",
"MANA": "Mana",
"MANIPULATION": "Manipulation",
@@ -728,9 +727,10 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Prepared",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processing",
"PROF": "Prof",
@@ -742,9 +742,9 @@
"PRONE": "Prone",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychic",
@@ -825,8 +825,8 @@
"SHEET_OUTPUT": "Sheet output",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Shield",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
- "SHORT_REST": "Short Rest",
+ "SHORT_OR_LONG_REST": "Short or Long rest",
+ "SHORT_REST": "Short rest",
"SHOW_ALL": "Show all",
"SHOW_RESTS": "Show Rests",
"SHOW_SPELL_LEVEL_IF_ALL_SLOTS_ARE_USED": "Show levels if all slots are used",
diff --git a/5eShaped/translations/de.json b/5eShaped/translations/de.json
index 82633c42b7..4e6ff2163a 100644
--- a/5eShaped/translations/de.json
+++ b/5eShaped/translations/de.json
@@ -131,9 +131,9 @@
"CARRIED": "Getragen",
"CARRYING_CAPACITY": "Trage-Kapazität",
"CARRYING_PUSH_DRAG_LIFT": "Ziehen\/Schieben\/ Heben",
- "CASTERS_FULL": "Voll (9. ebene: Barde, Kleriker, Druide, Hexenmeister, Zauberer)",
- "CASTERS_HALF": "Hälfte (5. ebene: Paladin, Waldläufer)",
- "CASTERS_THIRD": "Dritte (3. ebene: Arcane Urbilder)",
+ "CASTERS_4TH": "Dritte (3. ebene: Arcane Urbilder)",
+ "CASTERS_5TH": "Hälfte (5. ebene: Paladin, Waldläufer)",
+ "CASTERS_9TH": "Voll (9. ebene: Barde, Kleriker, Druide, Hexenmeister, Zauberer)",
"CASTING_TIME": "Zauberzeit",
"CHA": "Cha",
"CHALLENGE": "Herausforderung",
@@ -155,7 +155,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +208,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +353,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -642,7 +642,6 @@
"LANGUAGES": "Sprachen",
"LARGE": "Groß",
"LAWFUL_EVIL": "Rechtschaffen böse",
- "LBS": "Pfund",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "Legendäre Aktionen",
"LEGENDARY_ACTIONS_TEXT_1": "The",
@@ -728,9 +727,10 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "Pfund",
"PREPARED": "Vorbereitet",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processing",
"PROF": "Befähigt",
@@ -742,9 +742,9 @@
"PRONE": "Prone",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychischer",
@@ -825,7 +825,7 @@
"SHEET_OUTPUT": "Bogen Ausgabe",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Schild",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
+ "SHORT_OR_LONG_REST": "Short or Long rest",
"SHORT_REST": "Kurze Rast",
"SHOW_ALL": "Zeige alles",
"SHOW_RESTS": "Rast anzeigen",
diff --git a/5eShaped/translations/el.json b/5eShaped/translations/el.json
index 3ca2d0dee1..ba1ca81f98 100644
--- a/5eShaped/translations/el.json
+++ b/5eShaped/translations/el.json
@@ -131,9 +131,9 @@
"CARRIED": "Carried",
"CARRYING_CAPACITY": "Carrying capacity",
"CARRYING_PUSH_DRAG_LIFT": "Push\/Drag\/Lift",
- "CASTERS_FULL": "Full (9th level: Bard, Cleric, Druid, Sorcerer, Wizard)",
- "CASTERS_HALF": "Half (5th level: Paladin, Ranger)",
- "CASTERS_THIRD": "Third (3rd level: Arcane Archetypes)",
+ "CASTERS_4TH": "4th level spellcasting",
+ "CASTERS_5TH": "5th level spellcasting",
+ "CASTERS_9TH": "9th level spellcasting",
"CASTING_TIME": "Casting Time",
"CHA": "Cha",
"CHALLENGE": "Challenge",
@@ -155,7 +155,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +208,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +353,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -642,7 +642,6 @@
"LANGUAGES": "Languages",
"LARGE": "Large",
"LAWFUL_EVIL": "lawful evil",
- "LBS": "lbs",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "Legendary Actions",
"LEGENDARY_ACTIONS_TEXT_1": "The",
@@ -656,7 +655,7 @@
"LIMIT": "Limit",
"LONGER": "Longer",
"LONGSWORD": "Longsword",
- "LONG_REST": "Long Rest",
+ "LONG_REST": "Long rest",
"MACROS": "Macros",
"MANA": "Mana",
"MANIPULATION": "Manipulation",
@@ -728,9 +727,10 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Prepared",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processing",
"PROF": "Prof",
@@ -742,9 +742,9 @@
"PRONE": "Prone",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychic",
@@ -825,8 +825,8 @@
"SHEET_OUTPUT": "Sheet output",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Shield",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
- "SHORT_REST": "Short Rest",
+ "SHORT_OR_LONG_REST": "Short or Long rest",
+ "SHORT_REST": "Short rest",
"SHOW_ALL": "Show all",
"SHOW_RESTS": "Show Rests",
"SHOW_SPELL_LEVEL_IF_ALL_SLOTS_ARE_USED": "Show levels if all slots are used",
diff --git a/5eShaped/translations/en.json b/5eShaped/translations/en.json
index 8da3b7b7e9..310e718716 100644
--- a/5eShaped/translations/en.json
+++ b/5eShaped/translations/en.json
@@ -113,6 +113,8 @@
"BIG": "Big",
"BITE": "Bite",
"BLINDED": "Blinded",
+ "BLINDED_1": "A blinded creature can’t see and automatically fails any ability check that requires sight.",
+ "BLINDED_2": "Attack rolls against the creature have advantage, and the creature’s attack rolls have disadvantage.",
"BLINDSIGHT": "Blindsight",
"BLIND_BEYOND": "blind beyond this radius",
"BLUDGEONING": "bludgeoning",
@@ -130,10 +132,13 @@
"CAN_HAVE": "Can have",
"CARRIED": "Carried",
"CARRYING_CAPACITY": "Carrying capacity",
- "CARRYING_PUSH_DRAG_LIFT": "Push\/Drag\/Lift",
- "CASTERS_FULL": "Full (9th level: Bard, Cleric, Druid, Sorcerer, Wizard)",
- "CASTERS_HALF": "Half (5th level: Paladin, Ranger)",
- "CASTERS_THIRD": "Third (3rd level: Arcane Archetypes)",
+ "CARRYING_CAPACITY_1": "This is the weight that you can carry",
+ "CARRYING_PUSH_DRAG_LIFT": "Push, Drag, or Lift",
+ "CARRYING_PUSH_DRAG_LIFT_FEET": "While pushing or dragging weight in excess of your carrying capacity, your speed drops to 5 feet.",
+ "CARRYING_PUSH_DRAG_LIFT_METERS": "While pushing or dragging weight in excess of your carrying capacity, your speed drops to 1.5 meters.",
+ "CASTERS_4TH": "4th level spellcasting",
+ "CASTERS_5TH": "5th level spellcasting",
+ "CASTERS_9TH": "9th level spellcasting",
"CASTING_TIME": "Casting Time",
"CHA": "Cha",
"CHALLENGE": "Challenge",
@@ -143,6 +148,8 @@
"CHARISMA": "Charisma",
"CHARISMA_SAVING_THROW": "Charisma saving throw",
"CHARMED": "Charmed",
+ "CHARMED_1": "A charmed creature can’t attack the charmer or target the charmer with harmful abilities or magical effects.",
+ "CHARMED_2": "The charmer has advantage on any ability check to interact socially with the creature.",
"CHECK": "Check",
"CHECK_MODIFIER": "Check modifier",
"CHOOSE_WHEN_ROLLING": "Choose when rolling",
@@ -155,7 +162,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’t be charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’t be charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +215,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +240,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +256,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +316,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +360,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -462,6 +469,7 @@
"DARKVISION": "Darkvision",
"DC": "DC",
"DEAFENED": "Deafened",
+ "DEAFENED_1": "A deafened creature can’t hear and automatically fails any ability check that requires hearing.",
"DEATH": "Death",
"DEATH_SAVES": "Death saves",
"DEATH_SAVING_THROW": "Death saving throw",
@@ -506,6 +514,7 @@
"DOCUMENTATION": "Documentation",
"DONT": "Don’t",
"DRAGON": "Dragon",
+ "DROP": "Drop",
"DRUID": "Druid",
"DURATION": "Duration",
"EFFECT": "Effect",
@@ -513,7 +522,12 @@
"EMOTE": "Emote",
"ENCHANTMENT": "Enchantment",
"ENCUMBERED": "Encumbered",
- "ENCUMBERED_HEAVILY": "H. Encumbered",
+ "ENCUMBERED_FEET": "Speed reduced by 10 feet",
+ "ENCUMBERED_HEAVILY": "Heavily Encumbered",
+ "ENCUMBERED_HEAVILY_2": "You have disadvantage on ability checks, attack rolls, and saving throws that use Strength, Dexterity, or Constitution.",
+ "ENCUMBERED_HEAVILY_FEET": "Speed reduced by 20 feet",
+ "ENCUMBERED_HEAVILY_METERS": "Speed reduced by 6 meters",
+ "ENCUMBERED_METERS": "Speed reduced by 3 meters",
"ENCUMBRANCE_MULTIPLIER": "Encumbrance multiplier",
"ENGINEERING": "Engineering",
"EQUIPMENT": "Equipment",
@@ -557,12 +571,18 @@
"FREEFORM": "Freeform",
"FREETEXT": "Freetext",
"FRIGHTENED": "Frightened",
+ "FRIGHTENED_1": "A frightened creature has disadvantage on ability checks and attack rolls while the source of its fear is within line of sight.",
+ "FRIGHTENED_2": "The creature can’t willingly move closer to the source of its fear.",
"GARGANTUAN": "Gargantuan",
"GENDER": "Gender",
+ "GENERATE": "Generate",
"GENERATE_SKILLS": "Generate skills",
"GM": "GM",
"GOLD_PIECES": "Gold pieces",
"GRAPPLED": "Grappled",
+ "GRAPPLED_1": "A grappled creature’s speed becomes 0, and it can’t benefit from any bonus to its speed.",
+ "GRAPPLED_2": "The condition ends if the grappler is incapacitated (see the condition).",
+ "GRAPPLED_3": "The condition also ends if an effect removes the grappled creature from the reach of the grappler or grappling effect, such as when a creature is hurled away by the thunderwave spell.",
"HAIR": "Hair",
"HALF": "Half",
"HALFLING_LUCK": "Halfling Luck",
@@ -615,6 +635,7 @@
"ILLUSION": "Illusion",
"IMPORT": "Import",
"INCAPACITATED": "Incapacitated",
+ "INCAPACITATED_1": "An incapacitated creature can’t take actions or reactions.",
"INFLUENCE": "Influence",
"INITIATIVE": "Initiative",
"INNATE_SPELLCASTING": "Innate Spellcasting",
@@ -634,16 +655,20 @@
"INTIMIDATION": "Intimidation",
"INVESTIGATION": "Investigation",
"INVISIBLE": "Invisible",
+ "INVISIBLE_1": "An invisible creature is impossible to see without the aid of magic or a special sense. For the purpose of hiding, the creature is heavily obscured. The creature’s location can be detected by any noise it makes or any tracks it leaves.",
+ "INVISIBLE_2": "Attack rolls against the creature have disadvantage, and the creature’s attack rolls have advantage.",
"JACK_OF_ALL_TRADES": "Jack of all trades",
"KI": "Ki",
"KILOGRAMS": "Kilograms",
+ "KILOGRAMS_SHORT": "kg",
"KNOWN": "Known",
"LAIR_ACTIONS": "Lair Actions",
"LANGUAGES": "Languages",
"LARGE": "Large",
"LAWFUL_EVIL": "lawful evil",
- "LBS": "lbs",
"LEATHER": "Leather",
+ "LEGACY": "Legacy",
+ "LEGACY_TOOLTIP": "This cannot be used with all sheet features",
"LEGENDARY_ACTIONS": "Legendary Actions",
"LEGENDARY_ACTIONS_TEXT_1": "The",
"LEGENDARY_ACTIONS_TEXT_2": "can take",
@@ -656,7 +681,7 @@
"LIMIT": "Limit",
"LONGER": "Longer",
"LONGSWORD": "Longsword",
- "LONG_REST": "Long Rest",
+ "LONG_REST": "Long rest",
"MACROS": "Macros",
"MANA": "Mana",
"MANIPULATION": "Manipulation",
@@ -707,6 +732,10 @@
"OUTPUT": "Output",
"PALADIN": "Paladin",
"PARALYZED": "Paralyzed",
+ "PARALYZED_1": "A paralyzed creature is incapacitated (see the condition) and can’t move or speak.",
+ "PARALYZED_2": "The creature automatically fails Strength and Dexterity saving throws.",
+ "PARALYZED_3": "Attack rolls against the creature have advantage.",
+ "PARALYZED_4": "Any attack that hits the creature is a critical hit if the attacker is within 5 feet of the creature.",
"PASSIVE": "Passive",
"PASSIVE_ABILITY_CHECK": "Passive ability check",
"PASSIVE_SKILLS": "Passive skills",
@@ -718,6 +747,12 @@
"PER_LEVEL": "per level",
"PER_USE": "per use",
"PETRIFIED": "Petrified",
+ "PETRIFIED_1": "A petrified creature is transformed, along with any nonmagical object it is wearing or carrying, into a solid inanimate substance (usually stone). Its weight increases by a factor of ten, and it ceases aging.",
+ "PETRIFIED_2": "The creature is incapacitated (see the condition), can’t move or speak, and is unaware of its surroundings.",
+ "PETRIFIED_3": "Attack rolls against the creature have advantage.",
+ "PETRIFIED_4": "The creature automatically fails Strength and Dexterity saving throws.",
+ "PETRIFIED_5": "The creature has resistance to all damage.",
+ "PETRIFIED_6": "The creature is immune to poison and disease, although a poison or disease already in its system is suspended, not neutralized.",
"PIERCING": "piercing",
"PLATINUM_PIECES": "Platinum pieces",
"PLUS": "plus",
@@ -725,12 +760,14 @@
"POINTS_OF_ORIGIN": "Points of origin",
"POISON": "poison",
"POISONED": "Poisoned",
+ "POISONED_1": "A poisoned creature has disadvantage on attack rolls and ability checks.",
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Prepared",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processing",
"PROF": "Prof",
@@ -740,11 +777,14 @@
"PROFICIENT": "Proficient",
"PROFICIENT_ARMOR_WEIGHS": "Armor that you are proficient in weighs",
"PRONE": "Prone",
+ "PRONE_1": "A prone creature’s only movement option is to crawl, unless it stands up and thereby ends the condition.",
+ "PRONE_2": "The creature has disadvantage on attack rolls.",
+ "PRONE_3": "An attack roll against the creature has advantage if the attacker is within 5 feet of the creature. Otherwise, the attack roll has disadvantage.",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychic",
@@ -795,6 +835,9 @@
"RESOURCES": "Resources",
"REST": "Rest",
"RESTRAINED": "Restrained",
+ "RESTRAINED_1": "A restrained creature’s speed becomes 0, and it can’t benefit from any bonus to its speed.",
+ "RESTRAINED_2": "Attack rolls against the creature have advantage, and the creature’s attack rolls have disadvantage.",
+ "RESTRAINED_3": "The creature has disadvantage on Dexterity saving throws.",
"RING": "Ring",
"RITUAL": "Ritual",
"ROGUE": "Rogue",
@@ -825,8 +868,8 @@
"SHEET_OUTPUT": "Sheet output",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Shield",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
- "SHORT_REST": "Short Rest",
+ "SHORT_OR_LONG_REST": "Short or Long rest",
+ "SHORT_REST": "Short rest",
"SHOW_ALL": "Show all",
"SHOW_RESTS": "Show Rests",
"SHOW_SPELL_LEVEL_IF_ALL_SLOTS_ARE_USED": "Show levels if all slots are used",
@@ -866,6 +909,7 @@
"SKIN": "Skin",
"SLASHING": "slashing",
"SLEIGHTOFHAND": "Sleight of Hand",
+ "SLOT": "Slot",
"SLOTS": "Slots",
"SMALL": "Small",
"SOCIETY": "Society",
@@ -910,6 +954,9 @@
"STR_13": "Str 13",
"STR_15": "Str 15",
"STUNNED": "Stunned",
+ "STUNNED_1": "A stunned creature is incapacitated (see the condition), can’t move, and can speak only falteringly.",
+ "STUNNED_2": "The creature automatically fails Strength and Dexterity saving throws.",
+ "STUNNED_3": "Attack rolls against the creature have advantage.",
"SUCCESSES": "Successes",
"SUMMONER": "Summoner",
"SURVIVAL": "Survival",
@@ -936,6 +983,11 @@
"TYPE": "Type",
"UNARMORED": "Unarmored",
"UNCONSCIOUS": "Unconscious",
+ "UNCONSCIOUS_1": "An unconscious creature is incapacitated (see the condition), can’t move or speak, and is unaware of its surroundings.",
+ "UNCONSCIOUS_2": "The creature drops whatever it’s holding and falls prone.",
+ "UNCONSCIOUS_3": "The creature automatically fails Strength and Dexterity saving throws.",
+ "UNCONSCIOUS_4": "Attack rolls against the creature have advantage.",
+ "UNCONSCIOUS_5": "Any attack that hits the creature is a critical hit if the attacker is within 5 feet of the creature.",
"UNPROFICIENT": "Unproficient",
"UNTIL_DISPELLED": "Until dispelled",
"UNTIL_DISPELLED_OR_TRIGGERED": "Until dispelled or triggered",
diff --git a/5eShaped/translations/es.json b/5eShaped/translations/es.json
index 3ca2d0dee1..ba1ca81f98 100644
--- a/5eShaped/translations/es.json
+++ b/5eShaped/translations/es.json
@@ -131,9 +131,9 @@
"CARRIED": "Carried",
"CARRYING_CAPACITY": "Carrying capacity",
"CARRYING_PUSH_DRAG_LIFT": "Push\/Drag\/Lift",
- "CASTERS_FULL": "Full (9th level: Bard, Cleric, Druid, Sorcerer, Wizard)",
- "CASTERS_HALF": "Half (5th level: Paladin, Ranger)",
- "CASTERS_THIRD": "Third (3rd level: Arcane Archetypes)",
+ "CASTERS_4TH": "4th level spellcasting",
+ "CASTERS_5TH": "5th level spellcasting",
+ "CASTERS_9TH": "9th level spellcasting",
"CASTING_TIME": "Casting Time",
"CHA": "Cha",
"CHALLENGE": "Challenge",
@@ -155,7 +155,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +208,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +353,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -642,7 +642,6 @@
"LANGUAGES": "Languages",
"LARGE": "Large",
"LAWFUL_EVIL": "lawful evil",
- "LBS": "lbs",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "Legendary Actions",
"LEGENDARY_ACTIONS_TEXT_1": "The",
@@ -656,7 +655,7 @@
"LIMIT": "Limit",
"LONGER": "Longer",
"LONGSWORD": "Longsword",
- "LONG_REST": "Long Rest",
+ "LONG_REST": "Long rest",
"MACROS": "Macros",
"MANA": "Mana",
"MANIPULATION": "Manipulation",
@@ -728,9 +727,10 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Prepared",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processing",
"PROF": "Prof",
@@ -742,9 +742,9 @@
"PRONE": "Prone",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychic",
@@ -825,8 +825,8 @@
"SHEET_OUTPUT": "Sheet output",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Shield",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
- "SHORT_REST": "Short Rest",
+ "SHORT_OR_LONG_REST": "Short or Long rest",
+ "SHORT_REST": "Short rest",
"SHOW_ALL": "Show all",
"SHOW_RESTS": "Show Rests",
"SHOW_SPELL_LEVEL_IF_ALL_SLOTS_ARE_USED": "Show levels if all slots are used",
diff --git a/5eShaped/translations/fr.json b/5eShaped/translations/fr.json
index d62c76b89c..9ed170b536 100644
--- a/5eShaped/translations/fr.json
+++ b/5eShaped/translations/fr.json
@@ -131,9 +131,9 @@
"CARRIED": "Porté",
"CARRYING_CAPACITY": "Capacité de charge",
"CARRYING_PUSH_DRAG_LIFT": "Pousse\/Tire\/Lève",
- "CASTERS_FULL": "Total (9e niveau : Barde, Clerc, Druide, Ensorceleur, Magicien)",
- "CASTERS_HALF": "Moitié (5e niveau : Paladin, Rôdeur)",
- "CASTERS_THIRD": "Tiers (3e niveau : archétypes d’arcane)",
+ "CASTERS_4TH": "Tiers (3e niveau : archétypes d’arcane)",
+ "CASTERS_5TH": "Moitié (5e niveau : Paladin, Rôdeur)",
+ "CASTERS_9TH": "Total (9e niveau : Barde, Clerc, Druide, Ensorceleur, Magicien)",
"CASTING_TIME": "Temps d’incantation",
"CHA": "Cha",
"CHALLENGE": "FP",
@@ -642,7 +642,6 @@
"LANGUAGES": "Langues",
"LARGE": "Grande",
"LAWFUL_EVIL": "loyal mauvais",
- "LBS": "lbs.",
"LEATHER": "Cuir",
"LEGENDARY_ACTIONS": "Actions légendaires",
"LEGENDARY_ACTIONS_TEXT_1": "Un(e)",
@@ -728,6 +727,7 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion de soins",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Préparé",
"PREPARED_MATTERS": "Sorts prép. important",
"PROCESSING_CLOSE_MESSAGE": "Si l’image bouge à une vitesse normale et si la fiche de perso est fluide, vous pouvez :",
@@ -742,9 +742,9 @@
"PRONE": "À terre",
"PSION": "Psion",
"PSIONICS": "Psioniques",
- "PSIONICS_FULL": "Psionic Complet (Psion)",
- "PSIONICS_HALF": "Psionic Demi (Soulknife)",
- "PSIONICS_THIRD": "Psionic Tier (Cryptic)",
+ "PSIONICS_4TH": "Psionic Tier (Cryptic)",
+ "PSIONICS_5TH": "Psionic Demi (Soulknife)",
+ "PSIONICS_9TH": "Psionic Complet (Psion)",
"PSI_LIMIT": "Limite Psi",
"PSI_POINTS": "Points Psi",
"PSYCHIC": "Psychique",
diff --git a/5eShaped/translations/he.json b/5eShaped/translations/he.json
index 3ca2d0dee1..ba1ca81f98 100644
--- a/5eShaped/translations/he.json
+++ b/5eShaped/translations/he.json
@@ -131,9 +131,9 @@
"CARRIED": "Carried",
"CARRYING_CAPACITY": "Carrying capacity",
"CARRYING_PUSH_DRAG_LIFT": "Push\/Drag\/Lift",
- "CASTERS_FULL": "Full (9th level: Bard, Cleric, Druid, Sorcerer, Wizard)",
- "CASTERS_HALF": "Half (5th level: Paladin, Ranger)",
- "CASTERS_THIRD": "Third (3rd level: Arcane Archetypes)",
+ "CASTERS_4TH": "4th level spellcasting",
+ "CASTERS_5TH": "5th level spellcasting",
+ "CASTERS_9TH": "9th level spellcasting",
"CASTING_TIME": "Casting Time",
"CHA": "Cha",
"CHALLENGE": "Challenge",
@@ -155,7 +155,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +208,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +353,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -642,7 +642,6 @@
"LANGUAGES": "Languages",
"LARGE": "Large",
"LAWFUL_EVIL": "lawful evil",
- "LBS": "lbs",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "Legendary Actions",
"LEGENDARY_ACTIONS_TEXT_1": "The",
@@ -656,7 +655,7 @@
"LIMIT": "Limit",
"LONGER": "Longer",
"LONGSWORD": "Longsword",
- "LONG_REST": "Long Rest",
+ "LONG_REST": "Long rest",
"MACROS": "Macros",
"MANA": "Mana",
"MANIPULATION": "Manipulation",
@@ -728,9 +727,10 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Prepared",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processing",
"PROF": "Prof",
@@ -742,9 +742,9 @@
"PRONE": "Prone",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychic",
@@ -825,8 +825,8 @@
"SHEET_OUTPUT": "Sheet output",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Shield",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
- "SHORT_REST": "Short Rest",
+ "SHORT_OR_LONG_REST": "Short or Long rest",
+ "SHORT_REST": "Short rest",
"SHOW_ALL": "Show all",
"SHOW_RESTS": "Show Rests",
"SHOW_SPELL_LEVEL_IF_ALL_SLOTS_ARE_USED": "Show levels if all slots are used",
diff --git a/5eShaped/translations/it.json b/5eShaped/translations/it.json
index 6a6c6b5ee9..db0b684d56 100644
--- a/5eShaped/translations/it.json
+++ b/5eShaped/translations/it.json
@@ -55,9 +55,9 @@
"ABILITY": "Caratteristica",
"ABILITY_CHECK": "Prova di caratteristica",
"ABILITY_CHECKS": "Prove di caratteristica",
- "ABILITY_CHECKS_QUERY": "Verifica del test di abilità",
- "ABILITY_CHECK_MODIFIER": "Ability check modifier",
- "ABILITY_SCORE": "Ability score",
+ "ABILITY_CHECKS_QUERY": "Verifica della prova di abilità",
+ "ABILITY_CHECK_MODIFIER": "Modificatore della prova di abilità",
+ "ABILITY_SCORE": "Punteggio di caratteristica",
"ABILITY_SCORES": "Punteggi di caratteristica",
"ABJURATION": "Abiurazione",
"AC": "CA",
@@ -68,11 +68,11 @@
"AC_ARMORED": "CA in armatura",
"AC_UNARMORED": "CA senza armatura",
"AC_UNARMORED_ABILITY": "Bonus difesa senza armatura",
- "ADD_COMMON_ITEMS": "Add common items",
+ "ADD_COMMON_ITEMS": "Aggiungi oggetti comuni",
"ADD_HALF_PROFICIENCY_TO_UNPROFICIENT_SAVING_THROWS": "Aggiungi metà competenza ai tiri salvezza senza competenza",
"ADVANTAGE": "Vantaggio",
- "ADVANTAGE+": "Advantage+",
- "ADVENTURING_GEAR": "Adventuring gear",
+ "ADVANTAGE+": "Vantaggio+",
+ "ADVENTURING_GEAR": "Equipaggiamento da avventura",
"AGE": "Età",
"ALIGNMENT": "Allineamento",
"ALL": "Tutto",
@@ -80,7 +80,7 @@
"AMMO_AUTO_USE": "Usa munizioni automaticamente",
"AMMO_WEIGHT": "Peso munizioni",
"AMPHIBIOUS": "Anfibio",
- "AMULET": "Amulet",
+ "AMULET": "Amuleto",
"ANIMALHANDLING": "Addestrare Animali",
"API": "API",
"APPEARANCE": "Aspetto",
@@ -88,25 +88,25 @@
"ARMOR": "Armatura",
"ARMOR_CLASS": "Classe armatura",
"ARROWS": "Frecce",
- "ARTIFICER": "Artificer (2017)",
+ "ARTIFICER": "Artefice",
"AS": "come",
"ATHLETICS": "Atletica",
"ATK": "ATT",
"ATTACHERS": "Aggiunte",
"ATTACK": "Attacco",
"ATTACKS": "Attacchi",
- "ATTACK_MODIFIER": "Attack modifier",
- "AT_WILL": "at will",
- "AUTO": "Auto",
- "AUTOMATICALLY_EXPEND_SPELL_RESOURCES": "Automatically expend spell resources",
- "AUTOMATICALLY_ROLL_DAMAGE_FOR_ATTACKS": "Automatically roll damage for attacks",
- "AUTOMATICALLY_ROLL_DAMAGE_FOR_SAVING_THROWS": "Automatically roll damage for saving throws",
+ "ATTACK_MODIFIER": "Modificatore d'attacco",
+ "AT_WILL": "A volontà",
+ "AUTO": "Automatico",
+ "AUTOMATICALLY_EXPEND_SPELL_RESOURCES": "Spendi automaticamente risorse per gli incantesimi",
+ "AUTOMATICALLY_ROLL_DAMAGE_FOR_ATTACKS": "Tira automaticamente il danno degli attacchi",
+ "AUTOMATICALLY_ROLL_DAMAGE_FOR_SAVING_THROWS": "Tira automaticamente il danno per i tiri salvezza",
"AUTOMATIC_HIGHER_LEVEL_QUERIES": "Automatic higher level queries",
"AUTO_REVERT_ADV": "Ripristina (s)vantaggio automaticamente",
- "AVERAGE_OF_ABILITIES": "Average of the highest 1 or 2 abilities",
- "AVG": "avg",
+ "AVERAGE_OF_ABILITIES": "Media delle 1 o 2 abilità più alte",
+ "AVG": "MED",
"BACKGROUND": "Background",
- "BACKSTORY": "Trascorsi",
+ "BACKSTORY": "Antefatto",
"BARBARIAN": "Barbaro",
"BARD": "Bardo",
"BASE_DC": "CD di base",
@@ -121,19 +121,19 @@
"BONUSES": "Bonus",
"BONUSES_AND_PENALTIES": "Bonus e penalità",
"BONUSES_AND_PENALTIES_TOOLTIP": "Aggiungi un bonus\/penalità automaticamente ai tiri fatti usando le macro della scheda. Utilizzo: se ottieni un oggetto magico che fornisce +1 al CD di salvezza dei tuoi incantesimi, inserisci 1 nel campo CD di salvezza incantesimi. Se sei sotto gli effetti dell’incantesimo Benedire, inserisci “d4cs0cf0” in entrambi i campi di tiro per colpire e tiri salvezza.",
- "BRAWN": "Brawn",
- "BREAK_TIES": "Ignora parità",
+ "BRAWN": "Vigore",
+ "BREAK_TIES": "Risolvere il pareggio",
"BURROW": "Scavare",
"CANCEL": "Cancella",
"CANTRIP": "Trucchetto",
"CANTRIPS": "Trucchetti",
"CAN_HAVE": "Può avere",
- "CARRIED": "Portato",
+ "CARRIED": "Trasportato",
"CARRYING_CAPACITY": "Capacità di carico",
"CARRYING_PUSH_DRAG_LIFT": "Spingere\/Trascinare\/Sollevare",
- "CASTERS_FULL": "Completo (9° livello: Bardo, Chierico, Druido, Stregone, Mago)",
- "CASTERS_HALF": "Medio (5° livello: Paladino, Ranger)",
- "CASTERS_THIRD": "Terzo (3° livello: Archetipi arcani)",
+ "CASTERS_4TH": "Terzo (3° livello: Archetipi arcani)",
+ "CASTERS_5TH": "Medio (5° livello: Paladino, Ranger)",
+ "CASTERS_9TH": "Completo (9° livello: Bardo, Chierico, Druido, Stregone, Mago)",
"CASTING_TIME": "Tempo di lancio",
"CHA": "Car",
"CHALLENGE": "GS",
@@ -144,37 +144,37 @@
"CHARISMA_SAVING_THROW": "Tiro salvezza su Carisma",
"CHARMED": "Charmed",
"CHECK": "Prova",
- "CHECK_MODIFIER": "Check modifier",
- "CHOOSE_WHEN_ROLLING": "Choose when rolling",
+ "CHECK_MODIFIER": "Modificatore della prova",
+ "CHOOSE_WHEN_ROLLING": "Scegli al momento del lancio",
"CLASS": "Classe",
"CLASS_AND_LEVEL": "Classe e livello",
"CLASS_AND_LEVEL_PLACEHOLDER": "Generati dopo aver aggiunto una classe nella tab “Personaggio”",
- "CLASS_FEATURES": "Class features",
- "CLASS_FEATURE_ARTIFICER_INFUSE_MAGIC": "Infuse Magic",
- "CLASS_FEATURE_ARTIFICER_INFUSE_MAGIC_TEXT": "You gain the ability to channel your artificer spells into objects for later use. When you cast an artificer spell with a casting time of 1 action, you can increase its casting time to 1 minute. If you do so and hold a nonmagical item throughout the casting, you expend a spell slot, but none of the spell’s effects occur. Instead, the spell transfers into that item for later use if the item doesn’t already contain a spell from this feature.\nAny creature holding the item thereafter can use an action to activate the spell if the creature has an Intelligence score of at least 6. The spell is cast using your spellcasting ability, targeting the creature that activates the item. If the spell targets more than one creature, the creature that activates the item selects the additional targets. If the spell has an area of effect, it is centered on the item. If the spell’s range is self, it targets the creature that activates the item.\nWhen you infuse a spell in this way, it must be used within 8 hours. After that time, its magic fades and is wasted.\nYou can have a limited number of infused spells at the same time. The number equals your Intelligence modifier.",
- "CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
+ "CLASS_FEATURES": "Caratteristiche della classe",
+ "CLASS_FEATURE_ARTIFICER_INFUSE_MAGIC": "Infondi magia",
+ "CLASS_FEATURE_ARTIFICER_INFUSE_MAGIC_TEXT": "Guadagni l'abilità di incanalare i tuoi incantesimi artefice in oggetti, per un successivo uso. Quando lanci un incantesimo artificio con un tempo di lancio di 1 azione, puoi aumentare il suo tempo di lancio ad 1 minuto. Se scegli di fare così e reggi in mano un oggetto non magico durante il lancio dell'incantesimo, spendi uno slot incantesimi, ma nessuno degli effetti dell'incantesimo si verifica. Piuttosto, l'incantesimo si trasferisce in quell'oggetto per un uso successivo, solo però se l'oggetto non contiene già un altro incantesimo da un precedente utilizzo di quest'abilità.\nQualsiasi creatura che regge in mano l'oggetto può in seguito usare un'azione per attivare l'incantesimo, se e solo se la creatura ha un punteggio di Intelligenza di almeno 6. L'incantesimo viene lanciato utilizzando la tua abilità di lancio incantesimi, scegliendo come bersaglio la creatura che attiva l'oggetto. Se l'incantesimo ha come bersaglio più di una creatura, la creatura che attiva l'oggetto sceglie i bersagli addizionali. Se l'incantesimo ha un'area di effetto, è centrato sull'oggetto. Se il raggio dell'incantesimo è 'se stesso', il bersaglio è la creatura che attiva l'oggetto.\nQuando infondi un incantesimo in un oggetto in questo modo, deve essere utilizzato entro 8 ore. Successivamente, la sua carica magica svanisce e viene sprecata.\nPuoi solo avere un numero limitato di incantesimi infusi contemporaneamente. Tale numero equivale al tuo modificatore di Intelligenza.",
+ "CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Analisi dell'oggetto magico",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
- "CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Servitore meccanico",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Le tue ricerche e la maestria nella tua arte ti consentono di creare un servitore meccanico. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Anima dell'Artefice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
- "CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
- "CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT_TEXT": "Your superior understanding of magic items allows you to master their use. You can now attune to up to four, rather than three, magic items at a time.\nAt 15th level, this limit increases to five magic items.",
- "CLASS_FEATURE_ARTIFICER_TOOL_EXPERTISE": "Tool Expertise",
+ "CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Sintonia Superiore",
+ "CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT_TEXT": "La tua comprensione superiore degli oggetti magici ti consente di avere maestria nel loro utilizzo. You can now attune to up to four, rather than three, magic items at a time.\nAt 15th level, this limit increases to five magic items.",
+ "CLASS_FEATURE_ARTIFICER_TOOL_EXPERTISE": "Esperto di attrezzi",
"CLASS_FEATURE_ARTIFICER_TOOL_EXPERTISE_TEXT": "Your proficiency bonus is doubled for any ability check you make that uses any of the tool proficiencies you gain from this class.",
- "CLASS_FEATURE_ARTIFICER_WONDROUS_INVENTION": "Wondrous Invention",
+ "CLASS_FEATURE_ARTIFICER_WONDROUS_INVENTION": "Meravigliosa Invenzione",
"CLASS_FEATURE_ARTIFICER_WONDROUS_INVENTION_TEXT": "You gain the use of a magic item that you have crafted. Choose the item from the list of 2nd-level items below.\nCrafting an item is a difficult task. When you gain a magic item from this feature, it reflects long hours of study, tinkering, and experimentation that allowed you to finally complete the item. You are assumed to work on this item in your leisure time and to finish it when you level up.\nYou complete another item of your choice when you reach certain levels in this class: 5th, 10th, 15th, and 20th level. The item you choose must be on the list for your current artificer level or a lower level. These magic items are detailed in the Dungeon Master’s Guide.\n2nd Level: bag of holding, cap of water breathing, driftglobe, goggles of night, sending stones\n5th Level: alchemy jug, helm of comprehending languages, lantern of revealing, ring of swimming, robe of useful items, rope of climbing, wand of magic detection, wand of secrets\n10th Level: bag of beans, chime of opening, decanter of endless water, eyes of minute seeing, folding boat, Heward’s handy haversack\n15th Level: boots of striding and springing, bracers of archery, brooch of shielding, broom of flying, hat of disguise, slippers of spider climbing\n20th Level: eyes of the eagle, gem of brightness, gloves of missile snaring, gloves of swimming and climbing, ring of jumping, ring of mind shielding, wings of flying",
- "CLASS_FEATURE_BARBARIAN_BRUTAL_CRITICAL": "Brutal Critical",
+ "CLASS_FEATURE_BARBARIAN_BRUTAL_CRITICAL": "Colpo critico brutale",
"CLASS_FEATURE_BARBARIAN_BRUTAL_CRITICAL_TEXT": "You can roll one additional weapon damage die when determining the extra damage for a critical hit with a melee attack.\nThis increases to two additional dice at 13th level and three additional dice at 17th level.",
- "CLASS_FEATURE_BARBARIAN_DANGER_SENSE": "Danger Sense",
+ "CLASS_FEATURE_BARBARIAN_DANGER_SENSE": "Senso del pericolo",
"CLASS_FEATURE_BARBARIAN_DANGER_SENSE_TEXT": "You have advantage on Dexterity saving throws against effects that you can see, such as traps and spells. To gain this benefit, you can’t be blinded, deafened, or incapacitated.",
- "CLASS_FEATURE_BARBARIAN_EXTRA_ATTACK": "Extra Attack (Barbarian)",
+ "CLASS_FEATURE_BARBARIAN_EXTRA_ATTACK": "Attacco extra (Barbaro)",
"CLASS_FEATURE_BARBARIAN_EXTRA_ATTACK_TEXT": "You can attack twice, instead of once, whenever you take the Attack action on your turn.",
- "CLASS_FEATURE_BARBARIAN_FAST_MOVEMENT": "Fast Movement",
- "CLASS_FEATURE_BARBARIAN_FAST_MOVEMENT_TEXT": "Your speed increases by 10 feet while you aren’t wearing heavy armor.",
- "CLASS_FEATURE_BARBARIAN_FERAL_INSTINCT": "Feral Instinct",
+ "CLASS_FEATURE_BARBARIAN_FAST_MOVEMENT": "Movimento rapido",
+ "CLASS_FEATURE_BARBARIAN_FAST_MOVEMENT_TEXT": "La tua velocità aumenta di 10 piedi (3 metri), solo se non stai indossando un'armatura pesante.",
+ "CLASS_FEATURE_BARBARIAN_FERAL_INSTINCT": "Istinto selvaggio",
"CLASS_FEATURE_BARBARIAN_FERAL_INSTINCT_TEXT": "Your instincts are so honed that you have advantage on initiative rolls.\nAdditionally, if you are surprised at the beginning of combat and aren’t incapacitated, you can act normally on your first turn, but only if you enter your rage before doing anything else on that turn.",
- "CLASS_FEATURE_BARBARIAN_INDOMITABLE_MIGHT": "Indomitable Might",
+ "CLASS_FEATURE_BARBARIAN_INDOMITABLE_MIGHT": "Potenza indomita",
"CLASS_FEATURE_BARBARIAN_INDOMITABLE_MIGHT_TEXT": "If your total for a Strength check is less than your Strength score, you can use that score in place of the total.",
"CLASS_FEATURE_BARBARIAN_PERSISTENT_RAGE": "Persistent Rage",
"CLASS_FEATURE_BARBARIAN_PERSISTENT_RAGE_TEXT": "Your rage is so fierce that it ends early only if you fall unconscious or if you choose to end it.",
@@ -194,22 +194,22 @@
"CLASS_FEATURE_BARD_COUNTERCHARM_TEXT": "You gain the ability to use musical notes or words of power to disrupt mind-influencing effects. As an action, you can start a performance that lasts until the end of your next turn. During that time, you and any friendly creatures within 30 feet of you have advantage on saving throws against being frightened or charmed. A creature must be able to hear you to gain this benefit. The performance ends early if you are incapacitated or silenced or if you voluntarily end it (no action required).",
"CLASS_FEATURE_BARD_EXPERTISE": "Competente",
"CLASS_FEATURE_BARD_EXPERTISE_TEXT": "Choose two of your skill proficiencies. Your proficiency bonus is doubled for any ability check you make that uses either of the chosen proficiencies.\nAt 10th level, you can choose another two skill proficiencies to gain this benefit.",
- "CLASS_FEATURE_BARD_JACK_OF_ALL_TRADES": "Jack of All Trades",
- "CLASS_FEATURE_BARD_JACK_OF_ALL_TRADES_TEXT": "You can add half your proficiency bonus, rounded down, to any ability check you make that doesn’t already include your proficiency bonus.",
+ "CLASS_FEATURE_BARD_JACK_OF_ALL_TRADES": "Tuttofare",
+ "CLASS_FEATURE_BARD_JACK_OF_ALL_TRADES_TEXT": "Puoi aggiungere metà del tuo bonus di competenza, arrotondato per difetto, a qualsiasi check di abilità che non includa già il tuo bonus di competenza.",
"CLASS_FEATURE_BARD_MAGICAL_SECRETS": "Magical Secrets",
"CLASS_FEATURE_BARD_MAGICAL_SECRETS_TEXT": "You have plundered magical knowledge from a wide spectrum of disciplines. Choose two spells from any class, including this one. A spell you choose must be of a level you can cast, as shown on the Bard table, or a cantrip.\nThe chosen spells count as bard spells for you and are included in the number in the Spells Known column of the Bard table.\nYou learn two additional spells from any class at 14th level and again at 18th level.",
"CLASS_FEATURE_BARD_SONG_OF_REST": "Song of Rest",
"CLASS_FEATURE_BARD_SONG_OF_REST_TEXT": "You can use soothing music or oration to help revitalize your wounded allies during a short rest. If you or any friendly creatures who can hear your performance regain hit points at the end of the short rest by spending one or more Hit Dice, each of those creatures regains extra hit points.",
- "CLASS_FEATURE_BARD_SUPERIOR_INSPIRATION": "Superior Inspiration",
+ "CLASS_FEATURE_BARD_SUPERIOR_INSPIRATION": "Ispirazione Superiore",
"CLASS_FEATURE_BARD_SUPERIOR_INSPIRATION_TEXT": "When you roll initiative and have no uses of Bardic Inspiration left, you regain one use.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY": "Channel Divinity",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TEXT": "You gain the ability to channel divine energy directly from your deity, using that energy to fuel magical effects. You start with two such effects: Turn Undead and an effect determined by your domain. Some domains grant you additional effects as you advance in levels, as noted in the domain description",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD": "Turn Undead (Channel Divinity)",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
- "CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Intervento divino",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_DRUID_ARCHDRUID": "Arcidruido",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
"CLASS_FEATURE_DRUID_BEAST_SPELLS_TEXT": "You can cast many of your druid spells in any shape you assume using Wild Shape. You can perform the somatic and verbal components of a druid spell while in a beast shape, but you aren’t able to provide material components",
@@ -224,18 +224,18 @@
"CLASS_FEATURE_FIGHTER_ACTION_SURGE": "Action Surge",
"CLASS_FEATURE_FIGHTER_ACTION_SURGE_TEXT": "On your turn, you can take one additional action on top of your regular action and a possible bonus action.",
"CLASS_FEATURE_FIGHTER_CHAMPION_REMARKABLE_ATHLETE": "Remarkable Athlete",
- "CLASS_FEATURE_FIGHTER_EXTRA_ATTACK": "Extra Attack (Fighter)",
+ "CLASS_FEATURE_FIGHTER_EXTRA_ATTACK": "Attacco extra (Guerriero)",
"CLASS_FEATURE_FIGHTER_EXTRA_ATTACK_TEXT": "You can attack twice, instead of once, whenever you take the Attack action on your turn.\nThe number of attacks increases to three when you reach 11th level in this class and to four when you reach 20th level in this class.",
- "CLASS_FEATURE_FIGHTER_FIGHTING_STYLE": "Fighting Style (Fighter)",
+ "CLASS_FEATURE_FIGHTER_FIGHTING_STYLE": "Stile di combattimento (Guerriero)",
"CLASS_FEATURE_FIGHTER_FIGHTING_STYLE_TEXT": "You adopt a particular style of fighting as your specialty. Choose one of the following options. You can’t take a Fighting Style option more than once, even if you later get to choose again.\n\nArchery\nYou gain a +2 bonus to attack rolls you make with ranged weapons.\n\nDefense\nWhile you are wearing armor, you gain a +1 bonus to AC.\n\nDueling\nWhen you are wielding a melee weapon in one hand and no other weapons, you gain a +2 bonus to damage rolls with that weapon.\n\nGreat Weapon Fighting\nWhen you roll a 1 or 2 on a damage die for an attack you make with a melee weapon that you are wielding with two hands, you can reroll the die and must use the new roll, even if the new roll is a 1 or a 2. The weapon must have the two-handed or versatile property for you to gain this benefit.\n\nProtection\nWhen a creature you can see attacks a target other than you that is within 5 feet of you, you can use your reaction to impose disadvantage on the attack roll. You must be wielding a shield.\n\nTwo-Weapon Fighting\nWhen you engage in two-weapon fighting, you can add your ability modifier to the damage of the second attack.",
- "CLASS_FEATURE_FIGHTER_INDOMITABLE": "Indomitable",
- "CLASS_FEATURE_FIGHTER_INDOMITABLE_TEXT": "You can reroll a saving throw that you fail. If you do so, you must use the new roll.",
+ "CLASS_FEATURE_FIGHTER_INDOMITABLE": "Indomito",
+ "CLASS_FEATURE_FIGHTER_INDOMITABLE_TEXT": "Puoi ritirare un tiro salvezza che hai fallito.Se decidi di farlo, devi usare il risultato del nuovo lancio.",
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
- "CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
- "CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DIAMOND_SOUL": "Anima di diamante",
+ "CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "La tua maestria del ki ti garantisce un bonus di competenza in tutti i tiri salvezza.\nInoltre, ogni qual volta fai un tiro salvezza e fallisci, puoi spendere 1 punto di ki per ritirare il tiro salvezza, ma devi tenere il secondo risultato.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
"CLASS_FEATURE_MONK_EMPTY_BODY_TEXT": "You can use your action to spend 4 ki points to become invisible for 1 minute. During that time, you also have resistance to all damage but force damage.\nAdditionally, you can spend 8 ki points to cast the astral projection spell, without needing material components. When you do so, you can’t take any other creatures with you.",
"CLASS_FEATURE_MONK_EVASION": "Evasion",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -340,7 +340,7 @@
"CLASS_FEATURE_ROGUE_CUNNING_ACTION_TEXT": "Your quick thinking and agility allow you to move and act quickly. You can take a bonus action on each of your turns in combat. This action can be used only to take the Dash, Disengage, or Hide action.",
"CLASS_FEATURE_ROGUE_ELUSIVE": "Elusive",
"CLASS_FEATURE_ROGUE_ELUSIVE_TEXT": "You are so evasive that attackers rarely gain the upper hand against you. No attack roll has advantage against you while you aren’t incapacitated.",
- "CLASS_FEATURE_ROGUE_EVASION": "Evasion",
+ "CLASS_FEATURE_ROGUE_EVASION": "Evasione",
"CLASS_FEATURE_ROGUE_EVASION_TEXT": "Your instinctive agility lets you dodge out of the way of certain area effects, such as a blue dragon’s lightning breath or a fireball spell. When you are subjected to an effect that allows you to make a Dexterity saving throw to take only half damage, you instead take no damage if you succeed on the saving throw, and only half damage if you fail.",
"CLASS_FEATURE_ROGUE_EXPERTISE": "Expertise",
"CLASS_FEATURE_ROGUE_EXPERTISE_TEXT": "Choose two of your skill proficiencies, or one of your skill proficiencies and your proficiency with thieves’ tools. Your proficiency bonus is doubled for any ability check you make that uses either of the chosen proficiencies.\nAt 6th level, you can choose two more of your proficiencies (in skills or with thieves’ tools) to gain this benefit.",
@@ -350,10 +350,10 @@
"CLASS_FEATURE_ROGUE_SLIPPERY_MIND_TEXT": "You have acquired greater mental strength. You gain proficiency in Wisdom saving throws.",
"CLASS_FEATURE_ROGUE_SNEAK_ATTACK": "Sneak Attack",
"CLASS_FEATURE_ROGUE_SNEAK_ATTACK_TEXT": "You know how to strike subtly and exploit a foe’s distraction. Once per turn, you can deal extra damage to one creature you hit with an attack if you have advantage on the attack roll. The attack must use a finesse or a ranged weapon.\nYou don’t need advantage on the attack roll if another enemy of the target is within 5 feet of it, that enemy isn’t incapacitated, and you don’t have disadvantage on the attack roll.",
- "CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
+ "CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Colpo di fortuna",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -365,7 +365,7 @@
"CLASS_FEATURE_SORCERER_METAMAGIC_DISTANT_SPELL_TEXT": "when you cast a spell that has a range of 5 feet or greater, you can spend 1 sorcery point to double the range of the spell.\nWhen you cast a spell that has a range of touch, you can spend 1 sorcery point to make the range of the spell 30 feet.",
"CLASS_FEATURE_SORCERER_METAMAGIC_EMPOWERED_SPELL": "Empowered Spell",
"CLASS_FEATURE_SORCERER_METAMAGIC_EMPOWERED_SPELL_TEXT": "When you roll damage for a spell, you can spend 1 sorcery point to reroll [[@{charisma_mod}]] damage dice (minimum of one). You must use the new rolls.\nYou can use Empowered Spell even if you have already used a different Metamagic option during the casting of the spell.",
- "CLASS_FEATURE_SORCERER_METAMAGIC_EXTENDED_SPELL": "Extended Spell",
+ "CLASS_FEATURE_SORCERER_METAMAGIC_EXTENDED_SPELL": "Incantesimo esteso",
"CLASS_FEATURE_SORCERER_METAMAGIC_EXTENDED_SPELL_TEXT": "When you cast a spell that has a duration of 1 minute or longer, you can spend 1 sorcery point to double its duration, to a maximum duration of 24 hours.",
"CLASS_FEATURE_SORCERER_METAMAGIC_HEIGHTENED_SPELL": "Heightened Spell",
"CLASS_FEATURE_SORCERER_METAMAGIC_HEIGHTENED_SPELL_TEXT": "When you cast a spell that forces a creature to make a saving throw to resist its effects, you can spend 3 sorcery points to give one target of the spell disadvantage on its first saving throw made against the spell.",
@@ -397,17 +397,17 @@
"CLASS_LEVELS": "Livelli di classe",
"CLERIC": "Chierico",
"CLIMB": "Scalare",
- "CLOSE": "Close",
- "COINS": "Coins",
+ "CLOSE": "Chiudere",
+ "COINS": "Monete",
"COINS_CP": "MR",
"COINS_EP": "ME",
"COINS_GP": "MO",
"COINS_PP": "MP",
"COINS_SP": "MA",
- "COIN_CONVERSION_GP_PER_CP": "Rame per Oro",
- "COIN_CONVERSION_GP_PER_EP": "Electrum per Oro",
+ "COIN_CONVERSION_GP_PER_CP": "Oro per Rame",
+ "COIN_CONVERSION_GP_PER_EP": "Oro per Electrum",
"COIN_CONVERSION_GP_PER_PP": "Oro per Platino",
- "COIN_CONVERSION_GP_PER_SP": "Argento per Oro",
+ "COIN_CONVERSION_GP_PER_SP": "Oro per Argento",
"COLD": "freddo",
"COLOR": "Colore",
"COMPONENTS": "Componenti",
@@ -431,38 +431,38 @@
"CONCENTRATION_UP_TO_6_ROUNDS": "fino a 6 round",
"CONCENTRATION_UP_TO_8_HOURS": "fino a 8 ore",
"CONDENSE": "Riduci",
- "CONDITIONS": "Conditions",
+ "CONDITIONS": "Condizioni",
"CONDITION_IMMUNITIES": "Immunità alle condizioni",
"CONJURATION": "Invocazione",
"CONSTITUTION": "Costituzione",
- "CONSTITUTION_SAVING_THROW": "Constitution saving throw",
+ "CONSTITUTION_SAVING_THROW": "Tiro salvezza di Costituzione",
"CONTENT": "Contenuto",
- "CONTRACT": "Contract",
+ "CONTRACT": "Contratto",
"COPPER_PIECES": "Monete di rame",
"CORE": "Base",
- "COST": "Cost",
- "COSTS_2_ACTIONS": "Costs 2 Actions",
- "COSTS_3_ACTIONS": "Costs 3 Actions",
- "CREATE_CLASS_FEATURES": "Create class features",
+ "COST": "Costo",
+ "COSTS_2_ACTIONS": "Costa 2 Actions",
+ "COSTS_3_ACTIONS": "Costa 3 Actions",
+ "CREATE_CLASS_FEATURES": "Crea caratteristiche di classe",
"CRIT": "Crit.",
- "CRITICAL_DAMAGE": "Critical damage",
- "CRITICAL_DAMAGE_IS_MAXIMIZED": "Critical damage is maximized",
+ "CRITICAL_DAMAGE": "Danno critico",
+ "CRITICAL_DAMAGE_IS_MAXIMIZED": "Il danno critico è massimizzato",
"CRIT_ATTACHER_TOOLTIP": "Seleziona una o più categorie e critici ulteriori per mostrare questo messaggio solo quando si verifica un critico in quella categoria. Non funziona per Freeform.",
"CRIT_RANGE": "Minaccia Crit.",
"CURRENT": "Attuale",
"CUSTOM": "Personalizzato",
- "CUSTOM_CLASSES": "Custom classes",
- "CUSTOM_CLASS_NAME": "Custom class name",
+ "CUSTOM_CLASSES": "Classi personalizzate",
+ "CUSTOM_CLASS_NAME": "Nome classe personalizzato",
"CUSTOM_GOLD_VALUES": "Valori d’oro personalizzati",
"DAMAGE": "Danno",
"DAMAGE_IMMUNITIES": "Immunità ai danni",
- "DAMAGE_MODIFIER": "Damage modifier",
+ "DAMAGE_MODIFIER": "Modificatore di danno",
"DAMAGE_RESISTANCES": "Resistenze ai danni",
"DAMAGE_VULNERABILITIES": "Vulnerabilità ai danni",
"DARKVISION": "Scurovisione",
"DC": "CD",
- "DEAFENED": "Deafened",
- "DEATH": "Death",
+ "DEAFENED": "Assordato",
+ "DEATH": "Morte",
"DEATH_SAVES": "TS vs Morte",
"DEATH_SAVING_THROW": "Tiro salvezza vs morte",
"DEATH_SAVING_THROWS": "Tiri salvezza vs morte",
@@ -470,14 +470,14 @@
"DECEPTION": "Raggirare",
"DEX": "Des",
"DEXTERITY": "Destrezza",
- "DEXTERITY_SAVING_THROW": "Dexterity saving throw",
+ "DEXTERITY_SAVING_THROW": "Tiro salvezza di Destrezza",
"DEX_MAX_X": "Dex (max X)",
"DICE": "Dadi",
- "DICE_MODIFIERS": "Dice modifiers",
+ "DICE_MODIFIERS": "Modificatori dei dadi",
"DICE_SYSTEM": "Dice system",
"DIE": "Dado",
"DISADVANTAGE": "Svantaggio",
- "DISADVANTAGE-": "Disadvantage-",
+ "DISADVANTAGE-": "Svantaggio-",
"DISPLAY": "Display",
"DISPLAY_AUDITORY": "Auditory",
"DISPLAY_AUDITORY_MATERIAL": "Auditory, Material",
@@ -509,17 +509,17 @@
"DRUID": "Druido",
"DURATION": "Durata",
"EFFECT": "Effetto",
- "ELECTRUM_PIECES": "Monete d’elettro",
+ "ELECTRUM_PIECES": "Monete di electrum",
"EMOTE": "Emote",
"ENCHANTMENT": "Ammaliamento",
"ENCUMBERED": "Sovraccarico",
"ENCUMBERED_HEAVILY": "Sovraccarico+",
- "ENCUMBRANCE_MULTIPLIER": "Encumbrance multiplier",
- "ENGINEERING": "Engineering",
- "EQUIPMENT": "Equipagg.",
+ "ENCUMBRANCE_MULTIPLIER": "Moltiplicatore di ingombro",
+ "ENGINEERING": "Ingegneria",
+ "EQUIPMENT": "Equipaggiamento",
"EVERY": "ogni",
"EVOCATION": "Evocazione",
- "EXHAUSTION": "Exhaustion",
+ "EXHAUSTION": "Sfinimento",
"EXHAUSTION_LEVEL": "Livello di sfinimento",
"EXHAUSTION_LEVEL_1": "Svantaggio alle prove di caratteristica",
"EXHAUSTION_LEVEL_2": "Velocità dimezzata",
@@ -527,7 +527,7 @@
"EXHAUSTION_LEVEL_4": "Punti ferita massimi dimezzati",
"EXHAUSTION_LEVEL_5": "Velocità ridotta a 0",
"EXHAUSTION_LEVEL_6": "Morte",
- "EXPAND": "Expand",
+ "EXPAND": "Espandere",
"EXPERIENCE_POINTS": "Punti esperienza",
"EXPERTISE": "Perizia",
"EXPERTISE_AS_ADVANTAGE": "Expertise as Advantage when importing",
@@ -556,18 +556,18 @@
"FORTITUDE_SAVING_THROW": "Fortitude saving throw",
"FREEFORM": "Freeform",
"FREETEXT": "Testo",
- "FRIGHTENED": "Frightened",
- "GARGANTUAN": "Gargantuan",
+ "FRIGHTENED": "Spaventato",
+ "GARGANTUAN": "Gigantesco",
"GENDER": "Sesso",
"GENERATE_SKILLS": "Genera abilità",
"GM": "GM",
"GOLD_PIECES": "Monete d’oro",
- "GRAPPLED": "Grappled",
+ "GRAPPLED": "Afferrato",
"HAIR": "Capelli",
- "HALF": "Half",
+ "HALF": "Metà",
"HALFLING_LUCK": "Fortuna halfling",
"HALF_DAMAGE": "metà danni",
- "HALF_ORC_SAVAGE_ATTACKS": "Half-Orc savage attacks",
+ "HALF_ORC_SAVAGE_ATTACKS": "Attacchi selvaggi del Mezzorco",
"HALF_PROFICIENCY": "half proficiency",
"HEAL": "Cura",
"HEAL_FOR": "Cura di",
@@ -575,37 +575,37 @@
"HEIGHT": "Altezza",
"HIDE": "Hide",
"HIDE_INFO": "Nascondi info",
- "HIDE_INFO_ABILITY_CHECKS": "Hide ability checks",
+ "HIDE_INFO_ABILITY_CHECKS": "Nasc. check d iabilità",
"HIDE_INFO_ATTACK": "Nasc. attacco",
- "HIDE_INFO_CONTENT": "Hide content",
- "HIDE_INFO_COST": "Hide cost",
+ "HIDE_INFO_CONTENT": "Nasc. contenuto",
+ "HIDE_INFO_COST": "Nasc. costo",
"HIDE_INFO_DAMAGE": "Nasc. danni",
"HIDE_INFO_EFFECT": "Nasc. effetto",
"HIDE_INFO_FREETEXT": "Nasc. testo",
"HIDE_INFO_NOTE": "Controllare la documentazione. È necessaria un’estenzione nel browser per cambiare il css per mostrare certe parti",
"HIDE_INFO_RECHARGE": "Nasc. ricarica",
- "HIDE_INFO_SAVING_THROWS": "Hide saving throws",
+ "HIDE_INFO_SAVING_THROWS": "Nasc. tiri salvezza",
"HIDE_INFO_SAVING_THROW_DC": "Nasc. CD tiro salvezza",
"HIDE_INFO_SAVING_THROW_FAILURE": "Nasc. fallimento tiro salvezza",
"HIDE_INFO_SAVING_THROW_SUCCESS": "Nasc. successo tiro",
- "HIDE_INFO_TARGET_AC": "Hide target AC",
+ "HIDE_INFO_TARGET_AC": "Nasc. CA bersaglio",
"HIGHER_LEVEL": "Livelli più alti",
"HIGHER_LEVEL_FLAT_AMOUNT": "Higher level flat amount",
"HISTORY": "Storia",
"HIT": "Hit",
"HIT_DICE": "Dadi Vita",
- "HIT_DICE_RECOVERED": "Hit dice recovered",
- "HIT_DICE_RECOVERED_ON_A_LONG_REST": "Hit dice recovered on a long rest",
- "HIT_DICE_RECOVERED_ON_A_SHORT_REST": "Hit dice recovered on a short rest",
+ "HIT_DICE_RECOVERED": "Dadi vita recuperati",
+ "HIT_DICE_RECOVERED_ON_A_LONG_REST": "Dadi vita recuperati con riposo lungo",
+ "HIT_DICE_RECOVERED_ON_A_SHORT_REST": "Dadi vita recuperati con riposo breve",
"HIT_POINTS": "Punti ferita",
- "HIT_POINTS_RECOVERED_ON_A_LONG_REST": "Hit points recovered on a long rest",
+ "HIT_POINTS_RECOVERED_ON_A_LONG_REST": "Punti ferita recuperati con riposo lungo",
"HIT_POINTS_ROLLED": "Punti ferita tirati",
"HIT_POINTS_TEMP": "PF temp.",
"HIT_POINTS_TEMPORARY": "Punti ferita temporanei",
"HIT_POINT_MAXIMUM_REDUCED_BY": "Hit point maximum reduced by",
- "HON": "Hon",
- "HONOR": "Honor",
- "HONOR_SAVING_THROW": "Honor saving throw",
+ "HON": "Ono",
+ "HONOR": "Onore",
+ "HONOR_SAVING_THROW": "Tiro salvezza di Onore",
"HOUSERULES": "Regole personalizzate",
"HOVER": "Stazionare",
"HP": "HP",
@@ -614,36 +614,36 @@
"IF_THE_TARGET_IS": "Se il bersaglio è",
"ILLUSION": "Illusione",
"IMPORT": "Importa",
- "INCAPACITATED": "Incapacitated",
- "INFLUENCE": "Influence",
+ "INCAPACITATED": "Incapacitato",
+ "INFLUENCE": "Influenza",
"INITIATIVE": "Iniziativa",
"INNATE_SPELLCASTING": "Innate Spellcasting",
- "INNATE_SPELLCASTING_NO_MATERIAL": "requiring no material components",
- "INNATE_SPELLCASTING_ONLY_VERBAL": "requiring only verbal components",
+ "INNATE_SPELLCASTING_NO_MATERIAL": "non richiede componenti materiali",
+ "INNATE_SPELLCASTING_ONLY_VERBAL": "richiede solo componenti verbali",
"INNATE_SPELLCASTING_TEXT_1": "The",
"INNATE_SPELLCASTING_TEXT_2": "’s spellcasting ability is",
"INNATE_SPELLCASTING_TEXT_3": "can innately cast the following spells,",
"INSIGHT": "Intuizione",
"INSPIRATION": "Ispirazione",
- "INSPIRATION_MULTIPLE": "Multiple inspiration",
+ "INSPIRATION_MULTIPLE": "Ispirazione multipla",
"INSTANTANEOUS": "Istantanea",
"INSTANTANEOUS_OR_1_HOUR": "Istantanea o 1 ora",
"INT": "Int",
"INTELLIGENCE": "Intelligenza",
- "INTELLIGENCE_SAVING_THROW": "Intelligence saving throw",
+ "INTELLIGENCE_SAVING_THROW": "Tiro salvezza di Intelligenza",
"INTIMIDATION": "Intimidazione",
"INVESTIGATION": "Investigare",
- "INVISIBLE": "Invisible",
+ "INVISIBLE": "Invisibile",
"JACK_OF_ALL_TRADES": "Tuttofare",
"KI": "Ki",
- "KILOGRAMS": "Kilograms",
- "KNOWN": "Known",
+ "KILOGRAMS": "Chilogrammi",
+ "KNOWN": "Conosciuto",
"LAIR_ACTIONS": "Azioni della Tana",
- "LANGUAGES": "lingue",
+ "LANGUAGES": "Lingue",
"LARGE": "Grande",
"LAWFUL_EVIL": "legale malvagio",
"LBS": "lb",
- "LEATHER": "Leather",
+ "LEATHER": "Cuoio",
"LEGENDARY_ACTIONS": "Azioni Leggendarie",
"LEGENDARY_ACTIONS_TEXT_1": "Il\/La",
"LEGENDARY_ACTIONS_TEXT_2": "può usare",
@@ -653,13 +653,13 @@
"LEVELS": "Livelli",
"LIGHTNING": "fulmine",
"LIGHT_ARMOR": "Armatura leggera",
- "LIMIT": "Limit",
- "LONGER": "Longer",
- "LONGSWORD": "Longsword",
+ "LIMIT": "Limite",
+ "LONGER": "Più lungo",
+ "LONGSWORD": "Spada lunga",
"LONG_REST": "Rip. lungo",
"MACROS": "Macro",
"MANA": "Mana",
- "MANIPULATION": "Manipulation",
+ "MANIPULATION": "Manipolazione",
"MANUAL": "Manual",
"MAX": "Max",
"MEASUREMENT_SYSTEMS": "Measurement systems",
@@ -670,24 +670,24 @@
"MELEE": "Mischia",
"MELEE_OR_RANGED_WEAPON_ATTACK": "Melee or Ranged Weapon Attack",
"MELEE_SPELL_ATTACK": "Melee Spell Attack",
- "MELEE_WEAPON": "Melee weapon",
- "MELEE_WEAPON_ATTACK": "Melee Weapon Attack",
- "MELEE_WEAPON_ATTACK_MODIFIER": "Melee weapon attack modifier",
- "MELEE_WEAPON_DAMAGE_MODIFIER": "Melee weapon damage modifier",
- "METERS": "Meters",
+ "MELEE_WEAPON": "Arma da mischia",
+ "MELEE_WEAPON_ATTACK": "Attacco di arma da mischia",
+ "MELEE_WEAPON_ATTACK_MODIFIER": "Modificatore attacco arma da mischia",
+ "MELEE_WEAPON_DAMAGE_MODIFIER": "Modificatore danno arma da mischia",
+ "METERS": "Metri",
"METERS_ABBREVIATION": "m.",
"MISC": "Varie",
"MISCELLANEOUS": "Varie",
"MISCELLANEOUS_NOTES": "Note",
"MOD": "mod",
- "MODIFIER": "Modifier",
- "MODIFIERS": "Modifiers",
+ "MODIFIER": "Modificatore",
+ "MODIFIERS": "Modificatori",
"MONK": "Monaco",
"MOVEMENT": "Movimento",
"MULTIPLIER": "Moltiplicatore",
"NAME": "Nome",
"NATURE": "Natura",
- "NECROMANCY": "Necromanzia",
+ "NECROMANCY": "Negromanzia",
"NECROTIC": "necrotico",
"NO": "No",
"NORMAL": "Normale",
@@ -695,9 +695,9 @@
"NO_CONCENTRATION": "No concentration",
"NO_CRITICAL_DAMAGE_FROM_DEFAULT_DAMAGE": "No extra damage on a critical hit from the default damage",
"NPC": "PNG",
- "OFFENSE": "Offense",
+ "OFFENSE": "Offesa",
"ONE_CREATURE": "una creatura",
- "ONE_TARGET": "one target",
+ "ONE_TARGET": "un bersaglio",
"OR": "o",
"OTHER": "Altro",
"OTHER_ARMOR": "Altra armatura",
@@ -706,8 +706,8 @@
"OTHER_TYPE": "Other (AoE, Cone, Line)",
"OUTPUT": "Output",
"PALADIN": "Paladino",
- "PARALYZED": "Paralyzed",
- "PASSIVE": "Passive",
+ "PARALYZED": "Paralizzato",
+ "PASSIVE": "Passivo",
"PASSIVE_ABILITY_CHECK": "Prova passiva di caratteristica",
"PASSIVE_SKILLS": "Passive skills",
"PC": "PG",
@@ -715,22 +715,23 @@
"PERFORMANCE": "Performance",
"PERSONALITY_TRAITS": "Tratti personalità",
"PERSUASION": "Persuasione",
- "PER_LEVEL": "per level",
+ "PER_LEVEL": "per livello",
"PER_USE": "per use",
- "PETRIFIED": "Petrified",
+ "PETRIFIED": "Pietrificato",
"PIERCING": "perforante",
"PLATINUM_PIECES": "Monete di platino",
"PLUS": "plus",
"POINTS": "Points",
"POINTS_OF_ORIGIN": "Punti di origine",
"POISON": "veleno",
- "POISONED": "Poisoned",
- "POTION": "Potion",
- "POTION_OF_HEALING": "Potion of Healing",
+ "POISONED": "Avvelenato",
+ "POTION": "Pozione",
+ "POTION_OF_HEALING": "Pozione di Guarigione",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Preparati",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processing",
"PROF": "Comp.",
@@ -739,12 +740,12 @@
"PROFICIENCY_DICE": "Proficiency dice",
"PROFICIENT": "Competente",
"PROFICIENT_ARMOR_WEIGHS": "Armor that you are proficient in weighs",
- "PRONE": "Prone",
+ "PRONE": "Prono",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psichico",
@@ -752,50 +753,50 @@
"QUERY": "Query",
"QUERY_ADVANTAGE_DEFAULT": "Query (Advantage default)",
"QUERY_DISADVANTAGE_DEFAULT": "Query (Disadvantage default)",
- "QUICK": "Quick",
+ "QUICK": "Veloce",
"RACE": "Razza",
- "RACIAL_FEATURE_POWERFUL_BUILD": "Powerful build",
- "RACIAL_TRAITS": "Racial traits",
+ "RACIAL_FEATURE_POWERFUL_BUILD": "Corporatura possente",
+ "RACIAL_TRAITS": "Tratti di razza",
"RADIANT": "radiante",
"RANGE": "Portata",
"RANGED": "A distanza",
"RANGED_SPELL_ATTACK": "Ranged Spell Attack",
- "RANGED_WEAPON": "Ranged weapon",
- "RANGED_WEAPON_ATTACK": "Ranged Weapon Attack",
- "RANGED_WEAPON_ATTACK_MODIFIER": "Ranged weapon attack modifier",
- "RANGED_WEAPON_DAMAGE_MODIFIER": "Ranged weapon damage modifier",
+ "RANGED_WEAPON": "Arma a distanza",
+ "RANGED_WEAPON_ATTACK": "Attacco con arma a distanza",
+ "RANGED_WEAPON_ATTACK_MODIFIER": "Modificatore d'attacco arma a distanza",
+ "RANGED_WEAPON_DAMAGE_MODIFIER": "Modificatore di danno arma a distanza",
"RANGER": "Ranger",
"RANGERUA": "Ranger UA (2016)",
"REACH": "Portata",
"REACTION": "Reazione",
"REACTIONS": "Reazioni",
"RECHARGE": "Ricarica",
- "RECHARGED": "recharged",
- "RECHARGE_2_6": "Recharge 2-6",
- "RECHARGE_3_6": "Recharge 3-6",
- "RECHARGE_4_6": "Recharge 4-6",
- "RECHARGE_5_6": "Recharge 5-6",
- "RECHARGE_6": "Recharge 6",
- "RECHARGE_AFTER_LONG_REST": "Recharges after a Long Rest",
- "RECHARGE_AFTER_SHORT_OR_LONG_REST": "Recharges after a Short or Long Rest",
+ "RECHARGED": "ricaricato",
+ "RECHARGE_2_6": "Ricarica 2-6",
+ "RECHARGE_3_6": "Ricarica 3-6",
+ "RECHARGE_4_6": "Ricarica 4-6",
+ "RECHARGE_5_6": "Ricarica 5-6",
+ "RECHARGE_6": "Ricarica 6",
+ "RECHARGE_AFTER_LONG_REST": "Si ricarica dopo riposo lungo",
+ "RECHARGE_AFTER_SHORT_OR_LONG_REST": "Si ricarica dopo un riposo breve o lungo",
"RECOVERED": "recovered",
"REDUCED_TO": "reduced to",
"REF": "Ref",
- "REFLEX": "Reflex",
- "REFLEX_SAVING_THROW": "Reflex saving throw",
- "REGAIN": "Regain",
+ "REFLEX": "Riflessi",
+ "REFLEX_SAVING_THROW": "Tiro salvezza di Riflessi",
+ "REGAIN": "Riguadagnare",
"REGIONAL_EFFECTS": "Effetti regionali",
"RELIGION": "Religione",
"REMARKABLE_ATHLETE": "Atleta impressionante",
- "REPEAT": "Repeat",
+ "REPEAT": "Ripetere",
"REPORT_AN_ISSUE": "Report an issue",
"REQUIRES_API": "Questa opzione richiede l’API",
"RESET": "reset",
"RESISTANCES_AND_IMMUNITIES": "Resistenze e immunità",
"RESOURCES": "Risorse",
- "REST": "Rest",
- "RESTRAINED": "Restrained",
- "RING": "Ring",
+ "REST": "Riposo",
+ "RESTRAINED": "Legato",
+ "RING": "Anello",
"RITUAL": "Rituale",
"ROGUE": "Furfante",
"ROLL": "Roll",
@@ -815,17 +816,17 @@
"SAVING_THROW_BONUS": "saving throw bonus",
"SAVING_THROW_DC": "CD tiro salvezza",
"SAVING_THROW_FAILURE": "Saving throw failure",
- "SAVING_THROW_MODIFIER": "Saving throw modifier",
+ "SAVING_THROW_MODIFIER": "Modificatore tiro salvezza",
"SAVING_THROW_SUCCESS": "Saving throw success",
"SCORE": "Score",
- "SECOND_DAMAGE": "Second damage",
+ "SECOND_DAMAGE": "Secondo danno",
"SELF": "Self",
"SENSES": "Sensi",
"SHEET": "Scheda",
"SHEET_OUTPUT": "Output scheda",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Scudo",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
+ "SHORT_OR_LONG_REST": "Riposo breve o lungo",
"SHORT_REST": "Rip. breve",
"SHOW_ALL": "Mostra tutto",
"SHOW_RESTS": "Mostra rip.",
@@ -864,11 +865,11 @@
"SKILL_$9": "skill_$9",
"SKILL_SHEET_SETTING": "– Sheet setting",
"SKIN": "Pelle",
- "SLASHING": "tagliente",
- "SLEIGHTOFHAND": "Agilità di mano",
+ "SLASHING": "Da taglio",
+ "SLEIGHTOFHAND": "Mano lesta",
"SLOTS": "Slots",
"SMALL": "Piccola",
- "SOCIETY": "Society",
+ "SOCIETY": "Società",
"SORCERER": "Stregone",
"SORCERY_POINTS": "Sorcery Points",
"SOULKNIFE": "Soulknife",
@@ -898,7 +899,7 @@
"SPELL_MUST_HAVE": "Incantesimi devono avere",
"SPELL_POINTS": "Punti inc.",
"SPELL_SAVE_DC": "spell save DC",
- "SPELL_SAVING_THROW": "Spell saving throw",
+ "SPELL_SAVING_THROW": "Tiro salvezza incantesimi",
"SPELL_SLOTS": "Slot inc.",
"SPELL_SLOTS_TITLE": "Slot inc.",
"SPELL_TO_HIT": "to hit with spell attacks",
@@ -906,62 +907,62 @@
"STEALTH": "Furtività",
"STR": "For",
"STRENGTH": "Forza",
- "STRENGTH_SAVING_THROW": "Strength saving throw",
+ "STRENGTH_SAVING_THROW": "Tiro salvezza di Forza",
"STR_13": "For 13",
"STR_15": "For 15",
- "STUNNED": "Stunned",
+ "STUNNED": "Stordito",
"SUCCESSES": "Successi",
- "SUMMONER": "Summoner",
+ "SUMMONER": "Evocatore",
"SURVIVAL": "Sopravvivenza",
"SWIM": "Nuotare",
"TARGET": "Bersaglio",
"TARGET_TO_SOURCE": "Bersaglio → Fonte",
"TEMP": "Temp",
"TEXT_SIZE": "Dimensione testo",
- "THROWN": "Thrown",
+ "THROWN": "Lanciato",
"THUNDER": "tuono",
"TINY": "Minuscola",
"TOTAL": "Totale",
"TOTAL_GOLD_VALUE": "Valore totale in MO",
- "TO_HIT": "to hit",
+ "TO_HIT": "per colpire",
"TO_TRACKER": "Invia al contatore",
"TRACKER": "Contatore",
"TRAITS": "Tratti",
"TRANSMUTATION": "Trasmutazione",
"TREMORSENSE": "Senso tellurico",
- "TRUESIGHT": "Visione del vero",
- "TURN": "Turn",
+ "TRUESIGHT": "Vera Vista",
+ "TURN": "Turno",
"TURN_OFF_FILTERING": "Se non riesci a vedere incantesimi aggiunti di recente disattiva filters",
- "TURN_RECHARGE": "Turn recharge",
+ "TURN_RECHARGE": "Ricarica turno",
"TYPE": "Tipo",
- "UNARMORED": "senza armatura",
- "UNCONSCIOUS": "Unconscious",
+ "UNARMORED": "Senza armatura",
+ "UNCONSCIOUS": "Svenuto",
"UNPROFICIENT": "Non competente",
"UNTIL_DISPELLED": "Finché non è dissolto",
"UNTIL_DISPELLED_OR_TRIGGERED": "Finché non è dissolto o attivato",
"USES": "Usi",
- "USE_CUSTOM_SAVING_THROWS": "Use custom saving throws",
- "UTILITY": "Utility",
+ "USE_CUSTOM_SAVING_THROWS": "Usa tiri salvezza personalizzati",
+ "UTILITY": "Utilità",
"VERSATILE": "Versatile",
"VS": "vs",
"VS_FIEND_OR_UNDEAD": "vs non morti o immondi",
"WARLOCK": "Warlock",
- "WARLOCK_SLOTS": "Warlock slots",
+ "WARLOCK_SLOTS": "Slots Warlock",
"WARLOCK_SPELL_SLOTS": "Slot inc. Warlock",
- "WEAPON": "Weapon",
- "WEAPON_ATTACK_MODIFIER": "Weapon attack modifier",
- "WEAPON_DAMAGE_MODIFIER": "Weapon damage modifier",
+ "WEAPON": "Arma",
+ "WEAPON_ATTACK_MODIFIER": "Modificatore d'attacco dell'arma",
+ "WEAPON_DAMAGE_MODIFIER": "Modificatore al danno dell'arma",
"WEIGHT": "Peso",
- "WEIGHT_PER_COIN": "Weight per coin",
+ "WEIGHT_PER_COIN": "Peso per moneta",
"WHISPERED_TO_GM": "Sussurrato al GM",
- "WHISPERED_TO_SELF": "Whispered to self",
+ "WHISPERED_TO_SELF": "Sussurrato a se stesso",
"WILL": "Will",
- "WILL_SAVING_THROW": "Will saving throw",
+ "WILL_SAVING_THROW": "Tiro salvezza di Volontà",
"WIS": "Sag",
"WISDOM": "Saggezza",
- "WISDOM_SAVING_THROW": "Wisdom saving throw",
+ "WISDOM_SAVING_THROW": "Tiro salvezza di Saggezza",
"WIZARD": "Mago",
- "WONDROUS": "Wondrous",
+ "WONDROUS": "Meraviglioso",
"YES": "Sì",
"—": "—"
}
\ No newline at end of file
diff --git a/5eShaped/translations/ja.json b/5eShaped/translations/ja.json
index 0180073a3d..ee24e034db 100644
--- a/5eShaped/translations/ja.json
+++ b/5eShaped/translations/ja.json
@@ -131,9 +131,9 @@
"CARRIED": "所持",
"CARRYING_CAPACITY": "運搬能力",
"CARRYING_PUSH_DRAG_LIFT": "押し引きと持ち上げ",
- "CASTERS_FULL": "フル(9レベルまで: バード, クレリック, ドルイド, ソーサラ, ウィザード)",
- "CASTERS_HALF": "ハーフ (5レベルまで: パラディン, レンジャー)",
- "CASTERS_THIRD": "サード (3レベルまで: 秘術類型)",
+ "CASTERS_4TH": "サード (3レベルまで: 秘術類型)",
+ "CASTERS_5TH": "ハーフ (5レベルまで: パラディン, レンジャー)",
+ "CASTERS_9TH": "フル(9レベルまで: バード, クレリック, ドルイド, ソーサラ, ウィザード)",
"CASTING_TIME": "発動時間",
"CHA": "魅力",
"CHALLENGE": "難易度",
@@ -155,7 +155,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "底力",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "君は君自身のターンに、1回のボーナス・アクションを用いて、(1d10+ファイター・レベル)のヒット・ポイントを回復できる。",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -642,7 +642,6 @@
"LANGUAGES": "言語",
"LARGE": "大型",
"LAWFUL_EVIL": "秩序にして悪",
- "LBS": "lbs",
"LEATHER": "レザー",
"LEGENDARY_ACTIONS": "伝説的アクション",
"LEGENDARY_ACTIONS_TEXT_1": " ",
@@ -728,6 +727,7 @@
"POTION": "ポーション",
"POTION_OF_HEALING": "ポーション・オヴ・ヒーリング",
"POUNDS": "ポンド",
+ "POUNDS_SHORT": "lb",
"PREPARED": "準備",
"PREPARED_MATTERS": "準備必須",
"PROCESSING_CLOSE_MESSAGE": "下の画像が通常に動いている場合は変換が完了していますのでこのメッセージを閉じてください",
@@ -742,9 +742,9 @@
"PRONE": "伏せ状態",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychic",
diff --git a/5eShaped/translations/ko.json b/5eShaped/translations/ko.json
index 3ca2d0dee1..ba1ca81f98 100644
--- a/5eShaped/translations/ko.json
+++ b/5eShaped/translations/ko.json
@@ -131,9 +131,9 @@
"CARRIED": "Carried",
"CARRYING_CAPACITY": "Carrying capacity",
"CARRYING_PUSH_DRAG_LIFT": "Push\/Drag\/Lift",
- "CASTERS_FULL": "Full (9th level: Bard, Cleric, Druid, Sorcerer, Wizard)",
- "CASTERS_HALF": "Half (5th level: Paladin, Ranger)",
- "CASTERS_THIRD": "Third (3rd level: Arcane Archetypes)",
+ "CASTERS_4TH": "4th level spellcasting",
+ "CASTERS_5TH": "5th level spellcasting",
+ "CASTERS_9TH": "9th level spellcasting",
"CASTING_TIME": "Casting Time",
"CHA": "Cha",
"CHALLENGE": "Challenge",
@@ -155,7 +155,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +208,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +353,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -642,7 +642,6 @@
"LANGUAGES": "Languages",
"LARGE": "Large",
"LAWFUL_EVIL": "lawful evil",
- "LBS": "lbs",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "Legendary Actions",
"LEGENDARY_ACTIONS_TEXT_1": "The",
@@ -656,7 +655,7 @@
"LIMIT": "Limit",
"LONGER": "Longer",
"LONGSWORD": "Longsword",
- "LONG_REST": "Long Rest",
+ "LONG_REST": "Long rest",
"MACROS": "Macros",
"MANA": "Mana",
"MANIPULATION": "Manipulation",
@@ -728,9 +727,10 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Prepared",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processing",
"PROF": "Prof",
@@ -742,9 +742,9 @@
"PRONE": "Prone",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychic",
@@ -825,8 +825,8 @@
"SHEET_OUTPUT": "Sheet output",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Shield",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
- "SHORT_REST": "Short Rest",
+ "SHORT_OR_LONG_REST": "Short or Long rest",
+ "SHORT_REST": "Short rest",
"SHOW_ALL": "Show all",
"SHOW_RESTS": "Show Rests",
"SHOW_SPELL_LEVEL_IF_ALL_SLOTS_ARE_USED": "Show levels if all slots are used",
diff --git a/5eShaped/translations/nl.json b/5eShaped/translations/nl.json
index 3ca2d0dee1..ba1ca81f98 100644
--- a/5eShaped/translations/nl.json
+++ b/5eShaped/translations/nl.json
@@ -131,9 +131,9 @@
"CARRIED": "Carried",
"CARRYING_CAPACITY": "Carrying capacity",
"CARRYING_PUSH_DRAG_LIFT": "Push\/Drag\/Lift",
- "CASTERS_FULL": "Full (9th level: Bard, Cleric, Druid, Sorcerer, Wizard)",
- "CASTERS_HALF": "Half (5th level: Paladin, Ranger)",
- "CASTERS_THIRD": "Third (3rd level: Arcane Archetypes)",
+ "CASTERS_4TH": "4th level spellcasting",
+ "CASTERS_5TH": "5th level spellcasting",
+ "CASTERS_9TH": "9th level spellcasting",
"CASTING_TIME": "Casting Time",
"CHA": "Cha",
"CHALLENGE": "Challenge",
@@ -155,7 +155,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +208,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +353,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -642,7 +642,6 @@
"LANGUAGES": "Languages",
"LARGE": "Large",
"LAWFUL_EVIL": "lawful evil",
- "LBS": "lbs",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "Legendary Actions",
"LEGENDARY_ACTIONS_TEXT_1": "The",
@@ -656,7 +655,7 @@
"LIMIT": "Limit",
"LONGER": "Longer",
"LONGSWORD": "Longsword",
- "LONG_REST": "Long Rest",
+ "LONG_REST": "Long rest",
"MACROS": "Macros",
"MANA": "Mana",
"MANIPULATION": "Manipulation",
@@ -728,9 +727,10 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Prepared",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processing",
"PROF": "Prof",
@@ -742,9 +742,9 @@
"PRONE": "Prone",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychic",
@@ -825,8 +825,8 @@
"SHEET_OUTPUT": "Sheet output",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Shield",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
- "SHORT_REST": "Short Rest",
+ "SHORT_OR_LONG_REST": "Short or Long rest",
+ "SHORT_REST": "Short rest",
"SHOW_ALL": "Show all",
"SHOW_RESTS": "Show Rests",
"SHOW_SPELL_LEVEL_IF_ALL_SLOTS_ARE_USED": "Show levels if all slots are used",
diff --git a/5eShaped/translations/pt-br.json b/5eShaped/translations/pt-br.json
index 3e3126ca5f..b9a4f3494d 100644
--- a/5eShaped/translations/pt-br.json
+++ b/5eShaped/translations/pt-br.json
@@ -127,9 +127,9 @@
"CARRIED": "Carregado",
"CARRYING_CAPACITY": "Capacidade de Carga",
"CARRYING_PUSH_DRAG_LIFT": "Push\/Drag\/Lift",
- "CASTERS_FULL": "Cheio (9º Nível: Bardo, Clérigo, Druida, Feiticeiro, Mago)",
- "CASTERS_HALF": "Half (5º Nível: Paladino, Patrulheiro)",
- "CASTERS_THIRD": "Third (3º Nível: Arcane Archetypes)",
+ "CASTERS_4TH": "Third (3º Nível: Arcane Archetypes)",
+ "CASTERS_5TH": "Half (5º Nível: Paladino, Patrulheiro)",
+ "CASTERS_9TH": "Cheio (9º Nível: Bardo, Clérigo, Druida, Feiticeiro, Mago)",
"CASTING_TIME": "Casting Time",
"CHA": "CAR",
"CHALLENGE": "Dificuldade",
@@ -150,7 +150,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’t be charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’t be charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -203,7 +203,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -228,7 +228,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -244,9 +244,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -304,9 +304,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -348,7 +348,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -631,7 +631,6 @@
"LANGUAGES": "Idiomas",
"LARGE": "Large",
"LAWFUL_EVIL": "lawful evil",
- "LBS": "lbs",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "Ações Lendárias",
"LEGENDARY_ACTIONS_TEXT_1": "As",
@@ -715,9 +714,10 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Libras",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Preparada",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this message does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce and ideally showing the error in the browser's console.",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processando",
"PROF": "Prof",
@@ -728,9 +728,9 @@
"PRONE": "Inclinado",
"PSION": "Psiônico",
"PSIONICS": "Psiônicos",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Limite Psi",
"PSI_POINTS": "Pontos Psi",
"PSYCHIC": "psíquico",
diff --git a/5eShaped/translations/pt.json b/5eShaped/translations/pt.json
index 5124f9a1b4..70f60bb61a 100644
--- a/5eShaped/translations/pt.json
+++ b/5eShaped/translations/pt.json
@@ -131,9 +131,9 @@
"CARRIED": "Carried",
"CARRYING_CAPACITY": "Carrying capacity",
"CARRYING_PUSH_DRAG_LIFT": "Push\/Drag\/Lift",
- "CASTERS_FULL": "Full (9th level: Bard, Cleric, Druid, Sorcerer, Wizard)",
- "CASTERS_HALF": "Half (5th level: Paladin, Ranger)",
- "CASTERS_THIRD": "Third (3rd level: Arcane Archetypes)",
+ "CASTERS_4TH": "4th level spellcasting",
+ "CASTERS_5TH": "5th level spellcasting",
+ "CASTERS_9TH": "9th level spellcasting",
"CASTING_TIME": "Casting Time",
"CHA": "Cha",
"CHALLENGE": "Challenge",
@@ -155,7 +155,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +208,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +353,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -642,7 +642,6 @@
"LANGUAGES": "Languages",
"LARGE": "Large",
"LAWFUL_EVIL": "lawful evil",
- "LBS": "lbs",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "Legendary Actions",
"LEGENDARY_ACTIONS_TEXT_1": "The",
@@ -656,7 +655,7 @@
"LIMIT": "Limit",
"LONGER": "Longer",
"LONGSWORD": "Longsword",
- "LONG_REST": "Long Rest",
+ "LONG_REST": "Long rest",
"MACROS": "Macros",
"MANA": "Mana",
"MANIPULATION": "Manipulation",
@@ -728,9 +727,10 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Prepared",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processing",
"PROF": "Prof",
@@ -742,9 +742,9 @@
"PRONE": "Prone",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychic",
@@ -825,8 +825,8 @@
"SHEET_OUTPUT": "Sheet output",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Shield",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
- "SHORT_REST": "Short Rest",
+ "SHORT_OR_LONG_REST": "Short or Long rest",
+ "SHORT_REST": "Short rest",
"SHOW_ALL": "Show all",
"SHOW_RESTS": "Show Rests",
"SHOW_SPELL_LEVEL_IF_ALL_SLOTS_ARE_USED": "Show levels if all slots are used",
diff --git a/5eShaped/translations/ru.json b/5eShaped/translations/ru.json
index 4319b910a6..68ce65844c 100644
--- a/5eShaped/translations/ru.json
+++ b/5eShaped/translations/ru.json
@@ -131,9 +131,9 @@
"CARRIED": "На себе",
"CARRYING_CAPACITY": "Переносимый вес",
"CARRYING_PUSH_DRAG_LIFT": "Толкать\/Тащить",
- "CASTERS_FULL": "Full (9th level: Бард, Жрец, Друид, Чародей, Волшебник)",
- "CASTERS_HALF": "Half (5th level: Паладин, Следопыт)",
- "CASTERS_THIRD": "Third (3rd level: Архетипы магии)",
+ "CASTERS_4TH": "Third (3rd level: Архетипы магии)",
+ "CASTERS_5TH": "Half (5th level: Паладин, Следопыт)",
+ "CASTERS_9TH": "Full (9th level: Бард, Жрец, Друид, Чародей, Волшебник)",
"CASTING_TIME": "Время накладывания",
"CHA": "Хар",
"CHALLENGE": "Сложность",
@@ -155,7 +155,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +208,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +353,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -642,7 +642,6 @@
"LANGUAGES": "Языки",
"LARGE": "Большое",
"LAWFUL_EVIL": "законно злое",
- "LBS": "фнт.",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "Легендарные действия",
"LEGENDARY_ACTIONS_TEXT_1": "The",
@@ -728,6 +727,7 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Фунты",
+ "POUNDS_SHORT": "фнт",
"PREPARED": "Подготовлено",
"PREPARED_MATTERS": "Подготовка важна",
"PROCESSING_CLOSE_MESSAGE": "Если изображение движется с нормальной скоростью и лист отзывчив, можете свободно:",
@@ -742,9 +742,9 @@
"PRONE": "Опрокинуто",
"PSION": "Псионный",
"PSIONICS": "Псионический",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "Психический",
@@ -825,7 +825,7 @@
"SHEET_OUTPUT": "Вывод листа",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Щит",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
+ "SHORT_OR_LONG_REST": "Short or Long rest",
"SHORT_REST": "Короткий отдых",
"SHOW_ALL": "Показать все",
"SHOW_RESTS": "Отобразить Отдыхи",
diff --git a/5eShaped/translations/sv.json b/5eShaped/translations/sv.json
index 3ca2d0dee1..ba1ca81f98 100644
--- a/5eShaped/translations/sv.json
+++ b/5eShaped/translations/sv.json
@@ -131,9 +131,9 @@
"CARRIED": "Carried",
"CARRYING_CAPACITY": "Carrying capacity",
"CARRYING_PUSH_DRAG_LIFT": "Push\/Drag\/Lift",
- "CASTERS_FULL": "Full (9th level: Bard, Cleric, Druid, Sorcerer, Wizard)",
- "CASTERS_HALF": "Half (5th level: Paladin, Ranger)",
- "CASTERS_THIRD": "Third (3rd level: Arcane Archetypes)",
+ "CASTERS_4TH": "4th level spellcasting",
+ "CASTERS_5TH": "5th level spellcasting",
+ "CASTERS_9TH": "9th level spellcasting",
"CASTING_TIME": "Casting Time",
"CHA": "Cha",
"CHALLENGE": "Challenge",
@@ -155,7 +155,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +208,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +353,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -642,7 +642,6 @@
"LANGUAGES": "Languages",
"LARGE": "Large",
"LAWFUL_EVIL": "lawful evil",
- "LBS": "lbs",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "Legendary Actions",
"LEGENDARY_ACTIONS_TEXT_1": "The",
@@ -656,7 +655,7 @@
"LIMIT": "Limit",
"LONGER": "Longer",
"LONGSWORD": "Longsword",
- "LONG_REST": "Long Rest",
+ "LONG_REST": "Long rest",
"MACROS": "Macros",
"MANA": "Mana",
"MANIPULATION": "Manipulation",
@@ -728,9 +727,10 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Prepared",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processing",
"PROF": "Prof",
@@ -742,9 +742,9 @@
"PRONE": "Prone",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychic",
@@ -825,8 +825,8 @@
"SHEET_OUTPUT": "Sheet output",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Shield",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
- "SHORT_REST": "Short Rest",
+ "SHORT_OR_LONG_REST": "Short or Long rest",
+ "SHORT_REST": "Short rest",
"SHOW_ALL": "Show all",
"SHOW_RESTS": "Show Rests",
"SHOW_SPELL_LEVEL_IF_ALL_SLOTS_ARE_USED": "Show levels if all slots are used",
diff --git a/5eShaped/translations/tr.json b/5eShaped/translations/tr.json
index 3ca2d0dee1..ba1ca81f98 100644
--- a/5eShaped/translations/tr.json
+++ b/5eShaped/translations/tr.json
@@ -131,9 +131,9 @@
"CARRIED": "Carried",
"CARRYING_CAPACITY": "Carrying capacity",
"CARRYING_PUSH_DRAG_LIFT": "Push\/Drag\/Lift",
- "CASTERS_FULL": "Full (9th level: Bard, Cleric, Druid, Sorcerer, Wizard)",
- "CASTERS_HALF": "Half (5th level: Paladin, Ranger)",
- "CASTERS_THIRD": "Third (3rd level: Arcane Archetypes)",
+ "CASTERS_4TH": "4th level spellcasting",
+ "CASTERS_5TH": "5th level spellcasting",
+ "CASTERS_9TH": "9th level spellcasting",
"CASTING_TIME": "Casting Time",
"CHA": "Cha",
"CHALLENGE": "Challenge",
@@ -155,7 +155,7 @@
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS": "Magic Item Analysis",
"CLASS_FEATURE_ARTIFICER_MAGIC_ITEM_ANALYSIS_TEXT": "Your understanding of magic items allows you to analyze and understand their secrets. You know the artificer spells detect magic and identify, and you can cast them as rituals. You don’t need to provide a material component when casting identify with this class feature.",
"CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT": "Mechanical Servant",
- "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It isimmune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
+ "CLASS_FEATURE_ARTIFICER_MECHANICAL_SERVANT_TEXT": "Your research and mastery of your craft allow you to produce a mechanical servant. The servant is a construct that obeys your commands without hesitation and functions in combat to protect you. Though magic fuels its creation, the servant is not magical itself. You are assumed to have been working on the servant for quite some time, finally finishing it during a short or long rest after you reach 6th level.\nSelect a Large beast with a challenge rating of 2 or less. The servant uses that beast’s game statistics, but it can look however you like, as long as its form is appropriate for its statistics. It has the following modifications:\n•It is a construct instead of a beast.\n•It can’tbe charmed.\n•It is immune to poison damage and the poisoned condition.\n•It gains darkvision with a range of 60 feet if it doesn’t have it already.\n•It understands the languages you can speak when you create it, but it can’t speak.\n•If you are the target of a melee attack and the servant is within 5 feet of the attacker, you can use your reaction to command the servant to respond, using its reaction to make a melee attack against the attacker.\nThe servant obeys your orders to the best of its ability. In combat, it rolls its own initiative and acts on its own.\nIf the servant is killed, it can be returned to life via normal means, such as with the revivify spell. In addition, over the course of a long rest, you can repair a slain servant if you have access to its body. It returns to life with 1 hit point at the end of the rest. If the servant is beyond recovery, you can build a new one with one week of work (eight hours each day) and 1,000 gp of raw materials.",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE": "Soul of Artifice",
"CLASS_FEATURE_ARTIFICER_SOUL_OF_ARTIFICE_TEXT": "Your understanding of magic items is unmatched, allowing you to mingle your soul with items linked to you. You can attune to up to six magic items at once. In addition, you gain a +1 bonus to all saving throws per magic item you are currently attuned to.",
"CLASS_FEATURE_ARTIFICER_SUPERIOR_ATTUNEMENT": "Superior Attunement",
@@ -208,7 +208,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "As an action, you present your holy symbol and speak a prayer censuring the undead. Each undead that can see or hear you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is turned for 1 minute or until it takes any damage.\nA turned creature must spend its turns trying to move as far away from you as it can, and it can’t willingly move to a space within 30 feet of you. It also can’t take reactions. For its action, it can use only the Dash action or try to escape from an effect that prevents it from moving. If there’s nowhere to move, the creature can use the Dodge action.",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "When an undead fails its saving throw against your Turn Undead feature, the creature is instantly destroyed if its challenge rating is CHALLENGE_RATING or lower",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "Divine Intervention",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "Archdruid",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "Beast Spells",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "Second Wind",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "Deflect Missiles",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "Diamond Soul",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "Empty Body",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "Martial Arts",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "Patient Defense",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "Perfect Self",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "Purity of Body",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "Hide in Plain Sight",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "Natural Explorer",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "Primeval Awareness",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "Vanish",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "Extra Attack (Ranger)",
@@ -353,7 +353,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "Stroke of Luck",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "Thieves’ Cant",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "Uncanny Dodge",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "Flexible Casting",
@@ -642,7 +642,6 @@
"LANGUAGES": "Languages",
"LARGE": "Large",
"LAWFUL_EVIL": "lawful evil",
- "LBS": "lbs",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "Legendary Actions",
"LEGENDARY_ACTIONS_TEXT_1": "The",
@@ -656,7 +655,7 @@
"LIMIT": "Limit",
"LONGER": "Longer",
"LONGSWORD": "Longsword",
- "LONG_REST": "Long Rest",
+ "LONG_REST": "Long rest",
"MACROS": "Macros",
"MANA": "Mana",
"MANIPULATION": "Manipulation",
@@ -728,9 +727,10 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "Pounds",
+ "POUNDS_SHORT": "lb",
"PREPARED": "Prepared",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "While the sheet is processing do not close the sheet.",
"PROCESSING_TITLE": "Processing",
"PROF": "Prof",
@@ -742,9 +742,9 @@
"PRONE": "Prone",
"PSION": "Psion",
"PSIONICS": "Psionics",
- "PSIONICS_FULL": "Psionics Full (Psion)",
- "PSIONICS_HALF": "Psionics Half (Soulknife)",
- "PSIONICS_THIRD": "Psionics Third (Cryptic)",
+ "PSIONICS_4TH": "4th level psionics",
+ "PSIONICS_5TH": "5th level psionics",
+ "PSIONICS_9TH": "9th level psionics",
"PSI_LIMIT": "Psi Limit",
"PSI_POINTS": "Psi Points",
"PSYCHIC": "psychic",
@@ -825,8 +825,8 @@
"SHEET_OUTPUT": "Sheet output",
"SHEET_SETTING": "Sheet setting",
"SHIELD": "Shield",
- "SHORT_OR_LONG_REST": "Short or Long Rest",
- "SHORT_REST": "Short Rest",
+ "SHORT_OR_LONG_REST": "Short or Long rest",
+ "SHORT_REST": "Short rest",
"SHOW_ALL": "Show all",
"SHOW_RESTS": "Show Rests",
"SHOW_SPELL_LEVEL_IF_ALL_SLOTS_ARE_USED": "Show levels if all slots are used",
diff --git a/5eShaped/translations/zh.json b/5eShaped/translations/zh.json
index 6c70a9e5d9..d8757854f8 100644
--- a/5eShaped/translations/zh.json
+++ b/5eShaped/translations/zh.json
@@ -131,9 +131,9 @@
"CARRIED": "攜帶",
"CARRYING_CAPACITY": "負重",
"CARRYING_PUSH_DRAG_LIFT": "推\/拉\/舉起",
- "CASTERS_FULL": "全施法者(9級:吟遊詩人、牧師、德魯伊、術士、法師)",
- "CASTERS_HALF": "半施法者(5級:聖武士、遊俠)",
- "CASTERS_THIRD": "次施法者(3級:秘法原型)",
+ "CASTERS_4TH": "次施法者(3級:秘法原型)",
+ "CASTERS_5TH": "半施法者(5級:聖武士、遊俠)",
+ "CASTERS_9TH": "全施法者(9級:吟遊詩人、牧師、德魯伊、術士、法師)",
"CASTING_TIME": "施法時間",
"CHA": "魅力",
"CHALLENGE": "挑戰",
@@ -208,7 +208,7 @@
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT": "以一個動作,你展示聖徽並念出禱詞譴責不死生物。每個在你30呎以內並能看見或聽見你的不死生物必須做一個睿智豁免。如果該生物豁免失敗,它會被驅散一分鐘或直到受到任何傷害。\n被驅散的生物必須在輪到自己回合時試圖離你越遠越好,且不能自願移進你周圍30呎內的空間。它也不能進行反應。它的動作只能用來進行衝刺行動或試圖逃脫會阻礙其移動的效果。如果沒有任何地方可以移動,該生物會進行閃避行動。",
"CLASS_FEATURE_CLERIC_CHANNEL_DIVINITY_TURN_UNDEAD_TEXT_PART_2": "當一個不死生物在對抗你的驅散死靈能力而豁免失敗時,如果該生物的挑戰級數是CHALLENGE_RATING或更低則立即被摧毀。",
"CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION": "神聖干涉",
- "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use thisfeature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
+ "CLASS_FEATURE_CLERIC_DIVINE_INTERVENTION_TEXT": "You can call on your deity to intervene on your behalf when your need is great.\nImploring your deity’s aid requires you to use your action. Describe the assistance you seek, and roll percentile dice. If you roll a number equal to or lower than your cleric level, your deity intervenes. The GM chooses the nature of the intervention; the effect of any cleric spell or cleric domain spell would be appropriate.\nIf your deity intervenes, you can’t use this feature again for 7 days. Otherwise, you can use it again after you finish a long rest.\nAt 20th level, your call for intervention succeeds automatically, no roll required.",
"CLASS_FEATURE_DRUID_ARCHDRUID": "大德魯伊",
"CLASS_FEATURE_DRUID_ARCHDRUID_TEXT": "You can use your Wild Shape an unlimited number of times.\nAdditionally, you can ignore the verbal and somatic components of your druid spells, as well as any material components that lack a cost and aren’t consumed by a spell. You gain this benefit in both your normal shape and your beast shape from Wild Shape.",
"CLASS_FEATURE_DRUID_BEAST_SPELLS": "野獸法術",
@@ -233,7 +233,7 @@
"CLASS_FEATURE_FIGHTER_SECOND_WIND": "氣力復甦",
"CLASS_FEATURE_FIGHTER_SECOND_WIND_TEXT": "On your turn, you can use a bonus action to regain hit points.",
"CLASS_FEATURE_MONK_DEFLECT_MISSILES": "擋禦飛箭",
- "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. Ifyou catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
+ "CLASS_FEATURE_MONK_DEFLECT_MISSILES_TEXT": "You can use your reaction to deflect or catch the missile when you are hit by a ranged weapon attack. When you do so, the damage you take from the attack is reduced by [[d10 + @{dexterity_mod}[dex] + @{monk_level}[monk level]]].\nIf you reduce the damage to 0, you can catch the missile if it is small enough for you to hold in one hand and you have at least one hand free. If you catch a missile in this way, you can spend 1 ki point to make a ranged attack with the weapon or piece of ammunition you just caught, as part of the same reaction. You make this attack with proficiency, regardless of your weapon proficiencies, and the missile counts as a monk weapon for the attack, which has a normal range of 20 feet and a long range of 60 feet",
"CLASS_FEATURE_MONK_DIAMOND_SOUL": "金剛魂",
"CLASS_FEATURE_MONK_DIAMOND_SOUL_TEXT": "Your mastery of ki grants you proficiency in all saving throws.\nAdditionally, whenever you make a saving throw and fail, you can spend 1 ki point to reroll it and take the second result.",
"CLASS_FEATURE_MONK_EMPTY_BODY": "空靈體",
@@ -249,9 +249,9 @@
"CLASS_FEATURE_MONK_KI_EMPOWERED_STRIKES_TEXT": "Your unarmed strikes count as magical for the purpose of overcoming resistance and immunity to nonmagical attacks and damage.",
"CLASS_FEATURE_MONK_KI_TEXT": "Your training allows you to harness the mystic energy of ki. Your access to this energy is represented by a number of ki points.\nYou can spend these points to fuel various ki features. You start knowing three such features: Flurry of Blows, Patient Defense, and Step of the Wind. You learn more ki features as you gain levels in this class.\nWhen you spend a ki point, it is unavailable until you finish a short or long rest, at the end of which you draw all of your expended ki back into yourself. You must spend at least 30 minutes of the rest meditating to regain your ki points.",
"CLASS_FEATURE_MONK_MARTIAL_ARTS": "武術",
- "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:•\nYou can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
+ "CLASS_FEATURE_MONK_MARTIAL_ARTS_TEXT": "Your practice of martial arts gives you mastery of combat styles that use unarmed strikes and monk weapons, which are shortswords and any simple melee weapons that don’t have the two-‑handed or heavy property.\nYou gain the following benefits while you are unarmed or wielding only monk weapons and you aren’t wearing armor or wielding a shield:\n•You can use Dexterity instead of Strength for the attack and damage rolls of your unarmed strikes and monk weapons.\n•You can roll a d4 in place of the normal damage of your unarmed strike or monk weapon. This die changes as you gain monk levels, as shown in the Martial Arts column of the Monk table.\n•When you use the Attack action with an unarmed strike or a monk weapon on your turn, you can make one unarmed strike as a bonus action. For example, if you take the Attack action and attack with a quarterstaff, you can also make an unarmed strike as a bonus action, assuming you haven’t already taken a bonus action this turn.\nCertain monasteries use specialized forms of the monk weapons. For example, you might use a club that is two lengths of wood connected by a short chain (called a nunchaku) or a sickle with a shorter, straighter blade (called a kama). Whatever name you use for a monk weapon, you can use the game statistics provided for the weapon.",
"CLASS_FEATURE_MONK_PATIENT_DEFENSE": "耐心防禦",
- "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 kipoint to take the Dodge action as a bonus action on your turn.",
+ "CLASS_FEATURE_MONK_PATIENT_DEFENSE_TEXT": "You can spend 1 ki point to take the Dodge action as a bonus action on your turn.",
"CLASS_FEATURE_MONK_PERFECT_SELF": "超凡入聖",
"CLASS_FEATURE_MONK_PERFECT_SELF_TEXT": "When you roll for initiative and have no ki points remaining, you regain 4 ki points.",
"CLASS_FEATURE_MONK_PURITY_OF_BODY": "百病不侵",
@@ -309,9 +309,9 @@
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT": "躲藏目光",
"CLASS_FEATURE_RANGERUA_HIDE_IN_PLAIN_SIGHT_TEXT": "You can remain perfectly still for long periods of time to set up ambushes.\nWhen you attempt to hide on your turn, you can opt to not move on that turn. If you avoid moving, creatures that attempt to detect you take a −10 penalty to their Wisdom (Perception) checks until the start of your next turn. You lose this benefit if you move or fall prone, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden.\nIf you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.",
"CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER": "自然探索者",
- "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attackrolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
+ "CLASS_FEATURE_RANGERUA_NATURAL_EXPLORER_TEXT": "You area master of navigating the natural world, and you react with swift and decisive action when attacked. This grants you the following benefits:\n•You ignore difficult terrain.\n•You have advantage on initiative rolls.\n•On your first turn during combat, you have advantage on attack rolls against creatures that have not yet acted.\nIn addition, you are skilled at navigating the wilderness. You gain the following benefits when traveling for an hour or more:\n•Difficult terrain doesn’t slow your group’s travel.\n•Your group can’t become lost except by magical means.\n•Even when you are engaged in another activity while traveling(such as foraging, navigating, or tracking), you remain alert to danger.\n•If you are traveling alone, you can move stealthily at a normal pace.\n•When you forage, you find twice as much food as you normally would.\n•While tracking other creatures, you also learn their exact number, their sizes, and how long ago they passed through the area.",
"CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS": "原初覺知",
- "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beastas an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending1uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
+ "CLASS_FEATURE_RANGERUA_PRIMEVAL_AWARENESS_TEXT": "Your mastery of ranger lore allows you to establish a powerful link to beasts and to the land around you.\nYou have an innate ability to communicate with beasts, and they recognize you as a kindred spirit. Through sounds and gestures, you can communicate simple ideas to a beast as an action, and can read its basic mood and intent. You learn its emotional state, whether it is affected by magic of any sort, its short-term needs (such as food or safety), and actions you can take (if any) to persuade it to not attack.\nYou cannot use this ability against a creature that you have attacked within the past 10 minutes.\nAdditionally, you can attune your senses to determine if any of your favored enemies lurk nearby. By spending 1 uninterrupted minute in concentration (as if you were concentrating on a spell), you can sense whether any of your favored enemies are present within 5 miles of you. This feature reveals which of your favored enemies are present, their numbers, and the creatures’ general direction and distance (in miles) from you.\nIf there are multiple groups of your favored enemies within range, you learn this information for each group.",
"CLASS_FEATURE_RANGERUA_VANISH": "無蹤身姿",
"CLASS_FEATURE_RANGERUA_VANISH_TEXT": "You can use the Hide action as a bonus action on your turn. Also, you can’t be tracked by nonmagical means, unless you choose to leave a trail.",
"CLASS_FEATURE_RANGER_EXTRA_ATTACK": "額外攻擊 (遊俠)",
@@ -353,7 +353,7 @@
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK": "時來運轉",
"CLASS_FEATURE_ROGUE_STROKE_OF_LUCK_TEXT": "You have an uncanny knack for succeeding when you need to. If your attack misses a target within range, you can turn the miss into a hit. Alternatively, if you fail an ability check, you can treat the d20 roll as a 20.",
"CLASS_FEATURE_ROGUE_THIEVES_CANT": "盜賊密語",
- "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you tohide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves onthe run.",
+ "CLASS_FEATURE_ROGUE_THIEVES_CANT_TEXT": "During your rogue training you learned thieves’ cant, a secret mix of dialect, jargon, and code that allows you to hide messages in seemingly normal conversation. Only another creature that knows thieves’ cant understands such messages. It takes four times longer to convey such a message than it does to speak the same idea plainly.\nIn addition, you understand a set of secret signs and symbols used to convey short, simple messages, such as whether an area is dangerous or the territory of a thieves’ guild, whether loot is nearby, or whether the people in an area are easy marks or will provide a safe house for thieves on the run.",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE": "直覺閃避",
"CLASS_FEATURE_ROGUE_UNCANNY_DODGE_TEXT": "When an attacker that you can see hits you with an attack, you can use your reaction to halve the attack’s damage against you",
"CLASS_FEATURE_SORCERER_FLEXIBLE_CASTING": "彈性施法",
@@ -642,7 +642,6 @@
"LANGUAGES": "語言",
"LARGE": "大型",
"LAWFUL_EVIL": "守序邪惡",
- "LBS": "磅",
"LEATHER": "Leather",
"LEGENDARY_ACTIONS": "傳奇動作",
"LEGENDARY_ACTIONS_TEXT_1": "The",
@@ -728,9 +727,10 @@
"POTION": "Potion",
"POTION_OF_HEALING": "Potion of Healing",
"POUNDS": "磅",
+ "POUNDS_SHORT": "磅",
"PREPARED": "已準備",
"PREPARED_MATTERS": "Prepared matters",
- "PROCESSING_CLOSE_MESSAGE": "If the image is moving at a normal speed and the sheet is responsive, feel free to:",
+ "PROCESSING_CLOSE_MESSAGE": "If this does not close after a few seconds (max 15 seconds for complex cases) then an error has occurred. In that case please open an issue on the issue tracker detailing the steps to reproduce (ideally showing the error in the browser's console).",
"PROCESSING_MESSAGE": "此角色紙正在處理中時請勿將其關閉。",
"PROCESSING_TITLE": "處理中",
"PROF": "熟練",
@@ -742,9 +742,9 @@
"PRONE": "倒地",
"PSION": "心靈術士",
"PSIONICS": "靈能",
- "PSIONICS_FULL": "全靈能者 (心靈術士)",
- "PSIONICS_HALF": "半靈能者 (靈刃)",
- "PSIONICS_THIRD": "次靈能者 (祕紋師)",
+ "PSIONICS_4TH": "次靈能者 (祕紋師)",
+ "PSIONICS_5TH": "半靈能者 (靈刃)",
+ "PSIONICS_9TH": "全靈能者 (心靈術士)",
"PSI_LIMIT": "靈能點上限",
"PSI_POINTS": "靈能點",
"PSYCHIC": "心靈",
diff --git a/5eShaped/translations/zu.json b/5eShaped/translations/zu.json
index 0581f8ca34..16cb09da49 100644
--- a/5eShaped/translations/zu.json
+++ b/5eShaped/translations/zu.json
@@ -131,9 +131,9 @@
"CARRIED": "crwdns24876:0crwdne24876:0",
"CARRYING_CAPACITY": "crwdns24877:0crwdne24877:0",
"CARRYING_PUSH_DRAG_LIFT": "crwdns24878:0crwdne24878:0",
- "CASTERS_FULL": "crwdns24879:0crwdne24879:0",
- "CASTERS_HALF": "crwdns24880:0crwdne24880:0",
- "CASTERS_THIRD": "crwdns24881:0crwdne24881:0",
+ "CASTERS_4TH": "crwdns24881:0crwdne24881:0",
+ "CASTERS_5TH": "crwdns24880:0crwdne24880:0",
+ "CASTERS_9TH": "crwdns24879:0crwdne24879:0",
"CASTING_TIME": "crwdns24882:0crwdne24882:0",
"CHA": "crwdns24883:0crwdne24883:0",
"CHALLENGE": "crwdns24884:0crwdne24884:0",
@@ -642,7 +642,6 @@
"LANGUAGES": "crwdns25302:0crwdne25302:0",
"LARGE": "crwdns25303:0crwdne25303:0",
"LAWFUL_EVIL": "crwdns25304:0crwdne25304:0",
- "LBS": "crwdns25305:0crwdne25305:0",
"LEATHER": "crwdns58396:0crwdne58396:0",
"LEGENDARY_ACTIONS": "crwdns25306:0crwdne25306:0",
"LEGENDARY_ACTIONS_TEXT_1": "crwdns25307:0crwdne25307:0",
@@ -728,6 +727,7 @@
"POTION": "crwdns58406:0crwdne58406:0",
"POTION_OF_HEALING": "crwdns58407:0crwdne58407:0",
"POUNDS": "crwdns25368:0crwdne25368:0",
+ "POUNDS_SHORT": "crwdns25305:0crwdne25305:0",
"PREPARED": "crwdns25369:0crwdne25369:0",
"PREPARED_MATTERS": "crwdns25370:0crwdne25370:0",
"PROCESSING_CLOSE_MESSAGE": "crwdns25371:0crwdne25371:0",
@@ -742,9 +742,9 @@
"PRONE": "crwdns25378:0crwdne25378:0",
"PSION": "crwdns25379:0crwdne25379:0",
"PSIONICS": "crwdns25380:0crwdne25380:0",
- "PSIONICS_FULL": "crwdns25381:0crwdne25381:0",
- "PSIONICS_HALF": "crwdns25382:0crwdne25382:0",
- "PSIONICS_THIRD": "crwdns25383:0crwdne25383:0",
+ "PSIONICS_4TH": "crwdns25383:0crwdne25383:0",
+ "PSIONICS_5TH": "crwdns25382:0crwdne25382:0",
+ "PSIONICS_9TH": "crwdns25381:0crwdne25381:0",
"PSI_LIMIT": "crwdns25386:0crwdne25386:0",
"PSI_POINTS": "crwdns25387:0crwdne25387:0",
"PSYCHIC": "crwdns25388:0crwdne25388:0",