diff --git a/5eShaped/5eShaped.html b/5eShaped/5eShaped.html index bd5d75342a..31e8b3bf38 100644 --- a/5eShaped/5eShaped.html +++ b/5eShaped/5eShaped.html @@ -61,7 +61,7 @@ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 27); +/******/ return __webpack_require__(__webpack_require__.s = 30); /******/ }) /************************************************************************/ /******/ ([ @@ -74,6 +74,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + var isUndefined = exports.isUndefined = function isUndefined(value) { return typeof value === 'undefined'; }; @@ -130,22 +133,34 @@ var getDamagePrefix = exports.getDamagePrefix = function getDamagePrefix(data, r var parseDiceAndDie = exports.parseDiceAndDie = function parseDiceAndDie(data, repString, prefix, fieldFrom) { if (exists(data[repString + '_' + fieldFrom])) { var damageResultRegex = /(\d+)?(d\d+)/gi; - var damageResult = damageResultRegex.exec(data[repString + '_' + fieldFrom]); - if (damageResult && damageResult[2]) { + + var _damageResultRegex$ex = damageResultRegex.exec(data[repString + '_' + fieldFrom]), + _damageResultRegex$ex2 = _slicedToArray(_damageResultRegex$ex, 3), + damageResult = _damageResultRegex$ex2[0], + dice = _damageResultRegex$ex2[1], + die = _damageResultRegex$ex2[2]; + + if (damageResult && die) { if (isUndefinedOrEmpty(data[repString + '_' + prefix + '_dice'])) { - data[repString + '_' + prefix + '_dice'] = damageResult[1] || 1; + data[repString + '_' + prefix + '_dice'] = dice || 1; } - data[repString + '_' + prefix + '_die'] = damageResult[2]; + data[repString + '_' + prefix + '_die'] = die; } } }; var parseDiceAndDieFromSRD = exports.parseDiceAndDieFromSRD = function parseDiceAndDieFromSRD(data, repString, prefix, fieldFrom) { if (exists(data[fieldFrom])) { var damageResultRegex = /(\d+)?(d\d+)/gi; - var damageResult = damageResultRegex.exec(data[fieldFrom]); + + var _damageResultRegex$ex3 = damageResultRegex.exec(data[fieldFrom]), + _damageResultRegex$ex4 = _slicedToArray(_damageResultRegex$ex3, 3), + damageResult = _damageResultRegex$ex4[0], + dice = _damageResultRegex$ex4[1], + die = _damageResultRegex$ex4[2]; + if (damageResult) { - data[repString + '_' + prefix + '_dice'] = parseInt(damageResult[1], 10) || 1; - data[repString + '_' + prefix + '_die'] = damageResult[2]; + data[repString + '_' + prefix + '_dice'] = parseInt(dice, 10) || 1; + data[repString + '_' + prefix + '_die'] = die; } } }; @@ -251,8 +266,12 @@ var formatPBProfDice = exports.formatPBProfDice = function formatPBProfDice(data data.pb_display = data.pb; }; -var cleanName = exports.cleanName = function cleanName(name) { - return name.replace(/“/g, '"').replace(/”/g, '"').replace(/'/g, '’'); +var clean = exports.clean = function clean(content) { + return content.trim().replace(/\u00a0/g, '').replace(/\u2060/g, '').replace('. ', '. ').replace(/'/g, '’').replace(/‒/g, '-').replace(/−/g, '-').replace(/(\d+)(?:[-—−])(\d+)/g, '$1–$2').replace(/"([^"]*)"/g, '“$1”').trim(); +}; + +var cleanContent = exports.cleanContent = function cleanContent(content) { + return clean(content).replace(/.*(\\n)/, '').trim().replace(/.*(\\n)/, '').trim().replace(/\n\s•/g, '\n•').replace(/\*\*\n\t/g, '**').replace(/\*\*\n\n/g, '**').replace(/\*\*\n/g, '**').replace(/\*\*([a-zA-Z0-9()\-–—−\s/\\’]+)[:.]?\s*[:.]?\*\*[:.]?\s*[:.]?([A-Z])/g, '**$1.** $2').replace(/\s\s\n\n/g, '\n\n').trim().trim(); }; var capitalize = exports.capitalize = function capitalize(string) { @@ -263,7 +282,7 @@ var capitalize = exports.capitalize = function capitalize(string) { var showSign = exports.showSign = function showSign(value) { if (value >= 0) { - value = '+' + value; + return '+' + value; } return value; }; @@ -321,13 +340,10 @@ var round = exports.round = function round(n) { }; var addArithmeticOperator = exports.addArithmeticOperator = function addArithmeticOperator(number) { - var value = number; if (number < 0) { - value = ' - ' + Math.abs(number); - } else { - value = ' + ' + number; + return ' - ' + Math.abs(number); } - return value; + return ' + ' + number; }; var addTo = exports.addTo = function addTo(variable, value) { @@ -756,7 +772,7 @@ var HIT_DIE = [20, 12, 10, 8, 6, 4, 2, 0]; var REGEX = { diceAndDie: /(?:(\d+)(d\d+))?/, openParenthesis: /\s?\(?/, - plusMinusBonus: /\s?((?:\+|-)\s?\d+?)?\s?/, + plusMinusBonus: /\s?((?:[+-])\s?\d+?)?\s?/, singleNumber: /(\d+)?/ }; var REPEATING_FIELDS = { @@ -838,15 +854,15 @@ var SKILLS_CUSTOM = { var CURRENCIES = [{ acronym: 'CP', name: 'COPPER', - value: .001 + value: 0.001 }, { acronym: 'SP', name: 'SILVER', - value: .1 + value: 0.1 }, { acronym: 'EP', name: 'ELECTRUM', - value: .5 + value: 0.5 }, { acronym: 'GP', name: 'GOLD', @@ -894,18 +910,20 @@ exports.setupAbilities = exports.updateAbilitiesWithServer = exports.getFormatte var _constants = __webpack_require__(2); -var _abilityChecks = __webpack_require__(6); +var _abilityChecks = __webpack_require__(8); var _actions = __webpack_require__(4); -var _equipment = __webpack_require__(7); +var _equipment = __webpack_require__(9); -var _hitDice = __webpack_require__(11); +var _hitDice = __webpack_require__(12); -var _savingThrows = __webpack_require__(8); +var _savingThrows = __webpack_require__(6); var _server = __webpack_require__(1); +var _skills = __webpack_require__(7); + var _spells = __webpack_require__(5); var _utilities = __webpack_require__(0); @@ -938,8 +956,9 @@ var getMod = exports.getMod = function getMod(score) { var getAbilityNameFromShortName = exports.getAbilityNameFromShortName = function getAbilityNameFromShortName(varName) { if ((0, _utilities.isZero)(varName)) { - varName = 0; - } else if (typeof varName === 'string') { + return 0; + } + if (typeof varName === 'string') { var longNames = { CHA: 'charisma', CON: 'constitution', @@ -951,7 +970,7 @@ var getAbilityNameFromShortName = exports.getAbilityNameFromShortName = function STR: 'strength', WIS: 'wisdom' }; - varName = longNames[varName]; + return longNames[varName]; } return varName; }; @@ -1027,7 +1046,7 @@ var updateAbilitiesWithServer = exports.updateAbilitiesWithServer = function upd callback(); } if (abilitiesUpdated.length > 0) { - (0, _abilityChecks.updateSkill)(); + (0, _skills.updateSkill)(); (0, _abilityChecks.updateAbilityChecks)(); (0, _actions.updateAllActions)(); // updateProvidedAttacks(); @@ -1071,15 +1090,15 @@ var _constants = __webpack_require__(2); var _abilities = __webpack_require__(3); -var _actionComponents = __webpack_require__(15); +var _actionComponents = __webpack_require__(13); -var _attack = __webpack_require__(12); +var _attack = __webpack_require__(14); -var _equipment = __webpack_require__(7); +var _equipment = __webpack_require__(9); -var _heal = __webpack_require__(16); +var _heal = __webpack_require__(17); -var _savingThrow = __webpack_require__(17); +var _savingThrow = __webpack_require__(18); var _server = __webpack_require__(1); @@ -1379,29 +1398,31 @@ var setupActions = exports.setupActions = function setupActions() { 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; +exports.setupSpells = exports.parseSpellFromSRDWithServer = exports.parseSpellFromSRD = exports.parseLevel = 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 _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _constants = __webpack_require__(2); var _abilities = __webpack_require__(3); -var _actionComponents = __webpack_require__(15); +var _actionComponents = __webpack_require__(13); var _actions = __webpack_require__(4); -var _attack = __webpack_require__(12); +var _attack = __webpack_require__(14); -var _distance = __webpack_require__(10); +var _distance = __webpack_require__(11); -var _heal = __webpack_require__(16); +var _heal = __webpack_require__(17); -var _savingThrow = __webpack_require__(17); +var _savingThrow = __webpack_require__(18); var _server = __webpack_require__(1); var _utilities = __webpack_require__(0); -var _processing = __webpack_require__(9); +var _processing = __webpack_require__(10); 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 */ @@ -1776,7 +1797,7 @@ var updateSpells = exports.updateSpells = function updateSpells() { } else { var spellLevel = (0, _utilities.getLevelOfRepeatingString)(repString); if (data[repString + '_name'].includes('\'')) { - data[repString + '_name'] = (0, _utilities.cleanName)(data[repString + '_name']); + data[repString + '_name'] = (0, _utilities.clean)(data[repString + '_name']); } if ((0, _utilities.isUndefinedOrEmpty)(data[repString + '_spell_level'])) { data[repString + '_spell_level'] = (0, _utilities.ordinalSpellLevel)(spellLevel); @@ -2203,25 +2224,38 @@ var parseSpellcastingFromTraits = function parseSpellcastingFromTraits(data, rep 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 _spellcastingLevelReg = spellcastingLevelRegex.exec(traitContent), + _spellcastingLevelReg2 = _slicedToArray(_spellcastingLevelReg, 2), + spellcastingLevelSearch = _spellcastingLevelReg2[0], + casterLevel = _spellcastingLevelReg2[1]; + + if (spellcastingLevelSearch && casterLevel) { + data.caster_level = casterLevel; + data.spellcaster_level = (0, _utilities.ordinalSpellLevel)(casterLevel); } - var spellcastingClassSearch = spellcastingClassRegex.exec(traitContent); - if (spellcastingClassSearch && spellcastingClassSearch[1]) { - data.spellcasting_class = spellcastingClassSearch[1].toUpperCase(); + + var _spellcastingClassReg = spellcastingClassRegex.exec(traitContent), + _spellcastingClassReg2 = _slicedToArray(_spellcastingClassReg, 2), + spellcastingClassSearch = _spellcastingClassReg2[0], + spellcastingClass = _spellcastingClassReg2[1]; + + if (spellcastingClassSearch && spellcastingClass) { + data.spellcasting_class = spellcastingClass.toUpperCase(); } else { - var spellcastingClassSearchSecond = spellcastingClassRegexSecond.exec(traitContent); - if (spellcastingClassSearchSecond && spellcastingClassSearchSecond[1]) { - data.spellcasting_class = spellcastingClassSearchSecond[1].toUpperCase(); + var _spellcastingClassReg3 = spellcastingClassRegexSecond.exec(traitContent), + _spellcastingClassReg4 = _slicedToArray(_spellcastingClassReg3, 2), + spellcastingClassSearchSecond = _spellcastingClassReg4[0], + spellcastingClassSecond = _spellcastingClassReg4[1]; + + if (spellcastingClassSearchSecond && spellcastingClassSecond) { + data.spellcasting_class = spellcastingClassSecond.toUpperCase(); } } }; var parseInnateSpellcastingFromTraits = function parseInnateSpellcastingFromTraits(data, repStrings, traitContent) { data.innate_spellcasting = 1; - var innateSpellsRegex = /(?:At will|each):\s(.*)/gi; + var innateSpellsRegex = /(?:At will|\d\/day(?:\s?each)|Constant):\s(.*)/gi; var innateSpellcastingComponentRegex = /(.*requiring no material components:)/i; var innateSpellcastingComponentRegexSecond = /(.*requiring only verbal components:)/i; @@ -2363,10 +2397,6 @@ var findSpellcasting = exports.findSpellcasting = function findSpellcasting(repe }); }; -var cleanContent = exports.cleanContent = function cleanContent(content) { - return content.replace(/“/g, '"').replace(/”/g, '"').replace(/'/g, '’').replace(/\*\*\n\t/g, '**').replace(/\*\*\n/g, '**').replace(/\*\*([a-zA-Z0-9()\-\s/\\’\u2013]+)[:.]?\s*[:.]?\*\*[:.]?\s*[:.]?([A-Z])/g, '**$1.** $2').replace(/\s\s\n\n/g, '\n\n'); -}; - 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']; @@ -2384,7 +2414,7 @@ var getLevel = function getLevel(data) { var parseName = function parseName(data, repString) { if (data.name_from_srd) { - data[repString + '_name'] = (0, _utilities.cleanName)(data.name_from_srd); + data[repString + '_name'] = (0, _utilities.clean)(data.name_from_srd); } }; @@ -2433,7 +2463,7 @@ var parseComponents = function parseComponents(data, repString) { var parseMaterials = function parseMaterials(data, repString) { if (data.material_from_srd) { - data[repString + '_materials'] = cleanContent(data.material_from_srd); + data[repString + '_materials'] = (0, _utilities.clean)(data.material_from_srd); } }; @@ -2450,7 +2480,7 @@ var parseDuration = function parseDuration(data, repString) { var parseContent = function parseContent(data, repString) { if (data.content_from_srd) { - data[repString + '_content'] = cleanContent(data.content_from_srd); + data[repString + '_content'] = (0, _utilities.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) { @@ -2667,7 +2697,7 @@ var setupSpells = exports.setupSpells = function setupSpells() { Object.defineProperty(exports, "__esModule", { value: true }); -exports.setupAbilityChecks = exports.updateSkill = exports.updateAbilityChecks = exports.updateAbilityChecksMacro = undefined; +exports.setupSavingThrows = exports.updateSavingThrows = exports.findHighestSavingThrow = undefined; var _constants = __webpack_require__(2); @@ -2677,162 +2707,234 @@ 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, removeRepeatingRow:false */ +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 updateAbilityChecksMacro = exports.updateAbilityChecksMacro = function updateAbilityChecksMacro() { - (0, _server.getSetItems)('abilityChecks.updateMacro', { - collectionArray: [].concat(_toConsumableArray(_constants.FIELDS.d20), ['ability_checks_query_var', 'ability_checks_macro_var', 'honor_toggle', 'is_npc', 'sanity_toggle', 'skills_macro_var'], _toConsumableArray(_constants.ABILITIES.map(function (ability) { - return ability + '_check_formula'; - })), _toConsumableArray(_constants.ABILITIES.map(function (ability) { - return ability + '_check_mod_with_sign'; - }))), - collectionArrayRepeatingSections: [{ - collectionArrayAddItems: ['ability', 'formula', 'name', 'show', '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) { - if (!(0, _utilities.exists)(data.is_npc) || data[repString + '_show']) { - 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) { +var getHighestOfAbilityScoresForSavingThrow = function getHighestOfAbilityScoresForSavingThrow(data, savingThrow) { + var abilityName = ''; + var highestValue = 0; _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() + ']'); + var abilityMod = (0, _abilities.getAbilityMod)(data, ability); + if ((0, _utilities.exists)(data[savingThrow + '_' + ability]) && (highestValue === 0 || abilityMod > highestValue)) { + highestValue = abilityMod; + abilityName = ability; } + }); + return abilityName; +}; - (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 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 updateInitiative = function updateInitiative(data) { +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 = { - initiative: 0, - initiativeFormula: '' + abilitiesUsed: [] }; - var initiativeAbility = data.initiative_ability || 'DEX'; - var abilityMod = (0, _abilities.getAbilityMod)(data, initiativeAbility); + var sum = 0; - if ((0, _utilities.exists)(initiativeAbility)) { - obj.initiative += abilityMod; - obj.initiativeFormula = (0, _utilities.addTo)(obj.initiativeFormula, abilityMod + '[' + getTranslationByKey(initiativeAbility).toLowerCase() + ']'); + 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); + }); - (0, _utilities.addModifier)(data, obj, (0, _abilities.getAbilityNameFromShortName)(initiativeAbility) + '_check', 'initiative', 'initiativeFormula', getTranslationByKey(initiativeAbility).toLowerCase() + ' ' + getTranslationByKey('CHECK_MODIFIER').toLowerCase()); + if (obj.abilitiesUsed && obj.abilitiesUsed.length > 0) { + obj.avg = (0, _abilities.getMod)(sum / obj.abilitiesUsed.length); } - - (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; + return obj; }; -var updateAbilityChecks = exports.updateAbilityChecks = function updateAbilityChecks() { - (0, _server.getSetItems)('abilityChecks.update', { - collectionArray: [].concat(_toConsumableArray(_constants.FIELDS.pb), _toConsumableArray(_constants.FIELDS.abilityScores), _toConsumableArray(_constants.FIELDS.d20), _toConsumableArray(_constants.FIELDS.abilityCheckModifier), ['initiative', 'initiative_ability', 'initiative_formula', 'initiative_modifier', 'initiative_modifier_dice', 'initiative_to_tracker', 'initiative_tie_breaker', 'class_feature_bard_jack_of_all_trades_toggle', 'class_feature_fighter_champion_remarkable_athlete_toggle'], _toConsumableArray(_constants.ABILITIES.map(function (ability) { - return ability + '_mod'; - })), _toConsumableArray(_constants.ABILITIES.map(function (ability) { - return ability + '_check_modifier'; - })), _toConsumableArray(_constants.ABILITIES.map(function (ability) { - return ability + '_check_modifier_dice'; - })), _toConsumableArray(_constants.ABILITIES.map(function (ability) { - return ability + '_check_mod_with_sign'; - })), _toConsumableArray(_constants.ABILITIES.map(function (ability) { - return ability + '_check_formula'; - }))), - process: function process(data) { - updateAbilityChecksInner(data); - updateInitiative(data); - }, - processCallback: function processCallback() { - updateAbilityChecksMacro(); +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 = exports.updateSavingThrows = function updateSavingThrows() { + var _ref; + + var collectionArray = (_ref = [].concat(_toConsumableArray(_constants.FIELDS.pb), _toConsumableArray(_constants.FIELDS.d20), _toConsumableArray(_constants.FIELDS.abilityScores), ['average_of_abilities', 'honor_toggle', 'is_npc', 'sanity_toggle', 'saving_throw_macro_var', 'saving_throw_modifier', 'saving_throw_modifier_dice', 'saving_throw_query_var', 'saving_throws_half_proficiency', 'use_custom_saving_throws'], _toConsumableArray(_constants.ALL_SAVING_THROWS.map(function (savingThrow) { + return savingThrow + '_saving_throw_proficient'; + })), _toConsumableArray(_constants.ALL_SAVING_THROWS.map(function (savingThrow) { + return savingThrow + '_saving_throw_modifier'; + })), _toConsumableArray(_constants.ALL_SAVING_THROWS.map(function (savingThrow) { + return savingThrow + '_saving_throw_mod_with_sign'; + })), _toConsumableArray(_constants.ALL_SAVING_THROWS.map(function (savingThrow) { + return savingThrow + '_saving_throw_formula'; + })))).concat.apply(_ref, _toConsumableArray(_constants.CUSTOM_SAVING_THROWS.map(function (customSavingThrow) { + return _constants.ABILITIES.map(function (ability) { + return customSavingThrow + '_' + ability; + }); + }))); + + (0, _server.getSetItems)('savingThrows.update', { + collectionArray: collectionArray, + process: function process(data) { + _constants.ALL_SAVING_THROWS.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 setupSavingThrows = exports.setupSavingThrows = function setupSavingThrows() { + var _ref2; + + var savingThrowsWatch = (_ref2 = ['average_of_abilities', 'honor_toggle', 'sanity_toggle', 'saving_throws_half_proficiency', 'use_custom_saving_throws'].concat(_toConsumableArray(_constants.ALL_SAVING_THROWS.map(function (savingThrow) { + return savingThrow + '_saving_throw_proficient'; + })))).concat.apply(_ref2, _toConsumableArray(_constants.CUSTOM_SAVING_THROWS.map(function (customSavingThrow) { + return _constants.ABILITIES.map(function (ability) { + return customSavingThrow + '_' + ability; + }); + }))); + + on('' + savingThrowsWatch.map(function (field) { + return 'change:' + field; + }).join(' '), function () { + updateSavingThrows(); + }); +}; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.setupSkills = exports.generateSkills = exports.updateSkillToggle = exports.updateSkill = undefined; + +var _constants = __webpack_require__(2); + +var _abilities = __webpack_require__(3); + +var _abilityChecks = __webpack_require__(8); + +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, generateRowID:false, getTranslationByKey:false, removeRepeatingRow:false */ + var updateSkill = exports.updateSkill = function updateSkill() { var collectionArray = [].concat(_toConsumableArray(_constants.FIELDS.pb), _toConsumableArray(_constants.FIELDS.abilityScores), _toConsumableArray(_constants.FIELDS.d20), _toConsumableArray(_constants.FIELDS.abilityCheckModifier), ['class_feature_bard_jack_of_all_trades_toggle', 'class_feature_fighter_champion_remarkable_athlete_toggle', 'class_feature_rogue_reliable_talent_toggle', 'show_passive_skills'], _toConsumableArray(_constants.ABILITIES.map(function (ability) { return ability + '_check_modifier'; @@ -2950,12 +3052,12 @@ var updateSkill = exports.updateSkill = function updateSkill() { }); }, processCallback: function processCallback() { - updateAbilityChecksMacro(); + (0, _abilityChecks.updateAbilityChecksMacro)(); } }); }; -var updateSkillToggle = function updateSkillToggle(repeatingInfo) { +var updateSkillToggle = exports.updateSkillToggle = function updateSkillToggle(repeatingInfo) { (0, _server.getSetItems)('abilityChecks.updateSkillToggle', { collectionArrayRepeatingSections: [{ collectionArrayAddItems: ['proficiency'], @@ -2979,15 +3081,88 @@ var updateSkillToggle = function updateSkillToggle(repeatingInfo) { }); }; -var setupAbilityChecks = exports.setupAbilityChecks = function setupAbilityChecks() { - var abilityCheckWatch = [].concat(_toConsumableArray(_constants.FIELDS.pb), _toConsumableArray(_constants.ABILITIES), ['initiative_ability', 'initiative_to_tracker', 'initiative_tie_breaker', 'class_feature_bard_jack_of_all_trades_toggle', 'class_feature_fighter_champion_remarkable_athlete_toggle']); +var generateSkills = exports.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; + } + 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']; + }); - on(abilityCheckWatch.map(function (field) { - return 'change:' + field; - }).join(' '), function () { - updateAbilityChecks(); + 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() { + updateSkill(); + } }); +}; +var setupSkills = exports.setupSkills = function setupSkills() { + on('change:generate_skills', function () { + generateSkills(); + }); + on('change:regenerate_skills', function () { + generateSkills('replace'); + }); + on('change:show_passive_skills', function () { + updateSkill(); + }); on('change:repeating_skill', function (eventInfo) { var repeatingInfo = (0, _utilities.getRepeatingInfo)('repeating_skill', eventInfo); if (repeatingInfo && repeatingInfo.field === 'prof_toggle') { @@ -2999,24 +3174,16 @@ var setupAbilityChecks = exports.setupAbilityChecks = function setupAbilityCheck }); var updateSkillWatch = [].concat(_toConsumableArray(_constants.FIELDS.pb), _toConsumableArray(_constants.ABILITIES), _toConsumableArray(_constants.ABILITIES.map(function (ability) { return ability + '_check_formula'; - })), ['class_feature_bard_jack_of_all_trades_toggle', 'class_feature_fighter_champion_remarkable_athlete_toggle', 'class_feature_rogue_reliable_talent_toggle']); - - updateSkillWatch = updateSkillWatch.map(function (ability) { + })), ['class_feature_bard_jack_of_all_trades_toggle', 'class_feature_fighter_champion_remarkable_athlete_toggle', 'class_feature_rogue_reliable_talent_toggle']).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 */ +/* 8 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3025,7 +3192,145 @@ var setupAbilityChecks = exports.setupAbilityChecks = function setupAbilityCheck Object.defineProperty(exports, "__esModule", { value: true }); -exports.setupEquipment = exports.updateCarryingCapacity = exports.updateCurrency = exports.parseItemFromSRDWithServer = exports.updateEquipment = exports.updateArmor = exports.updateWeight = exports.parseItemFromSRD = exports.cleanContent = undefined; +exports.setupAbilityChecks = exports.updateAbilityChecks = exports.updateAbilityChecksMacro = undefined; + +var _constants = __webpack_require__(2); + +var _abilities = __webpack_require__(3); + +var _initiative = __webpack_require__(31); + +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 updateAbilityChecksMacro = exports.updateAbilityChecksMacro = function updateAbilityChecksMacro() { + (0, _server.getSetItems)('abilityChecks.updateMacro', { + collectionArray: [].concat(_toConsumableArray(_constants.FIELDS.d20), ['ability_checks_query_var', 'ability_checks_macro_var', 'honor_toggle', 'is_npc', 'sanity_toggle', 'skills_macro_var'], _toConsumableArray(_constants.ABILITIES.map(function (ability) { + return ability + '_check_formula'; + })), _toConsumableArray(_constants.ABILITIES.map(function (ability) { + return ability + '_check_mod_with_sign'; + }))), + collectionArrayRepeatingSections: [{ + collectionArrayAddItems: ['ability', 'formula', 'name', 'show', '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) { + if (!(0, _utilities.exists)(data.is_npc) || data[repString + '_show']) { + 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 updateAbilityChecks = exports.updateAbilityChecks = function updateAbilityChecks() { + (0, _server.getSetItems)('abilityChecks.update', { + collectionArray: [].concat(_toConsumableArray(_constants.FIELDS.pb), _toConsumableArray(_constants.FIELDS.abilityScores), _toConsumableArray(_constants.FIELDS.d20), _toConsumableArray(_constants.FIELDS.abilityCheckModifier), ['initiative', 'initiative_ability', 'initiative_formula', 'initiative_modifier', 'initiative_modifier_dice', 'initiative_to_tracker', 'initiative_tie_breaker', 'class_feature_bard_jack_of_all_trades_toggle', 'class_feature_fighter_champion_remarkable_athlete_toggle'], _toConsumableArray(_constants.ABILITIES.map(function (ability) { + return ability + '_mod'; + })), _toConsumableArray(_constants.ABILITIES.map(function (ability) { + return ability + '_check_modifier'; + })), _toConsumableArray(_constants.ABILITIES.map(function (ability) { + return ability + '_check_modifier_dice'; + })), _toConsumableArray(_constants.ABILITIES.map(function (ability) { + return ability + '_check_mod_with_sign'; + })), _toConsumableArray(_constants.ABILITIES.map(function (ability) { + return ability + '_check_formula'; + }))), + process: function process(data) { + updateAbilityChecksInner(data); + (0, _initiative.updateInitiative)(data); + }, + processCallback: function processCallback() { + updateAbilityChecksMacro(); + } + }); +}; + +var setupAbilityChecks = exports.setupAbilityChecks = function setupAbilityChecks() { + var abilityCheckWatch = [].concat(_toConsumableArray(_constants.FIELDS.pb), _toConsumableArray(_constants.ABILITIES), ['initiative_ability', 'initiative_to_tracker', 'initiative_tie_breaker', 'class_feature_bard_jack_of_all_trades_toggle', 'class_feature_fighter_champion_remarkable_athlete_toggle']); + + on(abilityCheckWatch.map(function (field) { + return 'change:' + field; + }).join(' '), function () { + updateAbilityChecks(); + }); + on('change:_reporder_repeating_skill remove:repeating_skill change:honor_toggle change:sanity_toggle', function () { + updateAbilityChecksMacro(); + }); +}; + +/***/ }), +/* 9 */ +/***/ (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 = undefined; var _constants = __webpack_require__(2); @@ -3033,26 +3338,22 @@ var _utilities = __webpack_require__(0); var _abilities = __webpack_require__(3); -var _actionComponents = __webpack_require__(15); +var _actionComponents = __webpack_require__(13); var _actions = __webpack_require__(4); -var _armorClass = __webpack_require__(18); +var _armorClass = __webpack_require__(19); -var _attack = __webpack_require__(12); +var _attack = __webpack_require__(14); -var _damage = __webpack_require__(13); +var _damage = __webpack_require__(15); var _server = __webpack_require__(1); -var _processing = __webpack_require__(9); +var _processing = __webpack_require__(10); 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, getTranslationByKey:false */ -var cleanContent = exports.cleanContent = function cleanContent(content) { - return content.trim().replace(/.*(\\n)/, '').trim().replace(/.*(\\n)/, '').trim().replace(/.*(\\n)/, '').replace('. ', '. ').replace(/“/g, '"').replace(/”/g, '"').replace(/'/g, '’').replace(/\*\*\n\t/g, '**').replace(/\*\*\n/g, '**').replace(/\*\*([a-zA-Z0-9()\-\s/\\’\u2013]+)[:.]?\s*[:.]?\*\*[:.]?\s*[:.]?([A-Z])/g, '**$1.** $2').replace(/\s\s\n\n/g, '\n\n').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'; @@ -3305,7 +3606,7 @@ var parseItemType = function parseItemType(data, repString) { var parseContent = function parseContent(data, repString) { if (data.content_from_srd) { - data[repString + '_content'] = cleanContent(data.content_from_srd); + data[repString + '_content'] = (0, _utilities.cleanContent)(data.content_from_srd); } }; @@ -3325,7 +3626,7 @@ var parseStandardFields = function parseStandardFields(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) || ''; + data.name_from_srd = (0, _utilities.clean)(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'; @@ -3616,10 +3917,10 @@ var weighAmmo = function weighAmmo() { process: function process(data, repStrings) { data.weight_ammo = 0; repStrings.forEach(function (repString) { - (0, _actionComponents.changeWeightSystem)(data, repString, .05); + (0, _actionComponents.changeWeightSystem)(data, repString, 0.05); (0, _actionComponents.weighActionComponents)(data, repString, { repeatingSectionTotal: 'weight_ammo', - weightDefault: .05 + weightDefault: 0.05 }); }); data.weight_ammo = (0, _utilities.round)(data.weight_ammo); @@ -3630,34 +3931,6 @@ var weighAmmo = function weighAmmo() { }); }; -var updateCurrency = exports.updateCurrency = function updateCurrency() { - (0, _server.getSetItems)('updateCurrency', { - collectionArray: ['weight_system', 'weight_currency', 'currency_formula'], - collectionArrayRepeatingSections: [{ - collectionArrayAddItems: ['acronym', 'quantity', 'value', 'weight', 'weight_system'], - name: 'repeating_currency' - }], - process: function process(data, repStrings) { - data.currency_value = 0; - data.weight_currency = 0; - var currencyValues = []; - repStrings.forEach(function (repString) { - var quantity = parseFloat(data[repString + '_quantity'] || 0); - data.currency_value += quantity * parseFloat(data[repString + '_value'] || 0); - (0, _actionComponents.changeWeightSystem)(data, repString, .02); - data.weight_currency += quantity * parseFloat(data[repString + '_weight'] || 0); - currencyValues.push(data[repString + '_quantity'] + ' ' + data[repString + '_acronym']); - }); - data.currency_value = data.currency_value.toFixed(2) || 0; - data.weight_currency = (0, _utilities.round)(data.weight_currency) || 0; - data.currency_formula = '{{text=' + currencyValues.join(', ') + ' = **' + data.currency_value + '**}}'; - }, - processCallback: function processCallback() { - updateWeight(); - } - }); -}; - var updateCarryingCapacity = exports.updateCarryingCapacity = function updateCarryingCapacity() { (0, _server.getSetItems)('updateCarryingCapacity', { collectionArray: ['strength', 'strength_score_modifier', 'ability_score_modifier', 'carrying_capacity', 'carrying_capacity_multiplier', 'max_push_drag_lift', 'max_push_drag_lift_multiplier', 'encumbered', 'encumbered_multiplier', 'heavily_encumbered', 'heavily_encumbered_multiplier', 'racial_feature_powerful_build'], @@ -3707,16 +3980,12 @@ var setupEquipment = exports.setupEquipment = function setupEquipment() { on('change:weight_offense change:weight_utility change:weight_ammo change:weight_armor change:weight_equipment change:weight_currency', function () { updateWeight(); }); - on('change:repeating_currency remove:repeating_currency', function () { - updateCurrency(); - }); 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(); - updateCurrency(); weighAmmo(); }); on('change:proficient_armor_weighs', function () { @@ -3725,231 +3994,7 @@ var setupEquipment = exports.setupEquipment = function setupEquipment() { }; /***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.setupSavingThrows = exports.updateSavingThrows = 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 = exports.updateSavingThrows = function updateSavingThrows() { - var _ref; - - var collectionArray = (_ref = [].concat(_toConsumableArray(_constants.FIELDS.pb), _toConsumableArray(_constants.FIELDS.d20), _toConsumableArray(_constants.FIELDS.abilityScores), ['average_of_abilities', 'honor_toggle', 'is_npc', 'sanity_toggle', 'saving_throw_macro_var', 'saving_throw_modifier', 'saving_throw_modifier_dice', 'saving_throw_query_var', 'saving_throws_half_proficiency', 'use_custom_saving_throws'], _toConsumableArray(_constants.ALL_SAVING_THROWS.map(function (savingThrow) { - return savingThrow + '_saving_throw_proficient'; - })), _toConsumableArray(_constants.ALL_SAVING_THROWS.map(function (savingThrow) { - return savingThrow + '_saving_throw_modifier'; - })), _toConsumableArray(_constants.ALL_SAVING_THROWS.map(function (savingThrow) { - return savingThrow + '_saving_throw_mod_with_sign'; - })), _toConsumableArray(_constants.ALL_SAVING_THROWS.map(function (savingThrow) { - return savingThrow + '_saving_throw_formula'; - })))).concat.apply(_ref, _toConsumableArray(_constants.CUSTOM_SAVING_THROWS.map(function (customSavingThrow) { - return _constants.ABILITIES.map(function (ability) { - return customSavingThrow + '_' + ability; - }); - }))); - - (0, _server.getSetItems)('savingThrows.update', { - collectionArray: collectionArray, - process: function process(data) { - _constants.ALL_SAVING_THROWS.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 setupSavingThrows = exports.setupSavingThrows = function setupSavingThrows() { - var _ref2; - - var savingThrowsWatch = (_ref2 = ['average_of_abilities', 'honor_toggle', 'sanity_toggle', 'saving_throws_half_proficiency', 'use_custom_saving_throws'].concat(_toConsumableArray(_constants.ALL_SAVING_THROWS.map(function (savingThrow) { - return savingThrow + '_saving_throw_proficient'; - })))).concat.apply(_ref2, _toConsumableArray(_constants.CUSTOM_SAVING_THROWS.map(function (customSavingThrow) { - return _constants.ABILITIES.map(function (ability) { - return customSavingThrow + '_' + ability; - }); - }))); - - on('' + savingThrowsWatch.map(function (field) { - return 'change:' + field; - }).join(' '), function () { - updateSavingThrows(); - }); -}; - -/***/ }), -/* 9 */ +/* 10 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4028,7 +4073,7 @@ var setupProcessing = exports.setupProcessing = function setupProcessing() { }; /***/ }), -/* 10 */ +/* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4062,18 +4107,14 @@ var convertDistanceTypes = function convertDistanceTypes(data, field, multiplier 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]]); + data[field] = data[field].replace(regex, '' + result[1] + secondDistance + (result[3] || '') + feetMetersNameConversion[result[4]]); } } }; @@ -4091,7 +4132,7 @@ var convertDistance = exports.convertDistance = function convertDistance(data, f }; /***/ }), -/* 11 */ +/* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4196,7 +4237,366 @@ var setupHitDice = exports.setupHitDice = function setupHitDice() { }; /***/ }), -/* 12 */ +/* 13 */ +/***/ (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__(14); + +var _distance = __webpack_require__(11); + +var _damage = __webpack_require__(15); + +var _heal = __webpack_require__(17); + +var _savingThrow = __webpack_require__(18); + +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') { + data[repString + '_name'] = (0, _utilities.clean)(data[repString + '_name']); + 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'])) { + data[repString + '_name'] = (0, _utilities.clean)(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); +}; + +/***/ }), +/* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4209,9 +4609,9 @@ exports.parseAttack = exports.parseToHit = exports.parseReachAndRange = exports. var _abilities = __webpack_require__(3); -var _damage = __webpack_require__(13); +var _damage = __webpack_require__(15); -var _distance = __webpack_require__(10); +var _distance = __webpack_require__(11); var _utilities = __webpack_require__(0); @@ -4496,7 +4896,7 @@ var parseAttack = exports.parseAttack = function parseAttack(data, repString) { }; /***/ }), -/* 13 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4902,7 +5302,7 @@ var parseDamage = exports.parseDamage = function parseDamage(data, repString, pr }; /***/ }), -/* 14 */ +/* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4911,34 +5311,38 @@ var parseDamage = exports.parseDamage = function parseDamage(data, repString, pr Object.defineProperty(exports, "__esModule", { value: true }); -exports.setupNPC = exports.parseMonsterFromSRDWithServer = exports.parseMonsterFromSRD = exports.monsterDroppedOnTabletop = exports.parseHP = exports.parseSRDContentSection = exports.cleanContent = undefined; +exports.setupNPC = exports.parseMonsterFromSRDWithServer = exports.parseMonsterFromSRD = exports.monsterDroppedOnTabletop = exports.parseSkills = exports.parseHP = exports.parseSRDContentSection = exports.cleanNPCContent = exports.updateHP = undefined; var _utilities = __webpack_require__(0); var _constants = __webpack_require__(2); -var _abilityChecks = __webpack_require__(6); +var _abilityChecks = __webpack_require__(8); var _abilities = __webpack_require__(3); var _actions = __webpack_require__(4); -var _hitDice = __webpack_require__(11); +var _hitDice = __webpack_require__(12); -var _resistances = __webpack_require__(22); +var _resistances = __webpack_require__(25); -var _processing = __webpack_require__(9); +var _processing = __webpack_require__(10); -var _proficiencyBonus = __webpack_require__(19); +var _proficiencyBonus = __webpack_require__(20); var _server = __webpack_require__(1); -var _senses = __webpack_require__(23); +var _senses = __webpack_require__(26); -var _speeds = __webpack_require__(24); +var _skills = __webpack_require__(7); + +var _speeds = __webpack_require__(27); var _spells = __webpack_require__(5); +var _attachers = __webpack_require__(22); + 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, setDefaultToken:false */ var sizeToHdSize = { @@ -5035,53 +5439,61 @@ var updateChallenge = function updateChallenge(callback) { }); }; -var updateHP = function updateHP(data) { +var parseHPExtra = function parseHPExtra(data, hpData) { + if ((0, _utilities.exists)(data.hp_extra)) { + if (typeof data.hp_extra === 'string') { + data.hp_extra = data.hp_extra.toString().replace(/-/g, '-').replace(/—/g, '-').replace(/−/g, '-'); + } + var regex = /(?:([+-])\s?)?(\d+)(?:d(\d+))?/gi; + var splitFormula = void 0; + + while (splitFormula = regex.exec(data.hp_extra)) { + if (!splitFormula || !splitFormula[2]) { + console.error('Character doesn’t have valid hp formula'); + } else if (!splitFormula[3]) { + hpData.bonusHP += parseInt('' + (splitFormula[1] || '') + splitFormula[2], 10); + } else { + var extraHdNum = parseInt(splitFormula[2], 10); + var extraHdSize = parseInt(splitFormula[3], 10); + var extraHdAverage = extraHdSize / 2 + 0.5; + + var amount = extraHdNum * extraHdAverage; + if (!splitFormula[1] || splitFormula[1] === '+') { + data.HP += amount; + data.hp_formula += ' + ' + extraHdNum + 'd' + extraHdSize; + } else if (splitFormula[1] === '-') { + data.HP -= amount; + data.hp_formula += ' - ' + extraHdNum + 'd' + extraHdSize; + } + } + } + } +}; + +var updateHP = exports.updateHP = function updateHP(data) { + var hpData = { + bonusHP: 0 + }; var hdNum = parseFloat(data.hit_dice); var hdSize = parseInt(data.hit_die.replace('d', ''), 10); - var hdAverage = Math.floor(hdSize / 2 + 0.5); + var hdAverage = Math.floor(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); + hpData.bonusHP += hdNum * conMod; } + parseHPExtra(data, hpData); - 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 (hpData.bonusHP) { + data.HP += hpData.bonusHP; + data.hp_formula += (0, _utilities.addArithmeticOperator)(hpData.bonusHP); } if (data.HP) { + data.HP = Math.ceil(data.HP); data.HP_max = data.HP; } }; @@ -5130,12 +5542,8 @@ var turnOnSlotsIfItsNotSet = function turnOnSlotsIfItsNotSet() { }); }; -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(/\u00a0/g, '').replace(/\u2060/g, '').replace(/\+ (\d+) to hit/g, '+$1 to hit').replace(/Hit:(\d+)/g, 'Hit: $1').replace(/.*(\\n)/, '').replace('. ', '. ').replace(/“/g, '"').replace(/”/g, '"').replace(/'/g, '’').replace(/\*\*\n\t/g, '**').replace(/\*\*\n\n/g, '**').replace(/\*\*\n/g, '**').replace(/\*\*([a-zA-Z0-9()\-\s/\\’\u2013]+)[:.]?\s*[:.]?\*\*[:.]?\s*[:.]?([A-Z])/g, '**$1.** $2').replace(/\s\s\n\n/g, '\n\n').replace(/\sLegendary Actions\s*\n/g, '\n Legendary Actions\n').replace(/\sReactions\s*\n/g, '\n Reactions\n').replace(/\s\sActions\s*\n\n/g, '\n Actions\n\n').replace(/^(?:\s?Actions\s*\n)/g, 'content \n Actions\n').replace(/^(?:\s?Traits\s*\n)/g, 'content \n Traits\n').replace(/\sTraits\s*\n/g, '\n Traits\n').replace(/\sRegional Effects\s*\n/g, '\n Regional Effects\n').replace(/\sLair Actions\s*\n/g, '\n Lair Actions\n').trim().trim().replace('reach ft.', '').trim().replace(/\sft.\//, '/') // bandit and salamander +var cleanNPCContent = exports.cleanNPCContent = function cleanNPCContent(content) { + return (0, _utilities.cleanContent)(content).replace(/\+ (\d+) to hit/g, '+$1 to hit').replace(/Hit:(\d+)/g, 'Hit: $1').replace(/.*(\\n)/, '').replace(/\sLegendary Actions\s*\n/g, '\n Legendary Actions\n').replace(/\sReactions\s*\n/g, '\n Reactions\n').replace(/\s\sActions\s*\n\n/g, '\n Actions\n\n').replace(/^(?:\s?Actions\s*\n)/g, 'content \n Actions\n').replace(/^(?:\s?Traits\s*\n)/g, 'content \n Traits\n').replace(/\sTraits\s*\n/g, '\n Traits\n').replace(/\sRegional Effects\s*\n/g, '\n Regional Effects\n').replace(/\sLair Actions\s*\n/g, '\n Lair Actions\n').trim().trim().replace('reach ft.', '').trim().replace(/\sft.\//, '/') // bandit and salamander .replace(/ \n\n[A-z].*/g, '').trim(); }; @@ -5144,7 +5552,7 @@ var parseSizeTypeAlignment = function parseSizeTypeAlignment(data) { data.size = data.size_from_srd.toUpperCase(); } if (data.type_from_srd) { - data.type = cleanName(data.type_from_srd.toLowerCase()); + data.type = (0, _utilities.clean)(data.type_from_srd.toLowerCase()); } if (data.alignment_from_srd) { data.alignment = data.alignment_from_srd.toLowerCase(); @@ -5203,7 +5611,7 @@ var parseSRDContentSection = exports.parseSRDContentSection = function parseSRDC data[repString + '_content_toggle'] = 1; data[repString + '_toggle_details'] = 0; } else { - console.error('Character doesn\'t have a valid ' + name + ' format'); + console.error('Character doesn\u2019t have a valid ' + name + ' format'); } } } @@ -5212,8 +5620,8 @@ var parseSRDContentSection = exports.parseSRDContentSection = function parseSRDC 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); + data.hp_from_srd = data.hp_from_srd.replace(/-/g, '-').replace(/—/g, '-').replace(/−/g, '-').replace(/‒/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 { @@ -5327,7 +5735,36 @@ var parseSavingThrows = function parseSavingThrows(data) { } }; -var parseSkills = function parseSkills(data, repStrings) { +var makeSkillAttacher = function makeSkillAttacher(_ref) { + var data = _ref.data, + skillName = _ref.skillName, + text = _ref.text; + + var repString = 'repeating_attacher_' + generateRowID(); + data[repString + '_skill_attacher'] = 'on'; + data[repString + '_name'] = skillName + ' bonus'; + data[repString + '_freetext'] = text; +}; + +var parseExpertiseAsAdvantage = function parseExpertiseAsAdvantage(_ref2) { + var data = _ref2.data, + repStringNew = _ref2.repStringNew; + + 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'; +}; + +var getSkillNameFromList = function getSkillNameFromList(skillName) { + return Object.keys(_constants.SKILLS).indexOf(skillName.toUpperCase()); +}; + +var parseSkills = exports.parseSkills = function parseSkills(data, repStrings) { var skillsObj = {}; var expertise = data.pb * 2; @@ -5340,7 +5777,7 @@ var parseSkills = function parseSkills(data, repStrings) { }; }); - var re = /([\w\s]+)\s?((?:\+|-)\d+)/gi; + var re = /([\w\s]+)\s?((?:[+-])\d+)(?:\s?\(([^)]+)\))?/gi; var match = void 0; var modifierRepString = 'repeating_modifier_' + generateRowID(); while ((match = re.exec(data.skills_from_srd)) !== null) { @@ -5351,29 +5788,32 @@ var parseSkills = function parseSkills(data, repStrings) { var repStringNew = 'repeating_skill_' + skillId; var abilityValue = (0, _abilities.getAbilityMod)(data, skillsObj[skillName].ability); var skillBonus = parseInt(match[2], 10) - abilityValue; + if (match[3]) { + makeSkillAttacher({ + data: data, + skillName: skillName, + text: match[3] + }); + } 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'; + parseExpertiseAsAdvantage({ + data: data, + repStringNew: repStringNew + }); } 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; + data[modifierRepString + '_skill_' + getSkillNameFromList(skillName) + '_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; + data[modifierRepString + '_skill_' + getSkillNameFromList(skillName) + '_modifier'] = skillBonus - data.pb; } } } else { @@ -5443,7 +5883,7 @@ var parseMonsterFromSRD = exports.parseMonsterFromSRD = function parseMonsterFro if (data.name_from_srd) { // TODO fix character name - data.character_name = cleanName(data.name_from_srd); + data.character_name = (0, _utilities.clean)(data.name_from_srd); } parseSizeTypeAlignment(data); parseAC(data); @@ -5457,7 +5897,7 @@ var parseMonsterFromSRD = exports.parseMonsterFromSRD = function parseMonsterFro parseSenses(data); if (data.content_from_srd) { - data.content_from_srd = cleanContent(data.content_from_srd); + data.content_from_srd = cleanNPCContent(data.content_from_srd); parseSRDContentSection(data, 'Legendary Actions', 'legendaryaction'); parseSRDContentSection(data, 'Reactions', 'reaction'); parseSRDContentSection(data, 'Actions', 'action'); @@ -5492,7 +5932,7 @@ var parseMonsterFromSRDWithServer = exports.parseMonsterFromSRDWithServer = func }, processCallback: function processCallback() { (0, _abilities.updateAbilitiesWithServer)(); - (0, _abilityChecks.updateSkill)(); + (0, _skills.updateSkill)(); (0, _abilityChecks.updateAbilityChecks)(); (0, _hitDice.updateHitDice)(); (0, _speeds.updateSpeeds)(); @@ -5500,6 +5940,7 @@ var parseMonsterFromSRDWithServer = exports.parseMonsterFromSRDWithServer = func (0, _actions.updateAllActions)(); (0, _resistances.updateDamageResistances)(); (0, _spells.findSpellcasting)(); + (0, _attachers.updateAttachers)(); }, serverCallCallback: function serverCallCallback() { (0, _processing.clearProcessing)(); @@ -5533,364 +5974,7 @@ var setupNPC = exports.setupNPC = function setupNPC() { }; /***/ }), -/* 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__(10); - -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 */ +/* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5974,7 +6058,7 @@ var parseHealFromSRD = exports.parseHealFromSRD = function parseHealFromSRD(data }; /***/ }), -/* 17 */ +/* 18 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -5989,7 +6073,7 @@ var _constants = __webpack_require__(2); var _abilities = __webpack_require__(3); -var _damage = __webpack_require__(13); +var _damage = __webpack_require__(15); var _utilities = __webpack_require__(0); @@ -6101,7 +6185,7 @@ var parseSavingThrow = exports.parseSavingThrow = function parseSavingThrow(data }; /***/ }), -/* 18 */ +/* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6143,7 +6227,7 @@ var setupArmorClass = exports.setupArmorClass = function setupArmorClass() { }; /***/ }), -/* 19 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6160,7 +6244,7 @@ var _abilities = __webpack_require__(3); var _actions = __webpack_require__(4); -var _savingThrows = __webpack_require__(8); +var _savingThrows = __webpack_require__(6); var _server = __webpack_require__(1); @@ -6214,7 +6298,166 @@ var setupProficiencyBonus = exports.setupProficiencyBonus = function setupProfic }; /***/ }), -/* 20 */ +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.setupCurrency = exports.generateCurrency = exports.updateCurrency = undefined; + +var _constants = __webpack_require__(2); + +var _server = __webpack_require__(1); + +var _equipment = __webpack_require__(9); + +var _utilities = __webpack_require__(0); + +var _actionComponents = __webpack_require__(13); + +var updateCurrency = exports.updateCurrency = function updateCurrency() { + (0, _server.getSetItems)('updateCurrency', { + collectionArray: ['weight_system', 'weight_currency', 'currency_formula'], + collectionArrayRepeatingSections: [{ + collectionArrayAddItems: ['acronym', 'quantity', 'value', 'weight', 'weight_system'], + name: 'repeating_currency' + }], + process: function process(data, repStrings) { + data.currency_value = 0; + data.weight_currency = 0; + var currencyValues = []; + repStrings.forEach(function (repString) { + var quantity = parseFloat(data[repString + '_quantity'] || 0); + data.currency_value += quantity * parseFloat(data[repString + '_value'] || 0); + (0, _actionComponents.changeWeightSystem)(data, repString, 0.02); + data.weight_currency += quantity * parseFloat(data[repString + '_weight'] || 0); + currencyValues.push(data[repString + '_quantity'] + ' ' + data[repString + '_acronym']); + }); + data.currency_value = data.currency_value.toFixed(2) || 0; + data.weight_currency = (0, _utilities.round)(data.weight_currency) || 0; + data.currency_formula = '{{text=' + currencyValues.join(', ') + ' = **' + data.currency_value + '**}}'; + }, + processCallback: function processCallback() { + (0, _equipment.updateWeight)(); + } + }); +}; /* global on:false, generateRowID:false, getTranslationByKey:false */ + +var generateCurrency = exports.generateCurrency = function generateCurrency() { + (0, _server.getSetItems)('initialize.generateCurrency', { + collectionArrayRepeatingSections: [{ + collectionArrayAddItems: ['acronym', 'name', 'value', 'weight'], + name: 'repeating_currency' + }], + process: function process(data) { + _constants.CURRENCIES.forEach(function (currency) { + var repString = 'repeating_currency_' + generateRowID(); + data[repString + '_acronym'] = getTranslationByKey(currency.acronym); + data[repString + '_name'] = getTranslationByKey(currency.name); + data[repString + '_value'] = currency.value; + data[repString + '_weight'] = 0.02; + data[repString + '_border'] = currency.name; + }); + }, + processCallback: function processCallback() { + updateCurrency(); + } + }); +}; + +var setupCurrency = exports.setupCurrency = function setupCurrency() { + on('change:repeating_currency remove:repeating_currency', function () { + updateCurrency(); + }); + on('change:weight_system', function () { + updateCurrency(); + }); +}; + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.setupAttachers = exports.updateAttachers = undefined; + +var _constants = __webpack_require__(2); + +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 */ + +var updateAttachers = exports.updateAttachers = function updateAttachers() { + var collectionArray = [].concat(_toConsumableArray(_constants.ACTION_TYPES), ['initiative', 'death_saving_throw', 'hit_dice', 'spell', 'skill', 'crit'], _toConsumableArray(_constants.ABILITIES.map(function (ability) { + return ability + '_check'; + })), _toConsumableArray(_constants.ALL_SAVING_THROWS.map(function (savingThrow) { + return savingThrow + '_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(_toConsumableArray(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 + ' '; + } + } + }); + }); + } + }); +}; + +var setupAttachers = exports.setupAttachers = function setupAttachers() { + on('change:repeating_attacher remove:repeating_attacher', function () { + updateAttachers(); + }); +}; + +/***/ }), +/* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6227,13 +6470,13 @@ exports.setupClasses = exports.updateLevels = undefined; var _constants = __webpack_require__(2); -var _classFeatures = __webpack_require__(21); +var _classFeatures = __webpack_require__(24); -var _hitDice = __webpack_require__(11); +var _hitDice = __webpack_require__(12); -var _proficiencyBonus = __webpack_require__(19); +var _proficiencyBonus = __webpack_require__(20); -var _savingThrows = __webpack_require__(8); +var _savingThrows = __webpack_require__(6); var _server = __webpack_require__(1); @@ -6506,7 +6749,7 @@ var setupClasses = exports.setupClasses = function setupClasses() { }; /***/ }), -/* 21 */ +/* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6523,9 +6766,9 @@ var _abilities = __webpack_require__(3); var _actions = __webpack_require__(4); -var _equipment = __webpack_require__(7); +var _equipment = __webpack_require__(9); -var _features = __webpack_require__(29); +var _features = __webpack_require__(32); var _server = __webpack_require__(1); @@ -7113,7 +7356,7 @@ var setupClassFeature = exports.setupClassFeature = function setupClassFeature() }; /***/ }), -/* 22 */ +/* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7164,7 +7407,7 @@ var setupResistances = exports.setupResistances = function setupResistances() { }; /***/ }), -/* 23 */ +/* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7177,7 +7420,7 @@ exports.setupSenses = exports.updateSenses = undefined; var _constants = __webpack_require__(2); -var _distance = __webpack_require__(10); +var _distance = __webpack_require__(11); var _server = __webpack_require__(1); @@ -7222,7 +7465,7 @@ var setupSenses = exports.setupSenses = function setupSenses() { }; /***/ }), -/* 24 */ +/* 27 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7235,7 +7478,7 @@ exports.setupSpeeds = exports.updateSpeeds = undefined; var _constants = __webpack_require__(2); -var _distance = __webpack_require__(10); +var _distance = __webpack_require__(11); var _server = __webpack_require__(1); @@ -7284,7 +7527,7 @@ var setupSpeeds = exports.setupSpeeds = function setupSpeeds() { }; /***/ }), -/* 25 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7299,16 +7542,18 @@ var _constants = __webpack_require__(2); var _abilities = __webpack_require__(3); -var _abilityChecks = __webpack_require__(6); +var _abilityChecks = __webpack_require__(8); var _actions = __webpack_require__(4); -var _armorClass = __webpack_require__(18); +var _armorClass = __webpack_require__(19); -var _savingThrows = __webpack_require__(8); +var _savingThrows = __webpack_require__(6); var _server = __webpack_require__(1); +var _skills = __webpack_require__(7); + var _spells = __webpack_require__(5); var _utilities = __webpack_require__(0); @@ -7454,7 +7699,7 @@ var updateModifiers = exports.updateModifiers = function updateModifiers() { } else { if (updatedSections.includes('ability_check')) { (0, _abilityChecks.updateAbilityChecks)(); - (0, _abilityChecks.updateSkill)(); + (0, _skills.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)(); @@ -7488,7 +7733,7 @@ var setupModifiers = exports.setupModifiers = function setupModifiers() { }; /***/ }), -/* 26 */ +/* 29 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7503,14 +7748,16 @@ var _constants = __webpack_require__(2); var _abilities = __webpack_require__(3); -var _abilityChecks = __webpack_require__(6); +var _abilityChecks = __webpack_require__(8); var _actions = __webpack_require__(4); -var _savingThrows = __webpack_require__(8); +var _savingThrows = __webpack_require__(6); var _server = __webpack_require__(1); +var _skills = __webpack_require__(7); + var _spells = __webpack_require__(5); var _utilities = __webpack_require__(0); @@ -7525,7 +7772,7 @@ var updateShapedD20 = function updateShapedD20() { data.roll_setting = 'roll2'; (0, _abilities.updateAbilitiesWithServer)(); (0, _abilityChecks.updateAbilityChecks)(); - (0, _abilityChecks.updateSkill)(); + (0, _skills.updateSkill)(); (0, _abilityChecks.updateAbilityChecksMacro)(); (0, _savingThrows.updateSavingThrows)(); (0, _actions.updateAllActionsWithAttack)(); @@ -7535,7 +7782,7 @@ var updateShapedD20 = function updateShapedD20() { data.roll_setting = 'ignore'; (0, _abilities.updateAbilitiesWithServer)(); (0, _abilityChecks.updateAbilityChecks)(); - (0, _abilityChecks.updateSkill)(); + (0, _skills.updateSkill)(); (0, _abilityChecks.updateAbilityChecksMacro)(); (0, _savingThrows.updateSavingThrows)(); (0, _actions.updateAllActionsWithAttack)(); @@ -7611,7 +7858,7 @@ var setupSettings = exports.setupSettings = function setupSettings() { }; /***/ }), -/* 27 */ +/* 30 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7619,55 +7866,59 @@ var setupSettings = exports.setupSettings = function setupSettings() { var _abilities = __webpack_require__(3); -var _abilityChecks = __webpack_require__(6); +var _abilityChecks = __webpack_require__(8); var _actions = __webpack_require__(4); -var _armorClass = __webpack_require__(18); +var _armorClass = __webpack_require__(19); -var _attachers = __webpack_require__(28); +var _attachers = __webpack_require__(22); -var _classes = __webpack_require__(20); +var _classes = __webpack_require__(23); -var _classFeatures = __webpack_require__(21); +var _classFeatures = __webpack_require__(24); -var _conditions = __webpack_require__(30); +var _conditions = __webpack_require__(33); -var _equipment = __webpack_require__(7); +var _currency = __webpack_require__(21); -var _hitDice = __webpack_require__(11); +var _equipment = __webpack_require__(9); -var _hitPoints = __webpack_require__(31); +var _hitDice = __webpack_require__(12); -var _initialize = __webpack_require__(32); +var _hitPoints = __webpack_require__(34); -var _modifiers = __webpack_require__(25); +var _initialize = __webpack_require__(35); -var _npc = __webpack_require__(14); +var _modifiers = __webpack_require__(28); -var _processing = __webpack_require__(9); +var _npc = __webpack_require__(16); -var _proficiencyBonus = __webpack_require__(19); +var _processing = __webpack_require__(10); -var _RacialTraits = __webpack_require__(36); +var _proficiencyBonus = __webpack_require__(20); -var _resistances = __webpack_require__(22); +var _RacialTraits = __webpack_require__(39); -var _rest = __webpack_require__(37); +var _resistances = __webpack_require__(25); -var _savingThrows = __webpack_require__(8); +var _rest = __webpack_require__(40); -var _senses = __webpack_require__(23); +var _savingThrows = __webpack_require__(6); -var _settings = __webpack_require__(26); +var _senses = __webpack_require__(26); -var _speeds = __webpack_require__(24); +var _settings = __webpack_require__(29); + +var _skills = __webpack_require__(7); + +var _speeds = __webpack_require__(27); var _spells = __webpack_require__(5); -var _ImportData = __webpack_require__(38); +var _ImportData = __webpack_require__(41); -var _compendiumDrop = __webpack_require__(39); +var _compendiumDrop = __webpack_require__(42); (0, _abilities.setupAbilities)(); (0, _abilityChecks.setupAbilityChecks)(); @@ -7677,6 +7928,7 @@ var _compendiumDrop = __webpack_require__(39); (0, _classes.setupClasses)(); (0, _classFeatures.setupClassFeature)(); (0, _conditions.setupConditions)(); +(0, _currency.setupCurrency)(); (0, _equipment.setupEquipment)(); (0, _hitDice.setupHitDice)(); (0, _hitPoints.setupHitPoints)(); @@ -7691,13 +7943,14 @@ var _compendiumDrop = __webpack_require__(39); (0, _savingThrows.setupSavingThrows)(); (0, _senses.setupSenses)(); (0, _settings.setupSettings)(); +(0, _skills.setupSkills)(); (0, _speeds.setupSpeeds)(); (0, _spells.setupSpells)(); (0, _ImportData.setupImportData)(); (0, _compendiumDrop.listenForCompendiumDrop)(); /***/ }), -/* 28 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7706,76 +7959,69 @@ var _compendiumDrop = __webpack_require__(39); Object.defineProperty(exports, "__esModule", { value: true }); -exports.setupAttachers = undefined; +exports.updateInitiative = undefined; -var _constants = __webpack_require__(2); - -var _server = __webpack_require__(1); +var _abilities = __webpack_require__(3); 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 */ +/* global getTranslationByKey:false */ -var updateAttachers = function updateAttachers() { - var collectionArray = [].concat(_toConsumableArray(_constants.ACTION_TYPES), ['initiative', 'death_saving_throw', 'hit_dice', 'spell', 'skill', 'crit'], _toConsumableArray(_constants.ABILITIES.map(function (ability) { - return ability + '_check'; - })), _toConsumableArray(_constants.ALL_SAVING_THROWS.map(function (savingThrow) { - return savingThrow + '_saving_throw'; - }))); +var updateInitiative = exports.updateInitiative = function updateInitiative(data) { + var obj = { + initiative: 0, + initiativeFormula: '' + }; + var initiativeAbility = data.initiative_ability || 'DEX'; + var abilityMod = (0, _abilities.getAbilityMod)(data, initiativeAbility); - for (var level = 0; level <= 9; level += 1) { - collectionArray.push('spell_level_' + level); + 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, _server.getSetItems)('attachers.update', { - collectionArray: collectionArray.map(function (attacher) { - return 'attacher_' + attacher; - }), - collectionArrayRepeatingSections: [{ - collectionArrayAddItems: ['name', 'freetext', 'freeform'].concat(_toConsumableArray(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'] || ''; + (0, _utilities.addModifier)(data, obj, 'initiative', 'initiative', 'initiativeFormula', getTranslationByKey(initiativeAbility).toLowerCase() + ' ' + getTranslationByKey('MODIFIER').toLowerCase()); - 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 + ' '; - } - } - }); - }); + 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() + ']'); + } -var setupAttachers = exports.setupAttachers = function setupAttachers() { - on('change:repeating_attacher remove:repeating_attacher', function () { - updateAttachers(); - }); + (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; }; /***/ }), -/* 29 */ +/* 32 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7899,7 +8145,7 @@ var findAndChangeFeature = exports.findAndChangeFeature = function findAndChange }; /***/ }), -/* 30 */ +/* 33 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7947,7 +8193,7 @@ var setupConditions = exports.setupConditions = function setupConditions() { }; /***/ }), -/* 31 */ +/* 34 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7993,7 +8239,7 @@ var setupHitPoints = exports.setupHitPoints = function setupHitPoints() { }; /***/ }), -/* 32 */ +/* 35 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8004,119 +8250,23 @@ Object.defineProperty(exports, "__esModule", { }); exports.setupInitialize = undefined; -var _abilities = __webpack_require__(3); - -var _abilityChecks = __webpack_require__(6); - -var _equipment = __webpack_require__(7); - var _constants = __webpack_require__(2); -var _conversion = __webpack_require__(33); +var _conversion = __webpack_require__(36); + +var _currency = __webpack_require__(21); var _server = __webpack_require__(1); -var _upgrade = __webpack_require__(34); +var _skills = __webpack_require__(7); + +var _upgrade = __webpack_require__(37); var _utilities = __webpack_require__(0); -var _package = __webpack_require__(35); +var _package = __webpack_require__(38); -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, 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; - } - 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 generateCurrency = function generateCurrency() { - (0, _server.getSetItems)('initialize.generateCurrency', { - collectionArrayRepeatingSections: [{ - collectionArrayAddItems: ['acronym', 'name', 'value', 'weight'], - name: 'repeating_currency' - }], - process: function process(data) { - _constants.CURRENCIES.forEach(function (currency) { - var repString = 'repeating_currency_' + generateRowID(); - data[repString + '_acronym'] = getTranslationByKey(currency.acronym); - data[repString + '_name'] = getTranslationByKey(currency.name); - data[repString + '_value'] = currency.value; - data[repString + '_weight'] = .02; - data[repString + '_border'] = currency.name; - }); - }, - processCallback: function processCallback() { - (0, _equipment.updateCurrency)(); - } - }); -}; +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 */ var setVersion = function setVersion(data) { if ((0, _utilities.isUndefinedOrEmpty)(data.version) || !data.version || data.version !== _package.version) { @@ -8136,8 +8286,8 @@ var sheetOpened = function sheetOpened() { if ((0, _utilities.isUndefinedOrEmpty)(data.version) || convertOGL) { _process = convertOGL ? 'ogl_conversion' : 'new_character'; data.level = 0; - generateSkills(); - generateCurrency(); + (0, _skills.generateSkills)(); + (0, _currency.generateCurrency)(); if (convertOGL) { (0, _conversion.convertFromOGL)(); } @@ -8160,19 +8310,13 @@ var sheetOpened = function sheetOpened() { }; 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 */ +/* 36 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8183,19 +8327,21 @@ Object.defineProperty(exports, "__esModule", { }); 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.convertDescription = exports.convertAttackFlag = exports.convertNPCSkills = undefined; +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); /* global generateRowID:false, removeRepeatingRow:false, getTranslationByKey:false */ + var _constants = __webpack_require__(2); var _abilities = __webpack_require__(3); -var _npc = __webpack_require__(14); +var _npc = __webpack_require__(16); -var _processing = __webpack_require__(9); +var _processing = __webpack_require__(10); 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 generateRowID:false, removeRepeatingRow:false, getTranslationByKey:false */ +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); } } var parseSpellcastingAbility = function parseSpellcastingAbility(data) { if (data.spellcasting_ability) { @@ -8205,14 +8351,20 @@ var parseSpellcastingAbility = function parseSpellcastingAbility(data) { 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]) { + var _data$npc_type$match = data.npc_type.match(/(.*?) (.*?), (.*)/i), + _data$npc_type$match2 = _slicedToArray(_data$npc_type$match, 4), + match = _data$npc_type$match2[0], + size = _data$npc_type$match2[1], + type = _data$npc_type$match2[2], + alignment = _data$npc_type$match2[3]; + + if (!data.npc_type || !match || !size || !type || !alignment) { 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]; + data.size = size.toUpperCase(); + data.type = type; + data.alignment = alignment; } }; @@ -8261,13 +8413,22 @@ var convertJackOfAllTrades = function convertJackOfAllTrades(data) { 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 _data$other_proficien = data.other_proficiencies_and_languages.match(/Proficiencies. (.*)/i), + _data$other_proficien2 = _slicedToArray(_data$other_proficien, 2), + proficieniesMatch = _data$other_proficien2[0], + proficiencies = _data$other_proficien2[1]; + + if (proficieniesMatch && proficiencies) { + data.proficiencies = proficiencies; } - var languagesMatch = data.other_proficiencies_and_languages.match(/Languages. (.*)/i); - if (languagesMatch && languagesMatch[1]) { - data.languages = languagesMatch[1]; + + var _data$other_proficien3 = data.other_proficiencies_and_languages.match(/Languages. (.*)/i), + _data$other_proficien4 = _slicedToArray(_data$other_proficien3, 2), + languagesMatch = _data$other_proficien4[0], + languages = _data$other_proficien4[1]; + + if (languagesMatch && languages) { + data.languages = languages; } } }; @@ -8529,6 +8690,9 @@ 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'); }); + if (spellRepStrings && spellRepStrings.length > 0) { + data.show_spells = 1; + } var levelFromPreviousField = 0; var _iteratorNormalCompletion = true; var _didIteratorError = false; @@ -8538,7 +8702,6 @@ var convertSpells = exports.convertSpells = function convertSpells(data) { 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'])) { @@ -8676,7 +8839,7 @@ var convertFromOGL = exports.convertFromOGL = function convertFromOGL() { /* NPC Convcersion - * weapons like "3 (1d6-1) bludgeoning damage plus 3 (1d6) poison damage" aren't converting both damages + * weapons like "3 (1d6-1) bludgeoning damage plus 3 (1d6) poison damage" aren’t converting both damages PC Conversion: * convert "attacks" to repeating attacks @@ -8686,7 +8849,7 @@ var convertFromOGL = exports.convertFromOGL = function convertFromOGL() { */ /***/ }), -/* 34 */ +/* 37 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8699,27 +8862,27 @@ exports.upgradeSheet = exports.generateCurrencyForExistingCharacters = exports.s var _constants = __webpack_require__(2); -var _abilityChecks = __webpack_require__(6); +var _currency = __webpack_require__(21); -var _savingThrows = __webpack_require__(8); +var _classes = __webpack_require__(23); -var _classes = __webpack_require__(20); +var _hitDice = __webpack_require__(12); -var _hitDice = __webpack_require__(11); +var _modifiers = __webpack_require__(28); -var _modifiers = __webpack_require__(25); +var _processing = __webpack_require__(10); -var _processing = __webpack_require__(9); +var _savingThrows = __webpack_require__(6); var _server = __webpack_require__(1); -var _settings = __webpack_require__(26); +var _settings = __webpack_require__(29); var _utilities = __webpack_require__(0); -var _spells = __webpack_require__(5); +var _skills = __webpack_require__(7); -var _equipment = __webpack_require__(7); +var _spells = __webpack_require__(5); 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 getTranslationByKey:false, generateRowID: false */ @@ -8800,11 +8963,11 @@ var generateCurrencyForExistingCharacters = exports.generateCurrencyForExistingC var currencyMap = { COPPER: { quantity: data.cp || 0, - value: data.copper_per_gold / 100000 || .001 + value: data.copper_per_gold / 100000 || 0.001 }, ELECTRUM: { quantity: data.ep || 0, - value: data.electrum_per_gold / 4 || .5 + value: data.electrum_per_gold / 4 || 0.5 }, GOLD: { quantity: data.gp || 0, @@ -8816,7 +8979,7 @@ var generateCurrencyForExistingCharacters = exports.generateCurrencyForExistingC }, SILVER: { quantity: data.sp || 0, - value: data.silver_per_gold / 100 || .1 + value: data.silver_per_gold / 100 || 0.1 } }; @@ -8826,7 +8989,7 @@ var generateCurrencyForExistingCharacters = exports.generateCurrencyForExistingC data[repString + '_name'] = getTranslationByKey(currency.name); data[repString + '_quantity'] = currencyMap[currency.name].quantity; data[repString + '_value'] = currencyMap[currency.name].value; - data[repString + '_weight'] = data.weight_per_coin || .02; + data[repString + '_weight'] = data.weight_per_coin || 0.02; data[repString + '_border'] = currency.name; }); data.cp = ''; @@ -8936,12 +9099,12 @@ var runUpgrade = function runUpgrade(sheetVersion) { }); } if (versionCompare(sheetVersion, '18.1.1') < 0) { - (0, _equipment.updateCurrency)(); + (0, _currency.updateCurrency)(); } if (versionCompare(sheetVersion, '18.1.4') < 0) { (0, _modifiers.updateModifiers)(); (0, _savingThrows.updateSavingThrows)(); - (0, _abilityChecks.updateSkill)(); + (0, _skills.updateSkill)(); } (0, _processing.clearProcessing)(); } @@ -8966,13 +9129,13 @@ var upgradeSheet = exports.upgradeSheet = function upgradeSheet(sheetVersion) { }; /***/ }), -/* 35 */ +/* 38 */ /***/ (function(module, exports) { -module.exports = {"name":"5eShaped","version":"19.0.0","bin":"./","description":"5e Shaped character sheet for Roll20.net","main":"gulpfile.js","devDependencies":{"babel-core":"^6.26.3","babel-eslint":"^8.2.6","babel-loader":"^7.1.5","babel-preset-es2015":"^6.24.0","cache-loader":"^1.2.2","chai":"^4.1.2","chai-spies":"^1.0.0","cross-env":"^5.2.0","eslint":"^4.19.1","eslint-config-airbnb":"^17.0.0","eslint-plugin-import":"^2.13.0","eslint-plugin-jsx-a11y":"^6.1.1","eslint-plugin-react":"^7.10.0","gulp":"^3.9.1","gulp-autoprefixer":"^5.0.0","gulp-clean-css":"^3.9.4","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.3.0","gulp-replace-task":"^0.11.0","gulp-sass":"^4.0.1","gulp-tap":"^1.0.1","gulp-util":"^3.0.8","gulp-wrapper":"1.0.0","husky":"^0.14.3","istanbul-instrumenter-loader":"^3.0.1","json-loader":"^0.5.7","lint-staged":"^7.2.0","mocha":"^5.2.0","mocha-webpack":"^1.1.0","nyc":"^12.0.2","request":"2.87.0","sass-lint":"^1.12.1","sinon":"^6.1.3","streamqueue":"^1.1.2","webpack-node-externals":"^1.7.2","webpack-stream":"^4.0.3"},"repository":{"type":"git","url":"https://bitbucket.org/mlenser/5eshaped/"},"scripts":{"coverage":"cross-env NODE_ENV=coverage nyc npm test","lint":"eslint ./sheet/**/*.js","sass-lint":"sass-lint ./sheet/**/*.scss -v -q","precommit":"lint-staged","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"},"lint-staged":{"*.js":["git add","yarn run lint","yarn run test"]},"nyc":{"extension":[".js"],"all":true,"instrument":false,"sourceMap":false,"reporter":["lcov","text-summary","text"]},"author":"Mark Lenser (Kryx)","private":true} +module.exports = {"name":"5eShaped","version":"19.1.1","bin":"./","description":"5e Shaped character sheet for Roll20.net","main":"gulpfile.js","devDependencies":{"babel-core":"^6.26.3","babel-eslint":"^8.2.6","babel-loader":"^7.1.5","babel-preset-es2015":"^6.24.0","cache-loader":"^1.2.2","chai":"^4.1.2","chai-spies":"^1.0.0","cross-env":"^5.2.0","eslint":"^4.19.1","eslint-config-airbnb":"^17.0.0","eslint-plugin-import":"^2.13.0","eslint-plugin-jsx-a11y":"^6.1.1","eslint-plugin-react":"^7.10.0","gulp":"^3.9.1","gulp-autoprefixer":"^5.0.0","gulp-clean-css":"^3.9.4","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.4.0","gulp-replace-task":"^0.11.0","gulp-sass":"^4.0.1","gulp-tap":"^1.0.1","gulp-util":"^3.0.8","gulp-wrapper":"1.0.0","husky":"^0.14.3","istanbul-instrumenter-loader":"^3.0.1","json-loader":"^0.5.7","lint-staged":"^7.2.0","mocha":"^5.2.0","mocha-webpack":"^1.1.0","nyc":"^12.0.2","request":"2.87.0","sass-lint":"^1.12.1","sinon":"^6.1.4","streamqueue":"^1.1.2","webpack-node-externals":"^1.7.2","webpack-stream":"^4.0.3"},"repository":{"type":"git","url":"https://bitbucket.org/mlenser/5eshaped/"},"scripts":{"coverage":"cross-env NODE_ENV=coverage nyc npm test","lint":"eslint ./sheet/**/*.js","sass-lint":"sass-lint ./sheet/**/*.scss -v -q","precommit":"lint-staged","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"},"lint-staged":{"*.js":["git add","yarn run lint","yarn run test"]},"nyc":{"extension":[".js"],"all":true,"instrument":false,"sourceMap":false,"reporter":["lcov","text-summary","text"]},"author":"Mark Lenser (Kryx)","private":true} /***/ }), -/* 36 */ +/* 39 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9012,7 +9175,7 @@ var setupRacialTraits = exports.setupRacialTraits = function setupRacialTraits() }; /***/ }), -/* 37 */ +/* 40 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9032,16 +9195,7 @@ 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 recoverBasedOnType = function recoverBasedOnType(type, field) { - if (type === 'long' && (field === 'LONG_REST' || field === 'SHORT_OR_LONG_REST' || field === 'TURN' || field.includes('RECHARGE'))) { - return true; - } - if (type === 'short' && (field === 'SHORT_OR_LONG_REST' || field === 'TURN' || field.includes('RECHARGE'))) { - return true; - } - if (type === 'turn' && field === 'TURN') { - return true; - } - return false; + return type === 'long' && (field === 'LONG_REST' || field === 'SHORT_OR_LONG_REST' || field === 'TURN' || field.includes('RECHARGE')) || type === 'short' && (field === 'SHORT_OR_LONG_REST' || field === 'TURN' || field.includes('RECHARGE')) || type === 'turn' && field === 'TURN'; }; var recoverHitPoints = function recoverHitPoints(data, scriptOutput, type) { @@ -9252,7 +9406,7 @@ var setupRests = exports.setupRests = function setupRests() { }; /***/ }), -/* 38 */ +/* 41 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9263,7 +9417,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.setupImportData = undefined; -var _npc = __webpack_require__(14); +var _npc = __webpack_require__(16); var _server = __webpack_require__(1); @@ -9299,7 +9453,7 @@ var setupImportData = exports.setupImportData = function setupImportData() { }; /***/ }), -/* 39 */ +/* 42 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9310,9 +9464,9 @@ Object.defineProperty(exports, "__esModule", { }); exports.listenForCompendiumDrop = undefined; -var _equipment = __webpack_require__(7); +var _equipment = __webpack_require__(9); -var _npc = __webpack_require__(14); +var _npc = __webpack_require__(16); var _spells = __webpack_require__(5); diff --git a/5eShaped/changelog.md b/5eShaped/changelog.md index b2771e9bee..6a3a52e132 100644 --- a/5eShaped/changelog.md +++ b/5eShaped/changelog.md @@ -11,6 +11,20 @@ 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. +## 19.1.1 + +### Bug fixes +- [#754: Incorrect assumption that all innate spellcasting groups will end with "each"](https://bitbucket.org/mlenser/5eshaped/issues/757/incorrect-assumption-that-all-innate) + + +## 19.1.0 + +### Features +- The sheet now supports some newer script edge-case features such as Anubian’s stealth being higher in sand. + +### Bug fixes +- [#752: NPC Average HP's not calculating properly](https://bitbucket.org/mlenser/5eshaped/issues/752/npc-average-hps-not-calculating-properly) + ## 19.0.0 ### Breaking Changes diff --git a/5eShaped/translations/ru.json b/5eShaped/translations/ru.json index 5e59fc0ab4..1935659f40 100644 --- a/5eShaped/translations/ru.json +++ b/5eShaped/translations/ru.json @@ -61,13 +61,13 @@ "ABILITY_SCORE": "Ability score", "ABILITY_SCORES": "Очки статов", "ABJURATION": "Ограждение", - "AC": "КБ", + "AC": "КД", "ACID": "кислота", "ACROBATICS": "Акробатика", "ACTION": "Действие", "ACTIONS": "Действия", - "AC_ARMORED": "КБ в доспехах", - "AC_UNARMORED": "КБ без доспехов", + "AC_ARMORED": "КД в броне", + "AC_UNARMORED": "КД без брони", "AC_UNARMORED_ABILITY": "Умение, без доспехов", "ADD_COMMON_ITEMS": "Add common items", "ADD_HALF_PROFICIENCY_TO_UNPROFICIENT_SAVING_THROWS": "Добавлять половину бонуса владения к непрофессиональным спасброскам", @@ -110,12 +110,12 @@ "BACKSTORY": "Backstory", "BARBARIAN": "Варвар", "BARD": "Бард", - "BASE_DC": "Базовая СЛ", + "BASE_DC": "Базовая Сл", "BIG": "Большое", "BITE": "Укус", "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.", + "BLINDED_1": "Ослеплённое существо ничего не видит и автоматически проваливает все проверки характеристик, связанные со зрением.", + "BLINDED_2": "Броски атаки по такому существу совершаются с преимуществом, а его броски атаки совершаются с помехой.", "BLINDSIGHT": "Слепое", "BLIND_BEYOND": "Слепо за пределами", "BLUDGEONING": "дробящий", @@ -148,7 +148,7 @@ "CHARACTER_NAME": "Имя персонажа", "CHARACTER_NAME_ON_ROLL_TEMPLATES": "Имя Персонажа на всех щаблонах бросков", "CHARISMA": "Харизма", - "CHARISMA_SAVING_THROW": "Charisma saving throw", + "CHARISMA_SAVING_THROW": "Спасбросок Харизмы", "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.", @@ -158,7 +158,7 @@ "CLASS": "Класс", "CLASS_AND_LEVEL": "Класс & Уровень", "CLASS_AND_LEVEL_PLACEHOLDER": "Включить режим редактирования нажав на карандаш", - "CLASS_FEATURES": "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", @@ -189,14 +189,14 @@ "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.", "CLASS_FEATURE_BARBARIAN_PRIMAL_CHAMPION": "Primal Champion", "CLASS_FEATURE_BARBARIAN_PRIMAL_CHAMPION_TEXT": "You embody the power of the wilds. Your Strength and Constitution scores increase by 4. Your maximum for those scores is now 24.", - "CLASS_FEATURE_BARBARIAN_RAGE": "Rage", + "CLASS_FEATURE_BARBARIAN_RAGE": "Ярость", "CLASS_FEATURE_BARBARIAN_RAGE_TEXT": "On your turn, you can enter a rage as a bonus action. While raging, you gain the following benefits if you aren’t wearing heavy armor:\n•You have advantage on Strength checks and Strength saving throws.\n•When you make a melee weapon attack using Strength, you add RAGE_DAMAGE to that damage roll.\n•You have resistance to bludgeoning, piercing, and slashing damage\nIf you are able to cast spells, you can’t cast them or concentrate on them while raging.\nYour rage lasts for 1 minute. It ends early if you are knocked unconscious or if your turn ends and you haven’t attacked a hostile creature since your last turn or taken damage since then. You can also end your rage on your turn as a bonus action.", "CLASS_FEATURE_BARBARIAN_RECKLESS_ATTACK": "Reckless Attack", "CLASS_FEATURE_BARBARIAN_RECKLESS_ATTACK_TEXT": "When you make your first attack on your turn, you can decide to attack recklessly. Doing so gives you advantage on melee weapon attack rolls using Strength during this turn, but attack rolls against you have advantage until your next turn.", "CLASS_FEATURE_BARBARIAN_RELENTLESS_RAGE": "Relentless Rage", "CLASS_FEATURE_BARBARIAN_RELENTLESS_RAGE_TEXT": "Your rage can keep you fighting despite grievous wounds. If you drop to 0 hit points while you’re raging and don’t die outright, you can make a DC [[10]] Constitution saving throw. If you succeed, you drop to 1 hit point instead.\nEach time you use this feature after the first, the DC increases by 5. When you finish a short or long rest, the DC resets to 10", "CLASS_FEATURE_BARBARIAN_UNARMORED_DEFENSE": "Unarmored Defense", - "CLASS_FEATURE_BARBARIAN_UNARMORED_DEFENSE_TEXT": "While you are not wearing any armor, your Armor Class equals 10 + your Dexterity modifier + your Constitution modifier. You can use a shield and still gain this benefit.", + "CLASS_FEATURE_BARBARIAN_UNARMORED_DEFENSE_TEXT": "Если вы не носите доспехов, ваш Класс Доспеха равен 10 + модификатор Ловкости + модификатор Телосложения. Вы можете использовать щит, не теряя этого преимущества.", "CLASS_FEATURE_BARD_BARDIC_INSPIRATION": "Bardic Inspiration", "CLASS_FEATURE_BARD_BARDIC_INSPIRATION_TEXT": "You can inspire others through stirring words or music. To do so, you use a bonus action on your turn to choose one creature other than yourself within 60 feet of you who can hear you. That creature gains one Bardic Inspiration die, a d6.\nOnce within the next 10 minutes, the creature can roll the die and add the number rolled to one ability check, attack roll, or saving throw it makes. The creature can wait until after it rolls the d20 before deciding to use the Bardic Inspiration die, but must decide before the GM says whether the roll succeeds or fails. Once the Bardic Inspiration die is rolled, it is lost. A creature can have only one Bardic Inspiration die at a time.", "CLASS_FEATURE_BARD_COUNTERCHARM": "Countercharm", @@ -234,7 +234,7 @@ "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_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_EXTRA_ATTACK_TEXT": "Вы можете совершить две атаки вместо одной, если в свой ход совершаете действие Атака.\nКоличество атак увеличивается до трёх на 11 уровне этого класса и до четырёх на 20 уровне.", "CLASS_FEATURE_FIGHTER_FIGHTING_STYLE": "Fighting Style (Fighter)", "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", @@ -250,7 +250,7 @@ "CLASS_FEATURE_MONK_EVASION": "Evasion", "CLASS_FEATURE_MONK_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_MONK_EXTRA_ATTACK": "Extra Attack (Monk)", - "CLASS_FEATURE_MONK_EXTRA_ATTACK_TEXT": "You can attack twice, instead of once, whenever you take the Attack action on your turn.", + "CLASS_FEATURE_MONK_EXTRA_ATTACK_TEXT": "Вы можете совершить две атаки вместо одной, если в свой ход совершаете действие Атака.", "CLASS_FEATURE_MONK_FLURRY_OF_BLOWS": "Flurry of Blows", "CLASS_FEATURE_MONK_FLURRY_OF_BLOWS_TEXT": "Immediately after you take the Attack action on your turn, you can spend 1 ki point to make two unarmed strikes as a bonus action.", "CLASS_FEATURE_MONK_KI": "Ki", @@ -296,7 +296,7 @@ "CLASS_FEATURE_PALADIN_DIVINE_SMITE": "Divine Smite", "CLASS_FEATURE_PALADIN_DIVINE_SMITE_TEXT": "When you hit a creature with a melee weapon attack, you can expend one spell slot to deal radiant damage to the target, in addition to the weapon’s damage. The extra damage is 2d8 for a 1st-level spell slot, plus 1d8 for each spell level higher than 1st, to a maximum of 5d8. The damage increases by 1d8 if the target is an undead or a fiend.", "CLASS_FEATURE_PALADIN_EXTRA_ATTACK": "Extra Attack (Paladin)", - "CLASS_FEATURE_PALADIN_EXTRA_ATTACK_TEXT": "You can attack twice, instead of once, whenever you take the Attack action on your turn.", + "CLASS_FEATURE_PALADIN_EXTRA_ATTACK_TEXT": "Вы можете совершить две атаки вместо одной, если в свой ход совершаете действие Атака.", "CLASS_FEATURE_PALADIN_FIGHTING_STYLE": "Fighting Style (Paladin)", "CLASS_FEATURE_PALADIN_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\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.", "CLASS_FEATURE_PALADIN_IMPROVED_DIVINE_SMITE": "Improved Divine Smite", @@ -324,7 +324,7 @@ "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)", - "CLASS_FEATURE_RANGER_EXTRA_ATTACK_TEXT": "You can attack twice, instead of once, whenever you take the Attack action on your turn.", + "CLASS_FEATURE_RANGER_EXTRA_ATTACK_TEXT": "Вы можете совершить две атаки вместо одной, если в свой ход совершаете действие Атака.", "CLASS_FEATURE_RANGER_FAVORED_ENEMY": "Favored Enemy", "CLASS_FEATURE_RANGER_FAVORED_ENEMY_TEXT": "You have significant experience studying, tracking, hunting, and even talking to a certain type of enemy.\nChoose a type of favored enemy: aberrations, beasts, celestials, constructs, dragons, elementals, fey, fiends, giants, monstrosities, oozes, plants, or undead. Alternatively, you can select two races of humanoid (such as gnolls and orcs) as favored enemies.\nYou have advantage on Wisdom (Survival) checks to track your favored enemies, as well as on Intelligence checks to recall information about them.\nWhen you gain this feature, you also learn one language of your choice that is spoken by your favored enemies, if they speak one at all.\nYou choose one additional favored enemy, as well as an associated language, at 6th and 14th level. As you gain levels, your choices should reflect the types of monsters you have encountered on your adventures.", "CLASS_FEATURE_RANGER_FERAL_SENSES": "Feral Senses", @@ -435,7 +435,7 @@ "CONDITION_IMMUNITIES": "Иммунитет к состояниям", "CONJURATION": "Вызов", "CONSTITUTION": "Телосложение", - "CONSTITUTION_SAVING_THROW": "Constitution saving throw", + "CONSTITUTION_SAVING_THROW": "Спасбросок Телосложения", "CONTENT": "Описание", "CONTRACT": "Contract", "COPPER": "Медных", @@ -472,7 +472,7 @@ "DECEPTION": "Обман", "DEX": "Лов", "DEXTERITY": "Ловкость", - "DEXTERITY_SAVING_THROW": "Dexterity saving throw", + "DEXTERITY_SAVING_THROW": "Спасбросок Ловкости", "DEX_MAX_X": "Dex (max X)", "DICE": "Кости", "DICE_MODIFIERS": "Dice modifiers", @@ -516,12 +516,12 @@ "EMOTE": "Эмоция", "ENCHANTMENT": "Очарование", "ENCUMBERED": "Перегружен", - "ENCUMBERED_FEET": "Speed reduced by 10 feet", + "ENCUMBERED_FEET": "Скорость уменьшается на 10 футов", "ENCUMBERED_HEAVILY": "Т. перегруз", - "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", + "ENCUMBERED_HEAVILY_2": "Вы совершаете с помехой проверки характеристик, броски атаки и спасброски, использующие Силу, Ловкость или Телосложение.", + "ENCUMBERED_HEAVILY_FEET": "Скорость уменьшается на 20 футов", + "ENCUMBERED_HEAVILY_METERS": "Скорость уменьшается на 6 метров", + "ENCUMBERED_METERS": "Скорость уменьшается на 3 метра", "ENCUMBRANCE_MULTIPLIER": "Множ. перегруза", "ENGINEERING": "Инженерия", "EP": "ЭП", @@ -575,10 +575,10 @@ "GM": "GM", "GOLD": "Золотых", "GP": "ЗМ", - "GRAPPLED": "Cхвачено", - "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.", + "GRAPPLED": "Cхвачен", + "GRAPPLED_1": "Скорость схваченного существа равна 0, и оно не получает выгоды ни от каких бонусов к скорости.", + "GRAPPLED_2": "Состояние оканчивается, если схвативший становится недееспособен (см. состояние).", + "GRAPPLED_3": "Это состояние также оканчивается, если какой-либо эффект выводит схваченное существо из зоны досягаемости того, кто его удерживает, или из зоны удерживающего эффекта. Например, когда существо отбрасывается заклинанием волна грома.", "HAIR": "Волосы", "HALF": "Half", "HALFLING_LUCK": "Удача полурос.", @@ -647,14 +647,14 @@ "INSTANTANEOUS_OR_1_HOUR": "Мгновенно или 1 час", "INT": "Инт", "INTELLIGENCE": "Интеллект", - "INTELLIGENCE_SAVING_THROW": "Intelligence saving throw", + "INTELLIGENCE_SAVING_THROW": "Спасбросок Интеллекта", "INTIMIDATION": "Запугивание", "INVESTIGATION": "Анализ", "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": "Мастер на все руки", - "KI": "Ki", + "KI": "Ци", "KILOGRAMS": "Килограмм", "KILOGRAMS_SHORT": "кг", "KNOWN": "Known", @@ -696,7 +696,7 @@ "MELEE_WEAPON_ATTACK_MODIFIER": "Melee weapon attack modifier", "MELEE_WEAPON_DAMAGE_MODIFIER": "Melee weapon damage modifier", "METERS": "Метры", - "METERS_ABBREVIATION": "m.", + "METERS_ABBREVIATION": "м", "MISC": "Прочее", "MISCELLANEOUS": "Прочее", "MISCELLANEOUS_NOTES": "Другие заметки", @@ -729,8 +729,8 @@ "PALADIN": "Паладин", "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_2": "Существо автоматически проваливает спасброски Силы и Ловкости.", + "PARALYZED_3": "Броски атаки по существу совершаются с преимуществом.", "PARALYZED_4": "Any attack that hits the creature is a critical hit if the attacker is within 5 feet of the creature.", "PASSIVE": "Пассивное", "PASSIVE_ABILITY_CHECK": "Passive ability check", @@ -745,8 +745,8 @@ "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_3": "Броски атаки по существу совершаются с преимуществом.", + "PETRIFIED_4": "Существо автоматически проваливает спасброски Силы и Ловкости.", "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": "проникающий", @@ -809,11 +809,11 @@ "REACTIONS": "Реакции", "RECHARGE": "Перезарядка", "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_2_6": "Перезарядка 2-6", + "RECHARGE_3_6": "Перезарядка 3-6", + "RECHARGE_4_6": "Перезарядка 4-6", + "RECHARGE_5_6": "Перезарядка 5-6", + "RECHARGE_6": "Перезарядка 6", "RECHARGE_AFTER_LONG_REST": "Recharges after a Long Rest", "RECHARGE_AFTER_SHORT_OR_LONG_REST": "Recharges after a Short or Long Rest", "RECOVERED": "recovered", @@ -871,7 +871,7 @@ "SHOW_ALL": "Показать все", "SHOW_RESTS": "Отобразить Отдыхи", "SHOW_SPELL_LEVEL_IF_ALL_SLOTS_ARE_USED": "Отображать уровни если все ячейки использованы", - "SHOW_TARGET_AC_ON_ATTACKS": "КБ цели при атаках и СБ", + "SHOW_TARGET_AC_ON_ATTACKS": "КД цели при атаках и СБ", "SHOW_TARGET_NAME_ON_ATTACKS": "Имя цели при атаках и СБ", "SHOW_TOTALS": "Показать все", "SHOW_UNPREPARED_SPELLS": "Показать неподготовленные", @@ -951,13 +951,13 @@ "STEALTH": "Скрытность", "STR": "Сила", "STRENGTH": "Сила", - "STRENGTH_SAVING_THROW": "Strength saving throw", + "STRENGTH_SAVING_THROW": "Спасбросок Силы", "STR_13": "Сила 13", "STR_15": "Сила 15", - "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.", + "STUNNED": "Ошеломлён", + "STUNNED_1": "Ошеломлённое существо «недееспособно» (см. состояние), не способно перемещаться и говорит, запинаясь.", + "STUNNED_2": "Существо автоматически проваливает спасброски Силы и Ловкости.", + "STUNNED_3": "Броски атаки по существу совершаются с преимуществом.", "SUCCESSES": "Удачи", "SUMMONER": "Призыватель", "SURVIVAL": "Выживание", @@ -985,8 +985,8 @@ "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_3": "Существо автоматически проваливает спасброски Силы и Ловкости.", + "UNCONSCIOUS_4": "Броски атаки по существу совершаются с преимуществом.", "UNCONSCIOUS_5": "Any attack that hits the creature is a critical hit if the attacker is within 5 feet of the creature.", "UNITS": "Units", "UNPROFICIENT": "Не проф.", @@ -1013,7 +1013,7 @@ "WILL_SAVING_THROW": "Will saving throw", "WIS": "Муд", "WISDOM": "Мудрость", - "WISDOM_SAVING_THROW": "Wisdom saving throw", + "WISDOM_SAVING_THROW": "Спасбросок Мудрости", "WIZARD": "Волшебник", "WONDROUS": "Wondrous", "YES": "Да", diff --git a/5th Edition OGL by Roll20/5th Edition OGL by Roll20.css b/5th Edition OGL by Roll20/5th Edition OGL by Roll20.css index 1a9292873a..2a5e0f8a4e 100644 --- a/5th Edition OGL by Roll20/5th Edition OGL by Roll20.css +++ b/5th Edition OGL by Roll20/5th Edition OGL by Roll20.css @@ -3909,6 +3909,16 @@ span.sheet-spellconcentration cursor: none; } +.sheet-charmancer .sheet-summary .sheet-returnblock { + margin-bottom: 1em; +} + +.sheet-equipment_choice_title { + font-weight: bold; + margin-bottom: 0px; + margin-top: 10px; +} + .sheet-backgrounds_options label select, .sheet-backgrounds_options label span, .sheet-backgrounds_options label button { @@ -3952,6 +3962,18 @@ span.sheet-spellconcentration margin: 5px; } +.sheet-charmancer .sheet-mancer_progress { + width: 100%; + border: 2px solid black; + height: 10px; + margin-top: 1.5em; +} + +.sheet-charmancer .sheet-mancer_progress div { + background-color: red; + height: 100%; +} + /* Firefox 3.5+ */ body:not(:-moz-handler-blocked) .sheet-charmancer .sheet-steps { top:-.8em; diff --git a/5th Edition OGL by Roll20/5th Edition OGL by Roll20.html b/5th Edition OGL by Roll20/5th Edition OGL by Roll20.html index 8cc59f34a1..dd8461da50 100644 --- a/5th Edition OGL by Roll20/5th Edition OGL by Roll20.html +++ b/5th Edition OGL by Roll20/5th Edition OGL by Roll20.html @@ -4635,93 +4635,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -5807,8 +5721,6 @@ check_l1_mancer(); }; }); - // cleanup_drop_fields(); - // v2_old_values_check(); }); on("sheet:compendium-drop", function() { @@ -5822,7 +5734,7 @@ } if(v["token_size"]) { var squarelength = 70; - if(v["token_size"].indexOf(",") > -1) { + if(v["token_size"].toString().indexOf(",") > -1) { var setwidth = !isNaN(v["token_size"].split(",")[0]) ? v["token_size"].split(",")[0] : 1; var setheight = !isNaN(v["token_size"].split(",")[1]) ? v["token_size"].split(",")[1] : 1; default_attr["width"] = setwidth * squarelength; @@ -6383,7 +6295,7 @@ update_ac(); }); - on("change:repeating_spell-cantrip:spellname change:repeating_spell-1:spellname change:repeating_spell-1:spellprepared change:repeating_spell-2:spellname change:repeating_spell-2:spellprepared change:repeating_spell-3:spellname change:repeating_spell-3:spellprepared change:repeating_spell-4:spellname change:repeating_spell-4:spellprepared change:repeating_spell-5:spellname change:repeating_spell-5:spellprepared change:repeating_spell-6:spellname change:repeating_spell-6:spellprepared change:repeating_spell-7:spellname change:repeating_spell-7:spellprepared change:repeating_spell-8:spellname change:repeating_spell-8:spellprepared change:repeating_spell-9:spellname change:repeating_spell-9:spellprepared change:repeating_spell-cantrip:spellrange change:repeating_spell-1:spellrange change:repeating_spell-2:spellrange change:repeating_spell-3:spellrange change:repeating_spell-4:spellrange change:repeating_spell-5:spellrange change:repeating_spell-6:spellrange change:repeating_spell-7:spellrange change:repeating_spell-8:spellrange change:repeating_spell-9:spellrange change:repeating_spell-cantrip:spelltarget change:repeating_spell-1:spelltarget change:repeating_spell-2:spelltarget change:repeating_spell-3:spelltarget change:repeating_spell-4:spelltarget change:repeating_spell-5:spelltarget change:repeating_spell-6:spelltarget change:repeating_spell-7:spelltarget change:repeating_spell-8:spelltarget change:repeating_spell-9:spelltarget change:repeating_spell-cantrip:spelldamage change:repeating_spell-1:spelldamage change:repeating_spell-2:spelldamage change:repeating_spell-3:spelldamage change:repeating_spell-4:spelldamage change:repeating_spell-5:spelldamage change:repeating_spell-6:spelldamage change:repeating_spell-7:spelldamage change:repeating_spell-8:spelldamage change:repeating_spell-9:spelldamage change:repeating_spell-cantrip:spelldamagetype change:repeating_spell-1:spelldamagetype change:repeating_spell-2:spelldamagetype change:repeating_spell-3:spelldamagetype change:repeating_spell-4:spelldamagetype change:repeating_spell-5:spelldamagetype change:repeating_spell-6:spelldamagetype change:repeating_spell-7:spelldamagetype change:repeating_spell-8:spelldamagetype change:repeating_spell-9:spelldamagetype change:repeating_spell-cantrip:spelldamage2 change:repeating_spell-1:spelldamage2 change:repeating_spell-2:spelldamage2 change:repeating_spell-3:spelldamage2 change:repeating_spell-4:spelldamage2 change:repeating_spell-5:spelldamage2 change:repeating_spell-6:spelldamage2 change:repeating_spell-7:spelldamage2 change:repeating_spell-8:spelldamage2 change:repeating_spell-9:spelldamage2 change:repeating_spell-cantrip:spelldamagetype2 change:repeating_spell-1:spelldamagetype2 change:repeating_spell-2:spelldamagetype2 change:repeating_spell-3:spelldamagetype2 change:repeating_spell-4:spelldamagetype2 change:repeating_spell-5:spelldamagetype2 change:repeating_spell-6:spelldamagetype2 change:repeating_spell-7:spelldamagetype2 change:repeating_spell-8:spelldamagetype2 change:repeating_spell-9:spelldamagetype2 change:repeating_spell-cantrip:spellhealing change:repeating_spell-1:spellhealing change:repeating_spell-2:spellhealing change:repeating_spell-3:spellhealing change:repeating_spell-4:spellhealing change:repeating_spell-5:spellhealing change:repeating_spell-6:spellhealing change:repeating_spell-7:spellhealing change:repeating_spell-8:spellhealing change:repeating_spell-9:spellhealing change:repeating_spell-cantrip:spelldmgmod change:repeating_spell-1:spelldmgmod change:repeating_spell-2:spelldmgmod change:repeating_spell-3:spelldmgmod change:repeating_spell-4:spelldmgmod change:repeating_spell-5:spelldmgmod change:repeating_spell-6:spelldmgmod change:repeating_spell-7:spelldmgmod change:repeating_spell-8:spelldmgmod change:repeating_spell-9:spelldmgmod change:repeating_spell-cantrip:spellsave change:repeating_spell-1:spellsave change:repeating_spell-2:spellsave change:repeating_spell-3:spellsave change:repeating_spell-4:spellsave change:repeating_spell-5:spellsave change:repeating_spell-6:spellsave change:repeating_spell-7:spellsave change:repeating_spell-8:spellsave change:repeating_spell-9:spellsave change:repeating_spell-cantrip:spellsavesuccess change:repeating_spell-1:spellsavesuccess change:repeating_spell-2:spellsavesuccess change:repeating_spell-3:spellsavesuccess change:repeating_spell-4:spellsavesuccess change:repeating_spell-5:spellsavesuccess change:repeating_spell-6:spellsavesuccess change:repeating_spell-7:spellsavesuccess change:repeating_spell-8:spellsavesuccess change:repeating_spell-9:spellsavesuccess change:repeating_spell-cantrip:spellhldie change:repeating_spell-1:spellhldie change:repeating_spell-2:spellhldie change:repeating_spell-3:spellhldie change:repeating_spell-4:spellhldie change:repeating_spell-5:spellhldie change:repeating_spell-6:spellhldie change:repeating_spell-7:spellhldie change:repeating_spell-8:spellhldie change:repeating_spell-9:spellhldie change:repeating_spell-cantrip:spellhldietype change:repeating_spell-1:spellhldietype change:repeating_spell-2:spellhldietype change:repeating_spell-3:spellhldietype change:repeating_spell-4:spellhldietype change:repeating_spell-5:spellhldietype change:repeating_spell-6:spellhldietype change:repeating_spell-7:spellhldietype change:repeating_spell-8:spellhldietype change:repeating_spell-9:spellhldietype change:repeating_spell-cantrip:spell_updateflag change:repeating_spell-1:spell_updateflag change:repeating_spell-2:spell_updateflag change:repeating_spell-3:spell_updateflag change:repeating_spell-4:spell_updateflag change:repeating_spell-5:spell_updateflag change:repeating_spell-6:spell_updateflag change:repeating_spell-7:spell_updateflag change:repeating_spell-8:spell_updateflag change:repeating_spell-9:spell_updateflag change:repeating_spell-cantrip:spellattack change:repeating_spell-1:spellattack change:repeating_spell-2:spellattack change:repeating_spell-3:spellattack change:repeating_spell-4:spellattack change:repeating_spell-5:spellattack change:repeating_spell-6:spellattack change:repeating_spell-7:spellattack change:repeating_spell-8:spellattack change:repeating_spell-9:spellattack change:repeating_spell-cantrip:spellhlbonus change:repeating_spell-1:spellhlbonus change:repeating_spell-2:spellhlbonus change:repeating_spell-3:spellhlbonus change:repeating_spell-4:spellhlbonus change:repeating_spell-5:spellhlbonus change:repeating_spell-6:spellhlbonus change:repeating_spell-7:spellhlbonus change:repeating_spell-8:spellhlbonus change:repeating_spell-9:spellhlbonus change:repeating_spell-cantrip:includedesc change:repeating_spell-1:includedesc change:repeating_spell-2:includedesc change:repeating_spell-3:includedesc change:repeating_spell-4:includedesc change:repeating_spell-5:includedesc change:repeating_spell-6:includedesc change:repeating_spell-7:includedesc change:repeating_spell-8:includedesc change:repeating_spell-9:includedesc change:repeating_spell-cantrip:spellathigherlevels change:repeating_spell-1:spellathigherlevels change:repeating_spell-2:spellathigherlevels change:repeating_spell-3:spellathigherlevels change:repeating_spell-4:spellathigherlevels change:repeating_spell-5:spellathigherlevels change:repeating_spell-6:spellathigherlevels change:repeating_spell-7:spellathigherlevels change:repeating_spell-8:spellathigherlevels change:repeating_spell-9:spellathigherlevels change:repeating_spell-cantrip:spelldescription change:repeating_spell-1:spelldescription change:repeating_spell-2:spelldescription change:repeating_spell-3:spelldescription change:repeating_spell-4:spelldescription change:repeating_spell-5:spelldescription change:repeating_spell-6:spelldescription change:repeating_spell-7:spelldescription change:repeating_spell-8:spelldescription change:repeating_spell-9:spelldescription change:repeating_spell-cantrip:innate change:repeating_spell-1:innate change:repeating_spell-2:innate change:repeating_spell-3:innate change:repeating_spell-4:innate change:repeating_spell-5:innate change:repeating_spell-6:innate change:repeating_spell-7:innate change:repeating_spell-8:innate change:repeating_spell-9:innate change:repeating_spell-cantrip:spell_ability change:repeating_spell-1:spell_ability change:repeating_spell-2:spell_ability change:repeating_spell-3:spell_ability change:repeating_spell-4:spell_ability change:repeating_spell-5:spell_ability change:repeating_spell-6:spell_ability change:repeating_spell-7:spell_ability change:repeating_spell-8:spell_ability change:repeating_spell-9:spell_ability", function(eventinfo) { + on("change:repeating_spell-cantrip:spellname change:repeating_spell-1:spellname change:repeating_spell-1:spellprepared change:repeating_spell-2:spellname change:repeating_spell-2:spellprepared change:repeating_spell-3:spellname change:repeating_spell-3:spellprepared change:repeating_spell-4:spellname change:repeating_spell-4:spellprepared change:repeating_spell-5:spellname change:repeating_spell-5:spellprepared change:repeating_spell-6:spellname change:repeating_spell-6:spellprepared change:repeating_spell-7:spellname change:repeating_spell-7:spellprepared change:repeating_spell-8:spellname change:repeating_spell-8:spellprepared change:repeating_spell-9:spellname change:repeating_spell-9:spellprepared change:repeating_spell-cantrip:spellrange change:repeating_spell-1:spellrange change:repeating_spell-2:spellrange change:repeating_spell-3:spellrange change:repeating_spell-4:spellrange change:repeating_spell-5:spellrange change:repeating_spell-6:spellrange change:repeating_spell-7:spellrange change:repeating_spell-8:spellrange change:repeating_spell-9:spellrange change:repeating_spell-cantrip:spelltarget change:repeating_spell-1:spelltarget change:repeating_spell-2:spelltarget change:repeating_spell-3:spelltarget change:repeating_spell-4:spelltarget change:repeating_spell-5:spelltarget change:repeating_spell-6:spelltarget change:repeating_spell-7:spelltarget change:repeating_spell-8:spelltarget change:repeating_spell-9:spelltarget change:repeating_spell-cantrip:spelldamage change:repeating_spell-1:spelldamage change:repeating_spell-2:spelldamage change:repeating_spell-3:spelldamage change:repeating_spell-4:spelldamage change:repeating_spell-5:spelldamage change:repeating_spell-6:spelldamage change:repeating_spell-7:spelldamage change:repeating_spell-8:spelldamage change:repeating_spell-9:spelldamage change:repeating_spell-cantrip:spelldamagetype change:repeating_spell-1:spelldamagetype change:repeating_spell-2:spelldamagetype change:repeating_spell-3:spelldamagetype change:repeating_spell-4:spelldamagetype change:repeating_spell-5:spelldamagetype change:repeating_spell-6:spelldamagetype change:repeating_spell-7:spelldamagetype change:repeating_spell-8:spelldamagetype change:repeating_spell-9:spelldamagetype change:repeating_spell-cantrip:spelldamage2 change:repeating_spell-1:spelldamage2 change:repeating_spell-2:spelldamage2 change:repeating_spell-3:spelldamage2 change:repeating_spell-4:spelldamage2 change:repeating_spell-5:spelldamage2 change:repeating_spell-6:spelldamage2 change:repeating_spell-7:spelldamage2 change:repeating_spell-8:spelldamage2 change:repeating_spell-9:spelldamage2 change:repeating_spell-cantrip:spelldamagetype2 change:repeating_spell-1:spelldamagetype2 change:repeating_spell-2:spelldamagetype2 change:repeating_spell-3:spelldamagetype2 change:repeating_spell-4:spelldamagetype2 change:repeating_spell-5:spelldamagetype2 change:repeating_spell-6:spelldamagetype2 change:repeating_spell-7:spelldamagetype2 change:repeating_spell-8:spelldamagetype2 change:repeating_spell-9:spelldamagetype2 change:repeating_spell-cantrip:spellhealing change:repeating_spell-1:spellhealing change:repeating_spell-2:spellhealing change:repeating_spell-3:spellhealing change:repeating_spell-4:spellhealing change:repeating_spell-5:spellhealing change:repeating_spell-6:spellhealing change:repeating_spell-7:spellhealing change:repeating_spell-8:spellhealing change:repeating_spell-9:spellhealing change:repeating_spell-cantrip:spelldmgmod change:repeating_spell-1:spelldmgmod change:repeating_spell-2:spelldmgmod change:repeating_spell-3:spelldmgmod change:repeating_spell-4:spelldmgmod change:repeating_spell-5:spelldmgmod change:repeating_spell-6:spelldmgmod change:repeating_spell-7:spelldmgmod change:repeating_spell-8:spelldmgmod change:repeating_spell-9:spelldmgmod change:repeating_spell-cantrip:spellsave change:repeating_spell-1:spellsave change:repeating_spell-2:spellsave change:repeating_spell-3:spellsave change:repeating_spell-4:spellsave change:repeating_spell-5:spellsave change:repeating_spell-6:spellsave change:repeating_spell-7:spellsave change:repeating_spell-8:spellsave change:repeating_spell-9:spellsave change:repeating_spell-cantrip:spellsavesuccess change:repeating_spell-1:spellsavesuccess change:repeating_spell-2:spellsavesuccess change:repeating_spell-3:spellsavesuccess change:repeating_spell-4:spellsavesuccess change:repeating_spell-5:spellsavesuccess change:repeating_spell-6:spellsavesuccess change:repeating_spell-7:spellsavesuccess change:repeating_spell-8:spellsavesuccess change:repeating_spell-9:spellsavesuccess change:repeating_spell-cantrip:spellhldie change:repeating_spell-1:spellhldie change:repeating_spell-2:spellhldie change:repeating_spell-3:spellhldie change:repeating_spell-4:spellhldie change:repeating_spell-5:spellhldie change:repeating_spell-6:spellhldie change:repeating_spell-7:spellhldie change:repeating_spell-8:spellhldie change:repeating_spell-9:spellhldie change:repeating_spell-cantrip:spellhldietype change:repeating_spell-1:spellhldietype change:repeating_spell-2:spellhldietype change:repeating_spell-3:spellhldietype change:repeating_spell-4:spellhldietype change:repeating_spell-5:spellhldietype change:repeating_spell-6:spellhldietype change:repeating_spell-7:spellhldietype change:repeating_spell-8:spellhldietype change:repeating_spell-9:spellhldietype change:repeating_spell-cantrip:spell_updateflag change:repeating_spell-1:spell_updateflag change:repeating_spell-2:spell_updateflag change:repeating_spell-3:spell_updateflag change:repeating_spell-4:spell_updateflag change:repeating_spell-5:spell_updateflag change:repeating_spell-6:spell_updateflag change:repeating_spell-7:spell_updateflag change:repeating_spell-8:spell_updateflag change:repeating_spell-9:spell_updateflag change:repeating_spell-cantrip:spellattack change:repeating_spell-1:spellattack change:repeating_spell-2:spellattack change:repeating_spell-3:spellattack change:repeating_spell-4:spellattack change:repeating_spell-5:spellattack change:repeating_spell-6:spellattack change:repeating_spell-7:spellattack change:repeating_spell-8:spellattack change:repeating_spell-9:spellattack change:repeating_spell-cantrip:spellhlbonus change:repeating_spell-1:spellhlbonus change:repeating_spell-2:spellhlbonus change:repeating_spell-3:spellhlbonus change:repeating_spell-4:spellhlbonus change:repeating_spell-5:spellhlbonus change:repeating_spell-6:spellhlbonus change:repeating_spell-7:spellhlbonus change:repeating_spell-8:spellhlbonus change:repeating_spell-9:spellhlbonus change:repeating_spell-cantrip:includedesc change:repeating_spell-1:includedesc change:repeating_spell-2:includedesc change:repeating_spell-3:includedesc change:repeating_spell-4:includedesc change:repeating_spell-5:includedesc change:repeating_spell-6:includedesc change:repeating_spell-7:includedesc change:repeating_spell-8:includedesc change:repeating_spell-9:includedesc change:repeating_spell-cantrip:spellathigherlevels change:repeating_spell-1:spellathigherlevels change:repeating_spell-2:spellathigherlevels change:repeating_spell-3:spellathigherlevels change:repeating_spell-4:spellathigherlevels change:repeating_spell-5:spellathigherlevels change:repeating_spell-6:spellathigherlevels change:repeating_spell-7:spellathigherlevels change:repeating_spell-8:spellathigherlevels change:repeating_spell-9:spellathigherlevels change:repeating_spell-cantrip:spelldescription change:repeating_spell-1:spelldescription change:repeating_spell-2:spelldescription change:repeating_spell-3:spelldescription change:repeating_spell-4:spelldescription change:repeating_spell-5:spelldescription change:repeating_spell-6:spelldescription change:repeating_spell-7:spelldescription change:repeating_spell-8:spelldescription change:repeating_spell-9:spelldescription change:repeating_spell-cantrip:innate change:repeating_spell-1:innate change:repeating_spell-2:innate change:repeating_spell-3:innate change:repeating_spell-4:innate change:repeating_spell-5:innate change:repeating_spell-6:innate change:repeating_spell-7:innate change:repeating_spell-8:innate change:repeating_spell-9:innate change:repeating_spell-cantrip:spell_ability change:repeating_spell-1:spell_ability change:repeating_spell-2:spell_ability change:repeating_spell-3:spell_ability change:repeating_spell-4:spell_ability change:repeating_spell-5:spell_ability change:repeating_spell-6:spell_ability change:repeating_spell-7:spell_ability change:repeating_spell-8:spell_ability change:repeating_spell-9:spell_ability change:repeating_spell-cantrip:spell_damage_progression", function(eventinfo) { if(eventinfo.sourceType && eventinfo.sourceType === "sheetworker") { return; } @@ -6654,7 +6566,12 @@ on("change:cancel", function(eventinfo) { setAttrs({monster_confirm_flag: ""}); - cleanup_drop_fields(); + var update = {}; + update["drop_category"] = ""; + update["drop_name"] = ""; + update["drop_data"] = ""; + update["drop_content"] = ""; + setAttrs(update, {silent: true}); }); on("change:passiveperceptionmod", function(eventinfo) { @@ -7026,729 +6943,28 @@ }; var handle_drop = function(category, eventinfo) { - var callbacks = []; - var update = {}; - var id = generateRowID(); - getAttrs(["drop_name", "drop_data", "drop_weight", "drop_properties", "drop_modifiers", "drop_content", "drop_itemtype", "drop_damage", "drop_damagetype", "drop_damage2", "drop_damagetype2", "drop_alt_damage", "drop_alt_damagetype", "drop_alt_damage2", "drop_alt_damagetype2", "drop_range", "drop_ac", "drop_spellritualflag", "drop_spellschool", "drop_spellcastingtime", "drop_spelltarget", "drop_spellcomp", "drop_spellcomp_materials", "drop_spellconcentrationflag", "drop_spellduration", "drop_spellhealing", "drop_spelldmgmod", "drop_spellsave", "drop_spellsavesuccess", "drop_spellhldie", "drop_spellhldietype", "drop_spellhlbonus", "drop_spelllevel", "drop_spell_damage_progression", "drop_spell_ability", "drop_attack_type", "drop_speed", "drop_str", "drop_dex", "drop_con", "drop_int", "drop_wis", "drop_cha", "drop_vulnerabilities", "drop_resistances", "drop_immunities", "drop_condition_immunities", "drop_languages", "drop_challenge_rating", "drop_size", "drop_type", "drop_alignment", "drop_hp", "drop_saving_throws", "drop_senses", "drop_passive_perception", "drop_skills", "drop_token_size", "character_id", "drop_actions", "drop_legendary_actions", "drop_legendary_actions_desc", "drop_reactions", "drop_traits", "npc_legendary_actions", "strength_mod", "dexterity_mod", "npc", "spellcasting_ability", "drop_toolbonus_base", "drop_itemcount", "drop_armor_prof", "drop_hit_die", "drop_weapon_prof", "drop_spellcasting_ability", "drop_class_saving_throws", "base_level", "drop_language_prof", "drop_tool_prof", "drop_spell_ability", "drop_skill_proficiency", "drop_parent", "drop_hp_per_level", "drop_class_spells", "drop_global_damage", "drop_feature_name", "drop_feature_description", "drop_resources", "drop_spellhldesc", "drop_spelldesc", "strength_base", "dexterity_base", "constitution_base", "wisdom_base", "intelligence_base", "charisma_base"], function(v) { - id = generateRowID(); - var data = v.drop_data; + getAttrs(["drop_name", "drop_data", "drop_content", "character_id", "npc_legendary_actions", "strength_mod", "dexterity_mod", "npc", "base_level", "strength_base", "dexterity_base", "constitution_base", "wisdom_base", "intelligence_base", "charisma_base"], function(v) { + var pagedata = {}; try { - data = JSON.parse(data); + pagedata = JSON.parse(v.drop_data); } catch(e) { - data = {}; + pagedata = v.drop_data; } - if(category === "Items") { - if(v["npc"] === "0") { - update["tab"] = "core"; - if(v.drop_name) {update["repeating_inventory_" + id + "_itemname"] = v.drop_name}; - if(v.drop_itemcount) {update["repeating_inventory_" + id + "_itemcount"] = v.drop_itemcount}; - if(v.drop_weight) {update["repeating_inventory_" + id + "_itemweight"] = v.drop_weight}; - if(v.drop_properties) {update["repeating_inventory_" + id + "_itemproperties"] = v.drop_properties}; - if(v.drop_content) {update["repeating_inventory_" + id + "_itemcontent"] = v.drop_content}; - if(!v.drop_itemtype || v.drop_itemtype == "") {v.drop_itemtype = category}; - var mods = "Item Type: " + v.drop_itemtype; - if(v.drop_ac && v.drop_ac != "") { - mods += ", AC: " + v.drop_ac; - callbacks.push( function() {update_ac();} ) - }; - if(v.drop_damage && v.drop_damage != "") {mods += ", Damage: " + v.drop_damage}; - if(v.drop_damagetype && v.drop_damagetype != "") {mods += ", Damage Type: " + v.drop_damagetype}; - if(v.drop_damage2 && v.drop_damage2 != "") {mods += ", Secondary Damage: " + v.drop_damage2}; - if(v.drop_damagetype2 && v.drop_damagetype2 != "") {mods += ", Secondary Damage Type: " + v.drop_damagetype2}; - if(v.drop_alt_damage && v.drop_alt_damage != "") {mods += ", Alternate Damage: " + v.drop_alt_damage}; - if(v.drop_alt_damagetype && v.drop_alt_damagetype != "") {mods += ", Alternate Damage Type: " + v.drop_alt_damagetype}; - if(v.drop_alt_damage2 && v.drop_alt_damage2 != "") {mods += ", Alternate Secondary Damage: " + v.drop_alt_damage2}; - if(v.drop_alt_damagetype2 && v.drop_alt_damagetype2 != "") {mods += ", Alternate Secondary Damage Type: " + v.drop_alt_damagetype2}; - if(v.drop_range && v.drop_range != "") {mods += ", Range: " + v.drop_range}; - if(v.drop_modifiers && v.drop_modifiers != "") {mods += ", " + v.drop_modifiers}; - update["repeating_inventory_" + id + "_itemmodifiers"] = mods; - if(v.drop_itemtype.indexOf("Weapon") > -1) { - update["repeating_inventory_" + id + "_hasattack"] = 1; - callbacks.push( function() { - if(v.drop_alt_damage && v.drop_alt_damage !== "") { - create_attack_from_item(id, {versatile: true}); - } else { - create_attack_from_item(id); - } - } ); - } - else if(v.drop_itemtype.indexOf("Ammunition") > -1) { - update["repeating_inventory_" + id + "_useasresource"] = 1; - callbacks.push( function() {create_resource_from_item(id);} ); - }; - if(v["drop_modifiers"]) { - callbacks.push( function() {check_itemmodifiers(v["drop_modifiers"]);} ); - }; - callbacks.push( function() {update_weight();} ); - } - else { - if(v.drop_itemtype && new RegExp('\\bweapon\\b', 'i').test(v.drop_itemtype)) { - var make_npc_attack_from_item = function(rowid, options) { - update["repeating_npcaction_" + rowid + "_npc_options-flag"] = "0"; - update["repeating_npcaction_" + rowid + "_attack_flag"] = "on"; - - if(v.drop_name) { - update["repeating_npcaction_" + rowid + "_name"] = v.drop_name; - if(options && options.versatile) { - update["repeating_npcaction_" + rowid + "_name"] += " (" + (options.versatile === 1 ? "One-Handed" : "Two-Handed") + ")"; - } else if(options && options.thrown) { - update["repeating_npcaction_" + rowid + "_name"] += " (Thrown)"; - } - } - if(v.drop_content) { update["repeating_npcaction_" + rowid + "_description"] = v.drop_content; } - - update["repeating_npcaction_" + rowid + "_attack_display_flag"] = "{{attack=1}}"; - update["repeating_npcaction_" + rowid + "_attack_options"] = "{{attack=1}}"; - update["repeating_npcaction_" + rowid + "_attack_type"] = v.drop_itemtype.substring(0, v.drop_itemtype.indexOf(" ")); - - var thrown = v.drop_properties && new RegExp('\\bthrown\\b', 'i').test(v.drop_properties); - - if(v.drop_range && v.drop_range != "" && (!thrown || (options && options.thrown))) { - update["repeating_npcaction_" + rowid + "_attack_range"] = v.drop_range; - } - else if(v.drop_properties && new RegExp('\\breach\\b', 'i').test(v.drop_properties)) { - update["repeating_npcaction_" + rowid + "_attack_range"] = "10 ft"; - } - else { - update["repeating_npcaction_" + rowid + "_attack_range"] = "5 ft"; - } - - update["repeating_npcaction_" + rowid + "_attack_target"] = "one target"; - - var isFinesse = v.drop_properties && new RegExp('\\bfinesse\\b', 'i').test(v.drop_properties); - var attack_type = update[`repeating_npcaction_${id}_attack_type`].toLowerCase(); - var use_dex_mod = attack_type === "ranged" || (isFinesse && v.dexterity_mod > v.strength_mod); - var weapon_attr_mod = use_dex_mod ? v.dexterity_mod : v.strength_mod; - update["repeating_npcaction_" + rowid + "_attack_tohit"] = weapon_attr_mod; - - if(options && options.versatile === 2) { - if(v.drop_alt_damage) { update["repeating_npcaction_" + rowid + "_attack_damage"] = v.drop_alt_damage + "+" + weapon_attr_mod; } - if(v.drop_alt_damagetype) { update["repeating_npcaction_" + rowid + "_attack_damagetype"] = v.drop_alt_damagetype; } - if(v.drop_alt_damage2) { update["repeating_npcaction_" + rowid + "_attack_damage2"] = v.drop_alt_damage2; } - if(v.drop_alt_damagetype2) { update["repeating_npcaction_" + rowid + "_attack_damagetype2"] = v.drop_alt_damagetype2; } - } - else { - if(v.drop_damage) { update["repeating_npcaction_" + rowid + "_attack_damage"] = v.drop_damage + "+" + weapon_attr_mod; } - if(v.drop_damagetype) {update["repeating_npcaction_" + rowid + "_attack_damagetype"] = v.drop_damagetype; } - if(v.drop_damage2) { update["repeating_npcaction_" + rowid + "_attack_damage2"] = v.drop_damage2; } - if(v.drop_damagetype2) { update["repeating_npcaction_" + rowid + "_attack_damagetype2"] = v.drop_damagetype2; } - } - - if(v.drop_modifiers) { - if(attack_type === "melee") { - var tohit_regex = /(?:melee|weapon) *attacks? *([\\+\\-] *[0-9]+)/i; - var melee_damage_regex = /(?:melee|weapon) *damage *([\\+\\-] *[0-9]+)/i; - var tohit_match = tohit_regex.exec(v.drop_modifiers); - var damage_match = melee_damage_regex.exec(v.drop_modifiers); - - if(tohit_match && tohit_match[1]) { update[`repeating_npcaction_${rowid}_attack_tohit`] = +update[`repeating_npcaction_${rowid}_attack_tohit`] + +tohit_match[1]; } - if(v.drop_damage && damage_match && damage_match[1]) { update[`repeating_npcaction_${rowid}_attack_damage`] += damage_match[1]; } - } else if(attack_type === "ranged") { - var tohit_regex = /(?:ranged|weapon) *attacks? *([\\+\\-] *[0-9]+)/i; - var ranged_damage_regex = /(?:ranged|weapon) *damage *([\\+\\-] *[0-9]+)/i; - var tohit_match = tohit_regex.exec(v.drop_modifiers); - var damage_match = ranged_damage_regex.exec(v.drop_modifiers); - - if(tohit_match && tohit_match[1]) { update[`repeating_npcaction_${rowid}_attack_tohit`] = +update[`repeating_npcaction_${rowid}_attack_tohit`] + +tohit_match[1]; } - if(v.drop_damage && damage_match && damage_match[1]) { update[`repeating_npcaction_${rowid}_attack_damage`] += damage_match[1]; } - } - } - }; - - var versatile = v.drop_properties && new RegExp('\\bversatile\\b', 'i').test(v.drop_properties) ? 1 : undefined; - make_npc_attack_from_item(id, {versatile: versatile}); - if(v.drop_properties && new RegExp('\\bthrown\\b', 'i').test(v.drop_properties)) { - make_npc_attack_from_item(generateRowID(), {thrown: true}); - } - if(versatile && v.drop_alt_damage) { - make_npc_attack_from_item(generateRowID(), {versatile:2}) - } - - callbacks.push(function() { check_itemmodifiers(v.drop_modifiers); }, function() { update_npc_action("all"); }); - } - } + var page = { + name: v.drop_name, + data: pagedata, + content: v.drop_content }; - if(category === "Spells") { - var lvl = v.drop_spelllevel && v.drop_spelllevel > 0 ? v.drop_spelllevel : "cantrip"; - update["repeating_spell-" + lvl + "_" + id + "_spelllevel"] = lvl; - if(v.drop_spell_ability) { - update["repeating_spell-" + lvl + "_" + id + "_spell_ability"] = v.drop_spell_ability; - } else { - update["repeating_spell-" + lvl + "_" + id + "_spell_ability"] = "spell"; - } - if(v.drop_name) {update["repeating_spell-" + lvl + "_" + id + "_spellname"] = v.drop_name}; - if(v.drop_spellritualflag) {update["repeating_spell-" + lvl + "_" + id + "_spellritual"] = "{{ritual=1}}"}; - if(v.drop_spellschool) {update["repeating_spell-" + lvl + "_" + id + "_spellschool"] = v.drop_spellschool.toLowerCase()}; - if(v.drop_spellcastingtime) {update["repeating_spell-" + lvl + "_" + id + "_spellcastingtime"] = v.drop_spellcastingtime}; - if(v.drop_range) {update["repeating_spell-" + lvl + "_" + id + "_spellrange"] = v.drop_range}; - if(v.drop_spelltarget) {update["repeating_spell-" + lvl + "_" + id + "_spelltarget"] = v.drop_spelltarget}; - if(v.drop_spellcomp) { - if(v.drop_spellcomp.toLowerCase().indexOf("v") === -1) {update["repeating_spell-" + lvl + "_" + id + "_spellcomp_v"] = "0"}; - if(v.drop_spellcomp.toLowerCase().indexOf("s") === -1) {update["repeating_spell-" + lvl + "_" + id + "_spellcomp_s"] = "0"}; - if(v.drop_spellcomp.toLowerCase().indexOf("m") === -1) {update["repeating_spell-" + lvl + "_" + id + "_spellcomp_m"] = "0"}; - }; - if(v.drop_spellcomp_materials) {update["repeating_spell-" + lvl + "_" + id + "_spellcomp_materials"] = v.drop_spellcomp_materials}; - if(v.drop_spellconcentrationflag) {update["repeating_spell-" + lvl + "_" + id + "_spellconcentration"] = "{{concentration=1}}"}; - if(v.drop_spellduration) {update["repeating_spell-" + lvl + "_" + id + "_spellduration"] = v.drop_spellduration}; - if(v.drop_damage || v.drop_spellhealing) { - update["repeating_spell-" + lvl + "_" + id + "_spelloutput"] = "ATTACK"; - callbacks.push( function() {create_attack_from_spell(lvl, id, v["character_id"]);} ); - } - else if(v.drop_spellhldesc && v.drop_spellhldesc != "") { - var spelllevel = "?{Cast at what level?"; - for(i = 0; i < 10-lvl; i++) { - spelllevel = spelllevel + "|Level " + (parseInt(i, 10) + parseInt(lvl, 10)) + "," + (parseInt(i, 10) + parseInt(lvl, 10)); - } - spelllevel = spelllevel + "}"; - update["repeating_spell-" + lvl + "_" + id + "_rollcontent"] = "@{wtype}&{template:spell} {{level=@{spellschool} " + spelllevel + "}} {{name=@{spellname}}} {{castingtime=@{spellcastingtime}}} {{range=@{spellrange}}} {{target=@{spelltarget}}} @{spellcomp_v} @{spellcomp_s} @{spellcomp_m} {{material=@{spellcomp_materials}}} {{duration=@{spellduration}}} {{description=@{spelldescription}}} {{athigherlevels=@{spellathigherlevels}}} @{spellritual} {{innate=@{innate}}} @{spellconcentration} @{charname_output}"; - }; - if(v.drop_attack_type) {update["repeating_spell-" + lvl + "_" + id + "_spellattack"] = v.drop_attack_type}; - if(v.drop_damage) {update["repeating_spell-" + lvl + "_" + id + "_spelldamage"] = v.drop_damage}; - if(v.drop_damagetype) {update["repeating_spell-" + lvl + "_" + id + "_spelldamagetype"] = v.drop_damagetype}; - if(v.drop_damage2) {update["repeating_spell-" + lvl + "_" + id + "_spelldamage2"] = v.drop_damage2}; - if(v.drop_damagetype2) {update["repeating_spell-" + lvl + "_" + id + "_spelldamagetype2"] = v.drop_damagetype2}; - if(v.drop_spellhealing) {update["repeating_spell-" + lvl + "_" + id + "_spellhealing"] = v.drop_spellhealing;}; - if(v.drop_spelldmgmod) {update["repeating_spell-" + lvl + "_" + id + "_spelldmgmod"] = v.drop_spelldmgmod}; - if(v.drop_spellsave) {update["repeating_spell-" + lvl + "_" + id + "_spellsave"] = v.drop_spellsave}; - if(v.drop_spellsavesuccess) {update["repeating_spell-" + lvl + "_" + id + "_spellsavesuccess"] = v.drop_spellsavesuccess}; - if(v.drop_spellhldie) {update["repeating_spell-" + lvl + "_" + id + "_spellhldie"] = v.drop_spellhldie}; - if(v.drop_spellhldietype) {update["repeating_spell-" + lvl + "_" + id + "_spellhldietype"] = v.drop_spellhldietype}; - if(v.drop_spellhlbonus) {update["repeating_spell-" + lvl + "_" + id + "_spellhlbonus"] = v.drop_spellhlbonus}; - if(v.drop_spellhldesc) {update["repeating_spell-" + lvl + "_" + id + "_spellathigherlevels"] = v.drop_spellhldesc}; - if(v.drop_spell_damage_progression && lvl == "cantrip") {update["repeating_spell-" + lvl + "_" + id + "_spell_damage_progression"] = v.drop_spell_damage_progression}; - if(v.drop_spelldesc) { update["repeating_spell-" + lvl + "_" + id + "_spelldescription"] = v.drop_spelldesc}; - update["repeating_spell-" + lvl + "_" + id + "_options-flag"] = "0"; - }; - if(category === "Monsters") { - update["npc"] = "1"; - update["npc_options-flag"] = "0"; - if(v["drop_name"] && v["drop_name"] != "") {update["npc_name"] = v["drop_name"]}; - update["npc_speed"] = v["drop_speed"] ? v["drop_speed"] : ""; - update["strength_base"] = v["drop_str"] ? v["drop_str"] : ""; - update["dexterity_base"] = v["drop_dex"] ? v["drop_dex"] : ""; - update["constitution_base"] = v["drop_con"] ? v["drop_con"] : ""; - update["intelligence_base"] = v["drop_int"] ? v["drop_int"] : ""; - update["wisdom_base"] = v["drop_wis"] ? v["drop_wis"] : ""; - update["charisma_base"] = v["drop_cha"] ? v["drop_cha"] : ""; - callbacks.push( function() {update_attr("strength");} ); - callbacks.push( function() {update_attr("dexterity");} ); - callbacks.push( function() {update_attr("constitution");} ); - callbacks.push( function() {update_attr("intelligence");} ); - callbacks.push( function() {update_attr("wisdom");} ); - callbacks.push( function() {update_attr("charisma");} ); - update["npc_vulnerabilities"] = v["drop_vulnerabilities"] ? v["drop_vulnerabilities"] : ""; - update["npc_resistances"] = v["drop_resistances"] ? v["drop_resistances"] : ""; - update["npc_immunities"] = v["drop_immunities"] ? v["drop_immunities"] : ""; - update["npc_condition_immunities"] = v["drop_condition_immunities"] ? v["drop_condition_immunities"] : ""; - update["npc_languages"] = v["drop_languages"] ? v["drop_languages"] : ""; - update["token_size"] = v["drop_token_size"] ? v["drop_token_size"] : ""; - if(v["drop_challenge_rating"] && v["drop_challenge_rating"] != "") { - callbacks.push( function() {update_challenge();} ); - update["npc_challenge"] = v["drop_challenge_rating"]; - } - else { - update["npc_challenge"] = ""; - } + var category = page.data["Category"]; - var type = ""; - if(v["drop_size"]) {type = v["drop_size"]}; - if(v["drop_type"]) { - if(type.length > 0) { - type = type + " " + v["drop_type"].toLowerCase(); - } - else { - type = v["drop_type"].toLowerCase(); - } - }; - if(v["drop_alignment"]) { - if(type.length > 0) { - type = type + ", " + v["drop_alignment"]; - } - else { - type = v["drop_alignment"]; - } - }; - update["npc_type"] = type; - - if(v["drop_hp"]) { - if(v["drop_hp"].indexOf("(") > -1) { - update["hp_max"] = v["drop_hp"].split(" (")[0]; - update["npc_hpformula"] = v["drop_hp"].split(" (")[1].slice(0, -1); - } - else { - update["hp_max"] = v["drop_hp"] - update["npc_hpformula"] = "" - }; - } - else { - update["hp_max"] = "" - update["npc_hpformula"] = "" - }; - - if(v["drop_ac"]) { - if(v["drop_ac"].indexOf("(") > -1) { - update["npc_ac"] = v["drop_ac"].split(" (")[0]; - update["npc_actype"] = v["drop_ac"].split(" (")[1].slice(0, -1); - } - else { - update["npc_ac"] = v["drop_ac"]; - update["npc_actype"] = ""; - }; - } - else { - update["npc_ac"] = ""; - update["npc_actype"] = ""; - }; - - if(v["drop_hp"]) { - if(v["drop_hp"].indexOf("(") > -1) { - update["hp_max"] = v["drop_hp"].split(" (")[0]; - update["npc_hpformula"] = v["drop_hp"].split(" (")[1].slice(0, -1); - } - else { - update["hp_max"] = v["drop_hp"]; - update["npc_hpformula"] = ""; - } - } - else { - update["hp_max"] = ""; - update["npc_hpformula"] = ""; - }; - - var senses = v["drop_senses"] ? v["drop_senses"] : ""; - if(v["drop_passive_perception"]) { - if(senses.length > 0) { - senses = senses + ", passive Perception " + v["drop_passive_perception"]; - } - else { - senses = "passive Perception " + v["drop_passive_perception"]; - } - } - update["npc_senses"] = senses; - - update["npc_str_save_base"] = ""; - update["npc_dex_save_base"] = ""; - update["npc_con_save_base"] = ""; - update["npc_int_save_base"] = ""; - update["npc_wis_save_base"] = ""; - update["npc_cha_save_base"] = ""; - if(v["drop_saving_throws"] && v["drop_saving_throws"] != "") { - var savearray = v["drop_saving_throws"].split(", "); - _.each(savearray, function(save) { - kv = save.indexOf("-") > -1 ? save.split(" ") : save.split(" +"); - update["npc_" + kv[0].toLowerCase() + "_save_base"] = parseInt(kv[1], 10); + if(category === "Proficiencies" || page.data["data-Language Proficiency"] || page.data["data-Weapon Proficiency"] || page.data["data-Armor Proficiency"] || page.data["data-Tool Proficiency"]) { + getSectionIDs("proficiencies", function(ids) { + var idArray = []; + _.each(ids, function(sectionId) { + idArray.push("repeating_proficiencies_" + sectionId + "_name"); }); - callbacks.push( function() {update_npc_saves();} ); - }; - - update["npc_acrobatics_base"] = ""; - update["npc_animal_handling_base"] = ""; - update["npc_arcana_base"] = ""; - update["npc_athletics_base"] = ""; - update["npc_deception_base"] = ""; - update["npc_history_base"] = ""; - update["npc_insight_base"] = ""; - update["npc_intimidation_base"] = ""; - update["npc_investigation_base"] = ""; - update["npc_medicine_base"] = ""; - update["npc_nature_base"] = ""; - update["npc_perception_base"] = ""; - update["npc_performance_base"] = ""; - update["npc_persuasion_base"] = ""; - update["npc_religion_base"] = ""; - update["npc_sleight_of_hand_base"] = ""; - update["npc_stealth_base"] = ""; - update["npc_survival_base"] = ""; - if(v["drop_skills"] && v["drop_skills"] != "") { - skillarray = v["drop_skills"].split(", "); - _.each(skillarray, function(skill) { - kv = skill.indexOf("-") > -1 ? skill.split(" ") : skill.split(" +"); - update["npc_" + kv[0].toLowerCase().replace(/ /g, '_') + "_base"] = parseInt(kv[1], 10); - }); - callbacks.push( function() {update_npc_skills();} ); - } - - getSectionIDs("repeating_npcaction-l", function(idarray) { - _.each(idarray, function(currentID, i) { - removeRepeatingRow("repeating_npcaction-l_" + currentID); - }); - }); - getSectionIDs("repeating_npcreaction", function(idarray) { - _.each(idarray, function(currentID, i) { - removeRepeatingRow("repeating_npcreaction_" + currentID); - }); - }); - getSectionIDs("repeating_npcaction", function(idarray) { - _.each(idarray, function(currentID, i) { - removeRepeatingRow("repeating_npcaction_" + currentID); - }); - }); - getSectionIDs("repeating_npctrait", function(idarray) { - _.each(idarray, function(currentID, i) { - removeRepeatingRow("repeating_npctrait_" + currentID); - }); - }); - - var contentarray = v["drop_content"]; - if(v.drop_legendary_actions) { - var legendaryactionsarray = JSON.parse(v.drop_legendary_actions); - update["npc_legendary_actions"] = 1; - if(v.drop_legendary_actions_desc) { - update["npc_legendary_actions_desc"] = v.drop_legendary_actions_desc; - } - else if(v.npc_legendary_actions > 0){ - update["npc_legendary_actions_desc"] = `The ${v.drop_name} can take ${v.npc_legendary_actions}, choosing from the options below. Only one legendary option can be used at a time and only at the end of another creature's turn. The ${v.drop_name} regains spent legendary actions at the start of its turn.`; - } - else { - update["npc_legendary_actions_desc"] = ""; - } - } - else if(contentarray && contentarray.indexOf("Legendary Actions") > -1) { - if(contentarray.indexOf(/\n Legendary Actions\n/) > -1) { - temp = contentarray.split(/\n Legendary Actions\n/) - } - else { - temp = contentarray.split(/Legendary Actions\n/) - } - var legendaryactionsarray = temp[1]; - contentarray = temp[0]; - } - - if(v.drop_reactions) { - var reactionsarray = JSON.parse(v.drop_reactions); - } - else if(contentarray && contentarray.indexOf("Reactions") > -1) { - if(contentarray.indexOf(/\n Reactions\n/) > -1) { - temp = contentarray.split(/\n Reactions\n/) - } - else { - temp = contentarray.split(/Reactions\n/) - } - var reactionsarray = temp[1]; - contentarray = temp[0]; - } - - if(v.drop_actions) { - var actionsarray = JSON.parse(v.drop_actions); - } - else if(contentarray && contentarray.indexOf("Actions") > -1) { - if(contentarray.indexOf("Lair Actions") > -1) { - contentarray = contentarray.replace("Lair Actions","Lair Action"); - } - if(contentarray.indexOf(/\n Actions\n/) > -1) { - temp = contentarray.split(/\n Actions\n/) - } - else { - temp = contentarray.split(/Actions\n/) - } - var actionsarray = temp[1]; - contentarray = temp[0]; - } - - if(v.drop_traits) { - var traitsarray = JSON.parse(v.drop_traits); - } - else if(contentarray && contentarray.indexOf("Traits") > -1) { - if(contentarray.indexOf("Lair Traits") > -1) { - contentarray = contentarray.replace("Lair Traits","Lair Trait"); - } - if(contentarray.indexOf(/\n Traits\n/) > -1) { - temp = contentarray.split(/\n Traits\n/) - } - else { - temp = contentarray.split(/Traits\n/) - } - var traitsarray = temp[1]; - contentarray = temp[0]; - } - - if(traitsarray) { - if(v.drop_traits) { - var traitsobj = {}; - traitsarray.forEach(function(val) { traitsobj[val.Name] = val.Desc; }); - } - else { - traitsarray = traitsarray.split("**"); - traitsarray.shift(); - var traitsobj = {}; - traitsarray.forEach(function(val, i) { - if (i % 2 === 1) return; - traitsobj[val] = traitsarray[i + 1]; - }); - } - _.each(traitsobj, function(desc, name) { - newrowid = generateRowID(); - update["repeating_npctrait_" + newrowid + "_name"] = name + "."; - if(desc.substring(0,2) === ": " || encodeURI(desc.substring(0,2)) === ":%C2%A0") { - desc = desc.substring(2); - } - update["repeating_npctrait_" + newrowid + "_desc"] = desc.trim(); - // SPELLCASTING NPCS - if(name === "Spellcasting") { - var lvl = parseInt(desc.substring(desc.indexOf("-level")-4, desc.indexOf("-level")-2).trim(), 10); - lvl = !isNaN(lvl) ? lvl : 1; - var ability = desc.match(/casting ability is (.*?) /); - ability = ability && ability.length > 1 ? ability[1] : false; - ability = ability ? "@{" + ability.toLowerCase() + "_mod}+" : "0*"; - update["npcspellcastingflag"] = 1; - update["spellcasting_ability"] = ability; - update["caster_level"] = lvl; - update["class"] = "Wizard"; - update["base_level"] = lvl; - update["level"] = lvl; - callbacks.push( function() {update_pb();} ); - callbacks.push( function() {update_spell_slots();} ); - } - }); - } - if(actionsarray) { - if(v.drop_actions) { - var actionsobj = {}; - actionsarray.forEach(function(val) { actionsobj[val.Name] = val; }); - - _.each(actionsobj, function(data, name) { - newrowid = generateRowID(); - update["repeating_npcaction_" + newrowid + "_npc_options-flag"] = "0"; - update["repeating_npcaction_" + newrowid + "_name"] = name; - if(data["Desc"]) { - update["repeating_npcaction_" + newrowid + "_description"] = data["Desc"]; - } - - if(data["Type Attack"]) { - update["repeating_npcaction_" + newrowid + "_attack_flag"] = "on"; - update["repeating_npcaction_" + newrowid + "_attack_display_flag"] = "{{attack=1}}"; - update["repeating_npcaction_" + newrowid + "_attack_options"] = "{{attack=1}}"; - if(data["Type"]) { update["repeating_npcaction_" + newrowid + "_attack_type"] = data["Type"]; } - if(data["Reach"]) { update["repeating_npcaction_" + newrowid + "_attack_range"] = data["Reach"]; } - if(data["Hit Bonus"]) { update["repeating_npcaction_" + newrowid + "_attack_tohit"] = data["Hit Bonus"]; } - if(data["Target"]) { update["repeating_npcaction_" + newrowid + "_attack_target"] = data["Target"]; } - if(data["Damage"]) { update["repeating_npcaction_" + newrowid + "_attack_damage"] = data["Damage"]; } - if(data["Damage Type"]) { update["repeating_npcaction_" + newrowid + "_attack_damagetype"] = data["Damage Type"]; } - - if(data["Damage 2"] && data["Damage 2 Type"]) { - update["repeating_npcaction_" + newrowid + "_attack_damage2"] = data["Damage 2"]; - update["repeating_npcaction_" + newrowid + "_attack_damagetype2"] = data["Damage 2 Type"]; - } - } - }) - } - else { - actionsarray = actionsarray.split("**"); - actionsarray.shift(); - var actionsobj = {}; - actionsarray.forEach(function(val, i) { - if (i % 2 === 1) return; - actionsobj[val] = actionsarray[i + 1]; - }); - _.each(actionsobj, function(desc, name) { - newrowid = generateRowID(); - update["repeating_npcaction_" + newrowid + "_npc_options-flag"] = "0"; - update["repeating_npcaction_" + newrowid + "_name"] = name; - if(desc.substring(0,2) === ": " || encodeURI(desc.substring(0,2)) === ":%C2%A0") { - desc = desc.substring(2); - } - if(desc.indexOf(" Attack:") > -1) { - update["repeating_npcaction_" + newrowid + "_attack_flag"] = "on"; - update["repeating_npcaction_" + newrowid + "_attack_display_flag"] = "{{attack=1}}"; - update["repeating_npcaction_" + newrowid + "_attack_options"] = "{{attack=1}}"; - if(desc.indexOf(" Weapon Attack:") > -1) { - attacktype = desc.split(" Weapon Attack:")[0]; - } - else if(desc.indexOf(" Spell Attack:") > -1) { - attacktype = desc.split(" Spell Attack:")[0]; - } - else { - console.log("FAILED TO IMPORT ATTACK - NO ATTACK TYPE FOUND (Weapon Attack/Spell Attack)"); - return; - } - - update["repeating_npcaction_" + newrowid + "_attack_type"] = attacktype; - if(attacktype === "Melee") { - update["repeating_npcaction_" + newrowid + "_attack_range"] = (desc.match(/reach (.*?),/) || ["",""])[1]; - } - else { - update["repeating_npcaction_" + newrowid + "_attack_range"] = (desc.match(/range (.*?),/) || ["",""])[1]; - } - update["repeating_npcaction_" + newrowid + "_attack_tohit"] = (desc.match(/\+(.*) to hit/) || ["",""])[1]; - update["repeating_npcaction_" + newrowid + "_attack_target"] = (desc.match(/\.,(?!.*\.,)(.*)\. Hit:/) || ["",""])[1]; - if(desc.toLowerCase().indexOf("damage") > -1) { - update["repeating_npcaction_" + newrowid + "_attack_damage"] = (desc.match(/\(([^)]+)\)/) || ["",""])[1]; - update["repeating_npcaction_" + newrowid + "_attack_damagetype"] = (desc.match(/\) (.*?) damage/) || ["",""])[1]; - if((desc.match(/\(/g) || []).length > 1 && desc.match(/\((?!.*\()([^)]+)\)/)) { - var second_match = desc.match(/\((?!.*\()([^)]+)\)/); - if(second_match[1] && second_match[1].indexOf(" DC") === -1) { - update["repeating_npcaction_" + newrowid + "_attack_damage2"] = (desc.match(/\((?!.*\()([^)]+)\)/) || ["",""])[1]; - update["repeating_npcaction_" + newrowid + "_attack_damagetype2"] = (desc.match(/\)(?!.*\)) (.*?) damage/) || ["",""])[1]; - }; - }; - ctest1 = desc.split("damage.")[1]; - ctest2 = desc.split("damage, ")[1]; - if(ctest1 && ctest1.length > 0) { - update["repeating_npcaction_" + newrowid + "_description"] = ctest1.trim(); - } - else if(ctest2 && ctest2.length > 0) { - update["repeating_npcaction_" + newrowid + "_description"] = ctest2.trim(); - } - } - else { - update["repeating_npcaction_" + newrowid + "_description"] = desc.split("Hit:")[1].trim(); - } - } - else { - update["repeating_npcaction_" + newrowid + "_description"] = desc; - } - - }); - } - callbacks.push( function() {update_npc_action("all");} ); - } - if(reactionsarray) { - update["npcreactionsflag"] = 1; - if(v.drop_reactions) { - var reactionsobj = {}; - reactionsarray.forEach(function(val) { reactionsobj[val.Name] = val.Desc; }); - } - else { - reactionsarray = reactionsarray.split("**"); - reactionsarray.shift(); - var reactionsobj = {}; - reactionsarray.forEach(function(val, i) { - if (i % 2 === 1) return; - reactionsobj[val] = reactionsarray[i + 1]; - }); - } - _.each(reactionsobj, function(desc, name) { - newrowid = generateRowID(); - update["repeating_npcreaction_" + newrowid + "_name"] = name + "."; - if(desc.substring(0,2) === ": " || encodeURI(desc.substring(0,2)) === ":%C2%A0") { - desc = desc.substring(2); - } - update["repeating_npcreaction_" + newrowid + "_desc"] = desc.trim(); - }); - } - if(legendaryactionsarray) { - if(v.drop_legendary_actions) { - var actionsobj = {}; - legendaryactionsarray.forEach(function(val) { actionsobj[val.Name] = val; }); - _.each(actionsobj, function(data, name) { - newrowid = generateRowID(); - update["repeating_npcaction-l_" + newrowid + "_npc_options-flag"] = "0"; - update["repeating_npcaction-l_" + newrowid + "_name"] = name; - update["repeating_npcaction-l_" + newrowid + "_description"] = data["Desc"]; - - if(data["Type Attack"]) { - update["repeating_npcaction-l_" + newrowid + "_attack_flag"] = "on"; - update["repeating_npcaction-l_" + newrowid + "_attack_display_flag"] = "{{attack=1}}"; - update["repeating_npcaction-l_" + newrowid + "_attack_options"] = "{{attack=1}}"; - update["repeating_npcaction-l_" + newrowid + "_attack_type"] = data["Type Attack"]; - update["repeating_npcaction-l_" + newrowid + "_attack_range"] = data["Reach"]; - update["repeating_npcaction-l_" + newrowid + "_attack_tohit"] = data["Hit Bonus"]; - update["repeating_npcaction-l_" + newrowid + "_attack_target"] = data["Target"]; - update["repeating_npcaction-l_" + newrowid + "_attack_damage"] = data["Damage"]; - update["repeating_npcaction-l_" + newrowid + "_attack_damagetype"] = data["Damage Type"]; - - if(data["Damage 2"] && data["Damage 2 Type"]) { - update["repeating_npcaction-l_" + newrowid + "_attack_damage2"] = data["Damage 2"]; - update["repeating_npcaction-l_" + newrowid + "_attack_damagetype2"] = data["Damage 2 Type"]; - } - } - }); - } - else { - var numlegendaryactions = (legendaryactionsarray.match(/\d+/) || [""])[0]; - update["npc_legendary_actions"] = numlegendaryactions; - update["npc_legendary_actions_desc"] = `The ${v.drop_name} can take ${numlegendaryactions}, choosing from the options below. Only one legendary option can be used at a time and only at the end of another creature's turn. The ${v.drop_name} regains spent legendary actions at the start of its turn.`; - legendaryactionsarray = legendaryactionsarray.split("**"); - legendaryactionsarray.shift(); - var actionsobj = {}; - legendaryactionsarray.forEach(function(val, i) { - if (i % 2 === 1) return; - actionsobj[val] = legendaryactionsarray[i + 1]; - }); - _.each(actionsobj, function(desc, name) { - newrowid = generateRowID(); - update["repeating_npcaction-l_" + newrowid + "_npc_options-flag"] = "0"; - update["repeating_npcaction-l_" + newrowid + "_name"] = name; - if(desc.substring(0,2) === ": " || encodeURI(desc.substring(0,2)) === ":%C2%A0") { - desc = desc.substring(2); - } - if(desc.indexOf(" Attack:") > -1) { - update["repeating_npcaction-l_" + newrowid + "_attack_flag"] = "on"; - update["repeating_npcaction-l_" + newrowid + "_attack_display_flag"] = "{{attack=1}}"; - update["repeating_npcaction-l_" + newrowid + "_attack_options"] = "{{attack=1}}"; - if(desc.indexOf(" Weapon Attack:") > -1) { - attacktype = desc.split(" Weapon Attack:")[0]; - } - else if(desc.indexOf(" Spell Attack:") > -1) { - attacktype = desc.split(" Spell Attack:")[0]; - } - else { - console.log("FAILED TO IMPORT ATTACK - NO ATTACK TYPE FOUND (Weapon Attack/Spell Attack)"); - return; - } - update["repeating_npcaction-l_" + newrowid + "_attack_type"] = attacktype; - if(attacktype === "Melee") { - update["repeating_npcaction-l_" + newrowid + "_attack_range"] = (desc.match(/reach (.*?),/) || ["",""])[1]; - } - else { - update["repeating_npcaction-l_" + newrowid + "_attack_range"] = (desc.match(/range (.*?),/) || ["",""])[1]; - } - update["repeating_npcaction-l_" + newrowid + "_attack_tohit"] = (desc.match(/\+(.*) to hit/) || ["",""])[1]; - update["repeating_npcaction-l_" + newrowid + "_attack_target"] = (desc.match(/\.,(?!.*\.,)(.*)\. Hit:/) || ["",""])[1]; - update["repeating_npcaction-l_" + newrowid + "_attack_damage"] = (desc.match(/\(([^)]+)\)/) || ["",""])[1]; - update["repeating_npcaction-l_" + newrowid + "_attack_damagetype"] = (desc.match(/\) (.*?) damage/) || ["",""])[1]; - if((desc.match(/\(/g) || []).length > 1 && (!desc.match(/\((?!.*\()([^)]+)\)/).indexOf(" DC")[1] || desc.match(/\((?!.*\()([^)]+)\)/).indexOf(" DC")[1] === -1)) { - update["repeating_npcaction-l_" + newrowid + "_attack_damage2"] = (desc.match(/\((?!.*\()([^)]+)\)/) || ["",""])[1]; - update["repeating_npcaction-l_" + newrowid + "_attack_damagetype2"] = (desc.match(/\)(?!.*\)) (.*?) damage/) || ["",""])[1]; - } - } - else { - update["repeating_npcaction-l_" + newrowid + "_description"] = desc; - } - }); - } - - } - } - if(category === "Feats") { - update["tab"] = "core"; - if(v.drop_name) {update["repeating_traits_" + id + "_name"] = v.drop_name}; - if(v.drop_content) {update["repeating_traits_" + id + "_description"] = v.drop_content}; - update["repeating_traits_" + id + "_source"] = "Feat"; - update["repeating_traits_" + id + "_source_type"] = v.drop_properties ? v.drop_properties : ""; - update["repeating_traits_" + id + "_options-flag"] = "0"; - update["repeating_traits_" + id + "_display_flag"] = "on"; - } - if(category === "Proficiencies") { - newrowid = generateRowID(); - update["tab"] = "core"; - if(v.drop_type.toLowerCase() === "language" || v.drop_type.toLowerCase() === "armor" - || v.drop_type.toLowerCase() === "weapon" || v.drop_type.toLowerCase() === "other") { - getSectionIDs("proficiencies", function(ids) { - var idArray = []; - _.each(ids, function(sectionId) { - idArray.push("repeating_proficiencies_" + sectionId + "_name"); - }); - getAttrs(idArray, function(vals) { - var prof_names = []; - _.each(vals, function(value) { - prof_names.push(value.toLowerCase()); - }); - if( prof_names.indexOf(v.drop_name.toLowerCase()) == -1 ) { - update["repeating_proficiencies_" + newrowid + "_prof_type"] = v.drop_type.replace("custom", "").toUpperCase(); - update["repeating_proficiencies_" + newrowid + "_name"] = v.drop_name; - update["repeating_proficiencies_" + newrowid + "_options-flag"] = 0; - }; - callbacks.push( function() {cleanup_drop_fields();} ); - setAttrs(update, {silent: true}, function() {callbacks.forEach(function(callback) {callback(); })} ); - return; - }); - }); - } - else if(v.drop_type.toLowerCase() === "tool" || v.drop_type.toLowerCase() === "skillcustom") { getSectionIDs("tool", function(ids) { - var idArray = []; _.each(ids, function(sectionId) { idArray.push("repeating_tool_" + sectionId + "_toolname"); }); @@ -7757,487 +6973,1099 @@ _.each(vals, function(value) { prof_names.push(value.toLowerCase()); }); - if( prof_names.indexOf(v.drop_name.toLowerCase()) == -1 ) { - update["repeating_tool_" + newrowid + "_toolname"] = v.drop_name; - update["repeating_tool_" + newrowid + "_toolattr_base"] = "?{Attribute?|Strength,@{strength_mod}|Dexterity,@{dexterity_mod}|Constitution,@{constitution_mod}|Intelligence,@{intelligence_mod}|Wisdom,@{wisdom_mod}|Charisma,@{charisma_mod}}"; - update["repeating_tool_" + newrowid + "_options-flag"] = 0; - if(v.drop_toolbonus_base) { update["repeating_tool_" + newrowid + "_toolbonus_base"] = v.drop_toolbonus_base }; - callbacks.push( function() {update_tool(newrowid);} ); - } else { - var match =_.keys(vals)[_.values(vals).indexOf(v.drop_name)]; - if(v.drop_toolbonus_base) { update[match.replace("_toolname", "_toolbonus_base")] = v.drop_toolbonus_base }; - callbacks.push( function() {update_tool(match.split("_")[2]);} ); - }; - callbacks.push( function() {cleanup_drop_fields();} ); - setAttrs(update, {silent: true}, function() {callbacks.forEach(function(callback) {callback(); })} ); - return; + + var results = processDrop(page, v, prof_names); + setAttrs(results.update, {silent: true}, function() {results.callbacks.forEach(function(callback) {callback(); })} ); + }); }); - } - if(v.drop_type.toLowerCase() === "skill") { - var skill_string = v.drop_name.toLowerCase().replace(/ /g, '_'); - update[skill_string + "_prof"] = "(@{pb}*@{" + skill_string + "_type})"; - }; + }); + } else { + var prof_names = []; + var results = processDrop(page, v, prof_names); + setAttrs(results.update, {silent: true}, function() {results.callbacks.forEach(function(callback) {callback(); })} ); } - - var modStringToAttrib = function(modString) { - var finalAttrib = ""; - if (modString == "FIN") { - if (parseInt(v.strength_base) > parseInt(v.dexterity_base)) { - finalAttrib = "@{strength_mod}"; - } else { - finalAttrib = "@{dexterity_mod}"; - } - } else { - switch(modString) { - case "STR": - finalAttrib = "@{strength_mod}"; - break; - case "DEX": - finalAttrib = "@{dexterity_mod}"; - break; - case "CON": - finalAttrib = "@{constitution_mod}"; - break; - case "WIS": - finalAttrib = "@{wisdom_mod}"; - break; - case "INT": - finalAttrib = "@{intelligence_mod}"; - break; - case "CHA": - finalAttrib = "@{charisma_mod}"; - break; - } - } - return finalAttrib; - }; - - if(category === "Classes") { - update["tab"] = "core"; - if(v.drop_name && v.drop_name !== "") { update["class"] = v.drop_name; } - if(v.drop_hit_die && v.drop_hit_die !== "") { - update["base_level"] = v.base_level ? v.base_level : "1"; - update["hit_dice_max"] = update["base_level"] + v.drop_hit_die; - update["hit_dice"] = update["base_level"]; - } - if(v.drop_traits) { - var traits = JSON.parse(v.drop_traits); - _.each(traits, function(value) { - var id = generateRowID(); - update["repeating_traits_" + id + "_name"] = value["Name"]; - update["repeating_traits_" + id + "_description"] = value["Desc"]; - update["repeating_traits_" + id + "_source"] = "Class"; - update["repeating_traits_" + id + "_source_type"] = v.drop_name ? v.drop_name : ""; - update["repeating_traits_" + id + "_options-flag"] = "0"; - update["repeating_traits_" + id + "_display_flag"] = "on"; - }); - } - if(v.drop_class_saving_throws) { - var saves = JSON.parse(v.drop_class_saving_throws); - _.each(saves, function(value) { - update[value.toLowerCase() + "_save_prof"] = "(@{pb})"; - }); - } - if(v.drop_spellcasting_ability && v.drop_spellcasting_ability !== "") { - update["spellcasting_ability"] = "+@{" + v.drop_spellcasting_ability.toLowerCase() + "}"; - } - if(v.drop_global_damage) { - var dmgmod = JSON.parse(v.drop_global_damage); - var id = generateRowID(); - update["repeating_damagemod_" + id + "_global_damage_rollstring"] = `${dmgmod["Uses"]}[${dmgmod["Name"]}]`; - update["repeating_damagemod_" + id + "_global_damage_active_flag"] = "1"; - update["repeating_damagemod_" + id + "_options-flag"] = "0"; - update["repeating_damagemod_" + id + "_global_damage_type"] = dmgmod["Name"]; - update["global_damage_mod_flag"] = "1"; - } - if(v.drop_actions) { - var actionsobj = {}; - JSON.parse(v.drop_actions).forEach(function(val) { actionsobj[val.Name] = val; }); - - _.each(actionsobj, function(data, name) { - newrowid = generateRowID(); - update["repeating_attack_" + newrowid + "_options-flag"] = "0"; - update["repeating_attack_" + newrowid + "_atkname"] = name; - if(data["Desc"]) { - update["repeating_attack_" + newrowid + "_atk_desc"] = data["Desc"]; - } - - if(data["Type Attack"]) { - update["repeating_attack_" + newrowid + "_attack_flag"] = "on"; - update["repeating_attack_" + newrowid + "_atkflag"] = "{{attack=1}}"; - update["repeating_attack_" + newrowid + "_attack_options"] = "{{attack=1}}"; - if(data["Type"]) { - update["repeating_attack_" + newrowid + "_attack_type"] = data["Type"]; - } - if(data["Reach"]) { update["repeating_attack_" + newrowid + "_atkrange"] = data["Reach"]; } - - if(data["Damage"]) { update["repeating_attack_" + newrowid + "_dmgbase"] = data["Damage"]; } - if(data["Damage Type"]) { update["repeating_attack_" + newrowid + "_dmgtype"] = data["Damage Type"]; } - if (data["Modifier"]) { - update["repeating_attack_" + newrowid + "_dmgattr"] = modStringToAttrib(data["Modifier"]); - update["repeating_attack_" + newrowid + "_atkattr_base"] = modStringToAttrib(data["Modifier"]); - } - - - if(data["Damage 2"] && data["Damage 2 Type"]) { - update["repeating_attack_" + newrowid + "_dmg2flag"] = "{{damage=1}} {{dmg2flag=1}}"; - update["repeating_attack_" + newrowid + "_atk_dmg2base"] = data["Damage 2"]; - update["repeating_attack_" + newrowid + "_attack_damagetype2"] = data["Damage 2 Type"]; - if (data["Modifier 2"]) { - update["repeating_attack_" + newrowid + "_dmg2attr"] = modStringToAttrib(data["Modifier 2"]); - } - } - } - }); - } - if(v.drop_resources) { - var resources = JSON.parse(v.drop_resources); - var resource_count = 0; - var numUses = function(uses_string) { - var attribs = ["strength", "dexterity", "constitution", "wisdom", "intelligence", "charisma"]; - uses_string = uses_string.toLowerCase(); - _.each(attribs, function(attrib) { - var attribMod = Math.floor((parseInt(v[attrib + "_base"]) - 10) / 2); - if (attribMod < 0) attribMod = 0; - uses_string = uses_string.replace(attrib, attribMod); - }); - var terms = uses_string.split("+"); - var total = 0; - _.each(terms, function(term) { - total += parseInt(term); - }); - return total; - }; - _.each(resources, function(value) { - if (resource_count == 0) { - update["class_resource_name"] = value["Name"]; - var uses = numUses(value["Uses"]); - update["class_resource"] = uses; - update["class_resource_max"] = uses; - resource_count++; - } else if (resource_count == 1) { - update["other_resource_name"] = value["Name"]; - var uses = numUses(value["Uses"]); - update["other_resource"] = uses; - update["other_resource_max"] = uses; - resource_count++; - } - }); - } - - callbacks.push(update_class); - } - if(category === "Subclasses") { - if(v.drop_name && v.drop_name !== "") { update["subclass"] = v.drop_name; } - if(v.drop_hp_per_level && v.drop_hp_per_level !== "") { - var id = generateRowID(); - update["repeating_hpmod_" + id + "_mod"] = v.drop_hp_per_level; - update["repeating_hpmod_" + id + "_source"] = v.drop_name ? v.drop_name : "Subclass"; - } - if(v.drop_traits) { - var traits = JSON.parse(v.drop_traits); - _.each(traits, function(value) { - var id = generateRowID(); - update["repeating_traits_" + id + "_name"] = value["Name"]; - update["repeating_traits_" + id + "_description"] = value["Desc"]; - update["repeating_traits_" + id + "_source"] = "Class"; - update["repeating_traits_" + id + "_source_type"] = v.drop_name ? v.drop_name : ""; - update["repeating_traits_" + id + "_options-flag"] = "0"; - update["repeating_traits_" + id + "_display_flag"] = "on"; - }); - } - callbacks.push(update_class); - } - if(category === "Races" || category === "Subraces") { - update["tab"] = "core"; - if(category === "Races") { - update["race"] = v.drop_name; - if (v.drop_name == "Halfling") { - update["halflingluck_flag"] = "1"; - } - } - else { - update["subrace"] = v.drop_name; - }; - if(v.drop_speed) {update["speed"] = v.drop_speed}; - if(v.drop_size) {update["size"] = v.drop_size}; - - if(v.drop_traits) { - var trait_array = JSON.parse(v.drop_traits); - if(trait_array && trait_array.length) { - _.each(trait_array, function(trait) { - newrowid = generateRowID(); - update["repeating_traits_" + newrowid + "_name"] = trait["Name"]; - update["repeating_traits_" + newrowid + "_description"] = trait["Desc"]; - update["repeating_traits_" + newrowid + "_source"] = "Racial"; - update["repeating_traits_" + newrowid + "_source_type"] = v.drop_name; - update["repeating_traits_" + newrowid + "_options-flag"] = 0; - update["repeating_traits_" + newrowid + "_display_flag"] = "on"; - }); - }; - }; - - if(v.drop_actions) { - var actionsobj = {}; - JSON.parse(v.drop_actions).forEach(function(val) { actionsobj[val.Name] = val; }); - - _.each(actionsobj, function(data, name) { - newrowid = generateRowID(); - update["repeating_attack_" + newrowid + "_options-flag"] = "0"; - update["repeating_attack_" + newrowid + "_atkname"] = name; - if(data["Desc"]) { - update["repeating_attack_" + newrowid + "_atk_desc"] = data["Desc"]; - } - - if(data["Type Attack"]) { - if (data["Type"] == "Spell") { - update["repeating_attack_" + newrowid + "_atkflag"] = "0"; - update["repeating_attack_" + newrowid + "_attack_options"] = ""; - update["repeating_attack_" + newrowid + "_saveflag"] = "{{save=1}} {{saveattr=@{saveattr}}} {{savedesc=@{saveeffect}}} {{savedc=[[[[@{savedc}]][SAVE]]]}}" - } else { - update["repeating_attack_" + newrowid + "_attack_flag"] = "on"; - update["repeating_attack_" + newrowid + "_atkflag"] = "{{attack=1}}"; - update["repeating_attack_" + newrowid + "_attack_options"] = "{{attack=1}}"; - } - if(data["Reach"]) { update["repeating_attack_" + newrowid + "_atkrange"] = data["Reach"]; } - - if(data["Damage"]) { update["repeating_attack_" + newrowid + "_dmgbase"] = data["Damage"]; } - if(data["Damage Type"]) { update["repeating_attack_" + newrowid + "_dmgtype"] = data["Damage Type"]; } - if (data["Modifier"]) { - update["repeating_attack_" + newrowid + "_dmgattr"] = modStringToAttrib(data["Modifier"]); - update["repeating_attack_" + newrowid + "_atkattr_base"] = modStringToAttrib(data["Modifier"]); - } else { - update["repeating_attack_" + newrowid + "_dmgattr"] = "0"; - } - if (data["Save"]) { update["repeating_attack_" + newrowid + "_saveattr"] = data["Save"] } - if (data["Save DC"]) { update["repeating_attack_" + newrowid + "_savedc"] = "(" + modStringToAttrib(data["Save DC"]) + "+8+@{pb})" } - if (data["Save Effect"]) { update["repeating_attack_" + newrowid + "_saveeffect"] = data["Save Effect"] } - - if(data["Damage 2"] && data["Damage 2 Type"]) { - update["repeating_attack_" + newrowid + "_dmg2flag"] = "{{damage=1}} {{dmg2flag=1}}"; - update["repeating_attack_" + newrowid + "_atk_dmg2base"] = data["Damage 2"]; - update["repeating_attack_" + newrowid + "_attack_damagetype2"] = data["Damage 2 Type"]; - if (data["Modifier 2"]) { - update["repeating_attack_" + newrowid + "_dmg2attr"] = modStringToAttrib(data["Modifier 2"]); - } else { - update["repeating_attack_" + newrowid + "_dmgattr"] = "0"; - } - } - } - }); - } - callbacks.push(update_race_display); - } - if(category === "Backgrounds") { - update["tab"] = "core"; - if(v.drop_name && v.drop_name !== "") { update["background"] = v.drop_name; } - if(v.drop_feature_name) { - var id = generateRowID(); - update["repeating_traits_" + id + "_name"] = v.drop_feature_name; - update["repeating_traits_" + id + "_description"] = v.drop_feature_description || ""; - update["repeating_traits_" + id + "_source"] = "Background"; - update["repeating_traits_" + id + "_source_type"] = v.drop_name ? v.drop_name : ""; - update["repeating_traits_" + id + "_options-flag"] = "0"; - update["repeating_traits_" + id + "_display_flag"] = "on"; - } - if(v.drop_traits) { - var traits = JSON.parse(v.drop_traits); - _.each(traits, function(value) { - var id = generateRowID(); - update["repeating_traits_" + id + "_name"] = value["Name"]; - update["repeating_traits_" + id + "_description"] = value["Desc"]; - update["repeating_traits_" + id + "_source"] = "Background"; - update["repeating_traits_" + id + "_source_type"] = v.drop_name ? v.drop_name : ""; - update["repeating_traits_" + id + "_options-flag"] = "0"; - update["repeating_traits_" + id + "_display_flag"] = "on"; - }); - } - } - //This one is just a catch-all for proficiencies, as they are formated the same regardless of the category - if(["Races", "Subraces", "Classes", "Subclasses", "Backgrounds"].indexOf(category) != -1) { - if(v.drop_skill_proficiency) { - var skill_array = JSON.parse(v.drop_skill_proficiency); - if(skill_array["Proficiencies"] && skill_array["Proficiencies"].length) { - _.each(skill_array["Proficiencies"], function(prof) { - var skill_string = prof.toLowerCase().replace(/ /g, '_'); - update[skill_string + "_prof"] = "(@{pb}*@{" + skill_string + "_type})"; - }); - }; - }; - if(v.drop_language_prof || v.drop_weapon_prof || v.drop_armor_prof || v.drop_tool_prof) { - getSectionIDs("proficiencies", function(ids) { - var idArray = []; - _.each(ids, function(sectionId) { - idArray.push("repeating_proficiencies_" + sectionId + "_name"); - }); - getSectionIDs("tool", function(ids) { - _.each(ids, function(sectionId) { - idArray.push("repeating_tool_" + sectionId + "_toolname"); - }); - getAttrs(idArray, function(vals) { - var prof_names = []; - _.each(vals, function(value) { - prof_names.push(value.toLowerCase()); - }); - - if(v.drop_language_prof) { - var lang_array = JSON.parse(v.drop_language_prof); - if(lang_array["Proficiencies"] && lang_array["Proficiencies"].length) { - _.each(lang_array["Proficiencies"], function(prof) { - if( prof_names.indexOf(prof.toLowerCase()) == -1 ) { - newrowid = generateRowID(); - update["repeating_proficiencies_" + newrowid + "_prof_type"] = "LANGUAGE"; - update["repeating_proficiencies_" + newrowid + "_name"] = prof; - update["repeating_proficiencies_" + newrowid + "_options-flag"] = 0; - } - }); - } - }; - if(v.drop_weapon_prof) { - var weap_array = JSON.parse(v.drop_weapon_prof); - if(weap_array["Proficiencies"] && weap_array["Proficiencies"].length) { - _.each(weap_array["Proficiencies"], function(prof) { - if( prof_names.indexOf(prof.toLowerCase()) == -1 ) { - newrowid = generateRowID(); - update["repeating_proficiencies_" + newrowid + "_prof_type"] = "WEAPON"; - update["repeating_proficiencies_" + newrowid + "_name"] = prof; - update["repeating_proficiencies_" + newrowid + "_options-flag"] = 0; - } - }); - } - }; - if(v.drop_armor_prof) { - var armor_array = JSON.parse(v.drop_armor_prof); - if(armor_array["Proficiencies"] && armor_array["Proficiencies"].length) { - _.each(armor_array["Proficiencies"], function(prof) { - if( prof_names.indexOf(prof.toLowerCase()) == -1 ) { - newrowid = generateRowID(); - update["repeating_proficiencies_" + newrowid + "_prof_type"] = "ARMOR"; - update["repeating_proficiencies_" + newrowid + "_name"] = prof; - update["repeating_proficiencies_" + newrowid + "_options-flag"] = 0; - } - }); - } - }; - if(v.drop_tool_prof) { - var tool_array = JSON.parse(v.drop_tool_prof); - if(tool_array["Proficiencies"] && tool_array["Proficiencies"].length) { - _.each(tool_array["Proficiencies"], function(prof) { - if( prof_names.indexOf(prof.toLowerCase()) == -1 ) { - newrowid = generateRowID(); - update["repeating_tool_" + newrowid + "_toolname"] = prof; - update["repeating_tool_" + newrowid + "_toolattr_base"] = "?{Attribute?|Strength,@{strength_mod}|Dexterity,@{dexterity_mod}|Constitution,@{constitution_mod}|Intelligence,@{intelligence_mod}|Wisdom,@{wisdom_mod}|Charisma,@{charisma_mod}}"; - update["repeating_tool_" + newrowid + "_options-flag"] = 0; - callbacks.push( function() {update_tool(newrowid);} ); - } - }); - } - }; - - callbacks.push( function() {cleanup_drop_fields();} ); - setAttrs(update, {silent: true}, function() {callbacks.forEach(function(callback) {callback(); })} ); - return; - }); - }); - }); - } - } - - - callbacks.push( function() {cleanup_drop_fields();} ); - setAttrs(update, {silent: true}, function() {callbacks.forEach(function(callback) {callback(); })} ); }); - }; - var cleanup_drop_fields = function() { + var processDrop = function(page, currentData, prof_names, looped) { + var category = page.data["Category"]; + var callbacks = []; var update = {}; + var id = generateRowID(); + var jsonparse = function(data) { + var result = {}; + try { + result = JSON.parse(data); + } catch(e) { + result = data; + } + return result; + }; update["drop_category"] = ""; update["drop_name"] = ""; update["drop_data"] = ""; - update["drop_weight"] = ""; - update["drop_properties"] = ""; - update["drop_modifiers"] = ""; update["drop_content"] = ""; - update["drop_itemtype"] = ""; - update["drop_damage"] = ""; - update["drop_damagetype"] = ""; - update["drop_range"] = ""; - update["drop_ac"] = ""; - update["drop_actions"] = ""; - update["drop_legendary_actions"] = ""; - update["drop_legendary_actions_desc"] = ""; - update["drop_reactions"] = ""; - update["drop_traits"] = ""; - update["drop_attack_type"] = ""; - update["drop_damage2"] = ""; - update["drop_damagetype2"] = ""; - update["drop_alt_damage"] = ""; - update["drop_alt_damagetype"] = ""; - update["drop_alt_damage2"] = ""; - update["drop_alt_damagetype2"] = ""; - update["drop_spellritualflag"] = ""; - update["drop_spellschool"] = ""; - update["drop_spellcastingtime"] = ""; - update["drop_spelltarget"] = ""; - update["drop_spellcomp"] = ""; - update["drop_spellcomp_materials"] = ""; - update["drop_spellconcentrationflag"] = ""; - update["drop_spellduration"] = ""; - update["drop_spellhealing"] = ""; - update["drop_spelldmgmod"] = ""; - update["drop_spellsave"] = ""; - update["drop_spellsavesuccess"] = ""; - update["drop_spellhldie"] = ""; - update["drop_spellhldietype"] = ""; - update["drop_spellhlbonus"] = ""; - update["drop_spelllevel"] = ""; - update["drop_spell_damage_progression"] = ""; - update["drop_speed"] = ""; - update["drop_str"] = ""; - update["drop_dex"] = ""; - update["drop_con"] = ""; - update["drop_int"] = ""; - update["drop_wis"] = ""; - update["drop_cha"] = ""; - update["drop_vulnerabilities"] = ""; - update["drop_resistances"] = ""; - update["drop_immunities"] = ""; - update["drop_condition_immunities"] = ""; - update["drop_languages"] = ""; - update["drop_challenge_rating"] = ""; - update["drop_size"] = ""; - update["drop_type"] = ""; - update["drop_alignment"] = ""; - update["drop_hp"] = ""; - update["drop_saving_throws"] = ""; - update["drop_senses"] = ""; - update["drop_passive_perception"] = ""; - update["drop_skills"] = ""; - update["drop_token_size"] = ""; - update["drop_armor_prof"] = ""; - update["drop_hit_die"] = ""; - update["drop_weapon_prof"] = ""; - update["drop_spellcasting_ability"] = ""; - update["drop_class_saving_throws"] = ""; - update["drop_language_prof"] = ""; - update["drop_tool_prof"] = ""; - update["drop_hp_per_level"] = ""; - update["drop_class_spells"] = ""; - update["drop_global_damage"] = ""; - update["drop_feature_name"] = ""; - update["drop_feature_description"] = ""; - update["drop_spell_ability"] = ""; - update["drop_toolbonus_base"] = ""; - update["drop_itemcount"] = ""; - update["drop_skill_proficiency"] = ""; - update["drop_parent"] = ""; - update["drop_resources"] = ""; - update["drop_spellhldesc"] = ""; - update["drop_spelldesc"] = ""; - setAttrs(update, {silent: true}); + if(category === "Items") { + if(currentData.npc === "0") { + update["tab"] = "core"; + if(page.name) {update["repeating_inventory_" + id + "_itemname"] = page.name}; + if(page.data["itemcount"]) {update["repeating_inventory_" + id + "_itemcount"] = page.data["itemcount"]}; + if(page.data["Weight"]) {update["repeating_inventory_" + id + "_itemweight"] = page.data["Weight"]}; + if(page.data["Properties"]) {update["repeating_inventory_" + id + "_itemproperties"] = page.data["Properties"]}; + if(page.content) {update["repeating_inventory_" + id + "_itemcontent"] = page.content}; + if(!page.data["Item Type"] || page.data["Item Type"] == "") {page.data["Item Type"] = category}; + var mods = "Item Type: " + page.data["Item Type"]; + if(page.data["AC"] && page.data["AC"] != "") { + mods += ", AC: " + page.data["AC"]; + if(!looped) { + callbacks.push( function() {update_ac();} ) + } + }; + if(page.data["Damage"] && page.data["Damage"] != "") {mods += ", Damage: " + page.data["Damage"]}; + if(page.data["Damage Type"] && page.data["Damage Type"] != "") {mods += ", Damage Type: " + page.data["Damage Type"]}; + if(page.data["Secondary Damage"] && page.data["Secondary Damage"] != "") {mods += ", Secondary Damage: " + page.data["Secondary Damage"]}; + if(page.data["Secondary Damage Type"] && page.data["Secondary Damage Type"] != "") {mods += ", Secondary Damage Type: " + page.data["Secondary Damage Type"]}; + if(page.data["Alternate Damage"] && page.data["Alternate Damage"] != "") {mods += ", Alternate Damage: " + page.data["Alternate Damage"]}; + if(page.data["Alternate Damage Type"] && page.data["Alternate Damage Type"] != "") {mods += ", Alternate Damage Type: " + page.data["Alternate Damage Type"]}; + if(page.data["Alternate Secondary Damage"] && page.data["Alternate Secondary Damage"] != "") {mods += ", Alternate Secondary Damage: " + page.data["Alternate Secondary Damage"]}; + if(page.data["Alternate Secondary Damage Type"] && page.data["Alternate Secondary Damage Type"] != "") {mods += ", Alternate Secondary Damage Type: " + page.data["Alternate Secondary Damage Type"]}; + if(page.data["Range"] && page.data["Range"] != "") {mods += ", Range: " + page.data["Range"]}; + if(page.data["Modifiers"] && page.data["Modifiers"] != "") {mods += ", " + page.data["Modifiers"]}; + update["repeating_inventory_" + id + "_itemmodifiers"] = mods; + if(page.data["Item Type"].indexOf("Weapon") > -1) { + update["repeating_inventory_" + id + "_hasattack"] = 1; + callbacks.push( function() { + if(page.data["Alternate Damage"] && page.data["Alternate Damage"] !== "") { + create_attack_from_item(id, {versatile: true}); + } else { + create_attack_from_item(id); + } + } ); + } + else if(page.data["Item Type"].indexOf("Ammunition") > -1) { + update["repeating_inventory_" + id + "_useasresource"] = 1; + callbacks.push( function() {create_resource_from_item(id);} ); + }; + if(page.data["Modifiers"]) { + callbacks.push( function() {check_itemmodifiers(page.data["Modifiers"]);} ); + }; + if(!looped) { + callbacks.push( function() {update_weight();} ); + } + } + else { + if(page.data["Item Type"] && new RegExp('\\bweapon\\b', 'i').test(page.data["Item Type"])) { + var make_npc_attack_from_item = function(rowid, options) { + update["repeating_npcaction_" + rowid + "_npc_options-flag"] = "0"; + update["repeating_npcaction_" + rowid + "_attack_flag"] = "on"; + + if(page.name) { + update["repeating_npcaction_" + rowid + "_name"] = page.name; + if(options && options.versatile) { + update["repeating_npcaction_" + rowid + "_name"] += " (" + (options.versatile === 1 ? "One-Handed" : "Two-Handed") + ")"; + } else if(options && options.thrown) { + update["repeating_npcaction_" + rowid + "_name"] += " (Thrown)"; + } + } + if(page.content) { update["repeating_npcaction_" + rowid + "_description"] = page.content; } + + update["repeating_npcaction_" + rowid + "_attack_display_flag"] = "{{attack=1}}"; + update["repeating_npcaction_" + rowid + "_attack_options"] = "{{attack=1}}"; + update["repeating_npcaction_" + rowid + "_attack_type"] = page.data["Item Type"].substring(0, page.data["Item Type"].indexOf(" ")); + + var thrown = page.data["Properties"] && new RegExp('\\bthrown\\b', 'i').test(page.data["Properties"]); + + if(page.data["Range"] && page.data["Range"] != "" && (!thrown || (options && options.thrown))) { + update["repeating_npcaction_" + rowid + "_attack_range"] = page.data["Range"]; + } + else if(page.data["Properties"] && new RegExp('\\breach\\b', 'i').test(page.data["Properties"])) { + update["repeating_npcaction_" + rowid + "_attack_range"] = "10 ft"; + } + else { + update["repeating_npcaction_" + rowid + "_attack_range"] = "5 ft"; + } + + update["repeating_npcaction_" + rowid + "_attack_target"] = "one target"; + + var isFinesse = page.data["Properties"] && new RegExp('\\bfinesse\\b', 'i').test(page.data["Properties"]); + var attack_type = update[`repeating_npcaction_${id}_attack_type`].toLowerCase(); + var use_dex_mod = attack_type === "ranged" || (isFinesse && currentData.dexterity_mod > currentData.strength_mod); + var weapon_attr_mod = use_dex_mod ? currentData.dexterity_mod : currentData.strength_mod; + update["repeating_npcaction_" + rowid + "_attack_tohit"] = weapon_attr_mod; + + if(options && options.versatile === 2) { + if(page.data["Alternate Damage"]) { update["repeating_npcaction_" + rowid + "_attack_damage"] = page.data["Alternate Damage"] + "+" + weapon_attr_mod; } + if(page.data["Alternate Damage Type"]) { update["repeating_npcaction_" + rowid + "_attack_damagetype"] = page.data["Alternate Damage Type"]; } + if(page.data["Alternate Secondary Damage"]) { update["repeating_npcaction_" + rowid + "_attack_damage2"] = page.data["Alternate Secondary Damage"]; } + if(page.data["Alternate Secondary Damage Type"]) { update["repeating_npcaction_" + rowid + "_attack_damagetype2"] = page.data["Alternate Secondary Damage Type"]; } + } + else { + if(page.data["Damage"]) { update["repeating_npcaction_" + rowid + "_attack_damage"] = page.data["Damage"] + "+" + weapon_attr_mod; } + if(page.data["Damage Type"]) {update["repeating_npcaction_" + rowid + "_attack_damagetype"] = page.data["Damage Type"]; } + if(page.data["Secondary Damage"]) { update["repeating_npcaction_" + rowid + "_attack_damage2"] = page.data["Secondary Damage"]; } + if(page.data["Secondary Damage Type"]) { update["repeating_npcaction_" + rowid + "_attack_damagetype2"] = page.data["Secondary Damage Type"]; } + } + + if(page.data["Modifiers"]) { + if(attack_type === "melee") { + var tohit_regex = /(?:melee|weapon) *attacks? *([\\+\\-] *[0-9]+)/i; + var melee_damage_regex = /(?:melee|weapon) *damage *([\\+\\-] *[0-9]+)/i; + var tohit_match = tohit_regex.exec(page.data["Modifiers"]); + var damage_match = melee_damage_regex.exec(page.data["Modifiers"]); + + if(tohit_match && tohit_match[1]) { update[`repeating_npcaction_${rowid}_attack_tohit`] = +update[`repeating_npcaction_${rowid}_attack_tohit`] + +tohit_match[1]; } + if(page.data["Damage"] && damage_match && damage_match[1]) { update[`repeating_npcaction_${rowid}_attack_damage`] += damage_match[1]; } + } else if(attack_type === "ranged") { + var tohit_regex = /(?:ranged|weapon) *attacks? *([\\+\\-] *[0-9]+)/i; + var ranged_damage_regex = /(?:ranged|weapon) *damage *([\\+\\-] *[0-9]+)/i; + var tohit_match = tohit_regex.exec(page.data["Modifiers"]); + var damage_match = ranged_damage_regex.exec(page.data["Modifiers"]); + + if(tohit_match && tohit_match[1]) { update[`repeating_npcaction_${rowid}_attack_tohit`] = +update[`repeating_npcaction_${rowid}_attack_tohit`] + +tohit_match[1]; } + if(page.data["Damage"] && damage_match && damage_match[1]) { update[`repeating_npcaction_${rowid}_attack_damage`] += damage_match[1]; } + } + } + }; + + var versatile = page.data["Properties"] && new RegExp('\\bversatile\\b', 'i').test(page.data["Properties"]) ? 1 : undefined; + make_npc_attack_from_item(id, {versatile: versatile}); + if(page.data["Properties"] && new RegExp('\\bthrown\\b', 'i').test(page.data["Properties"])) { + make_npc_attack_from_item(generateRowID(), {thrown: true}); + } + if(versatile && page.data["Alternate Damage"]) { + make_npc_attack_from_item(generateRowID(), {versatile:2}) + } + + callbacks.push(function() { check_itemmodifiers(page.data["Modifiers"]); }, function() { update_npc_action("all"); }); + } + } + }; + if(category === "Spells") { + var lvl = page.data["Level"] && page.data["Level"] > 0 ? page.data["Level"] : "cantrip"; + update["repeating_spell-" + lvl + "_" + id + "_spelllevel"] = lvl; + if(page.data["spellcasting_ability"]) { + update["repeating_spell-" + lvl + "_" + id + "_spell_ability"] = page.data["spellcasting_ability"]; + } else { + update["repeating_spell-" + lvl + "_" + id + "_spell_ability"] = "spell"; + } + if(page.name) {update["repeating_spell-" + lvl + "_" + id + "_spellname"] = page.name}; + if(page.data["Ritual"]) {update["repeating_spell-" + lvl + "_" + id + "_spellritual"] = "{{ritual=1}}"}; + if(page.data["School"]) {update["repeating_spell-" + lvl + "_" + id + "_spellschool"] = page.data["School"].toLowerCase()}; + if(page.data["Casting Time"]) {update["repeating_spell-" + lvl + "_" + id + "_spellcastingtime"] = page.data["Casting Time"]}; + if(page.data["Range"]) {update["repeating_spell-" + lvl + "_" + id + "_spellrange"] = page.data["Range"]}; + if(page.data["Target"]) {update["repeating_spell-" + lvl + "_" + id + "_spelltarget"] = page.data["Target"]}; + if(page.data["Components"]) { + if(page.data["Components"].toLowerCase().indexOf("v") === -1) {update["repeating_spell-" + lvl + "_" + id + "_spellcomp_v"] = "0"}; + if(page.data["Components"].toLowerCase().indexOf("s") === -1) {update["repeating_spell-" + lvl + "_" + id + "_spellcomp_s"] = "0"}; + if(page.data["Components"].toLowerCase().indexOf("m") === -1) {update["repeating_spell-" + lvl + "_" + id + "_spellcomp_m"] = "0"}; + }; + if(page.data["Material"]) {update["repeating_spell-" + lvl + "_" + id + "_spellcomp_materials"] = page.data["Material"]}; + if(page.data["Concentration"]) {update["repeating_spell-" + lvl + "_" + id + "_spellconcentration"] = "{{concentration=1}}"}; + if(page.data["Duration"]) {update["repeating_spell-" + lvl + "_" + id + "_spellduration"] = page.data["Duration"]}; + if(page.data["Damage"] || page.data["Healing"]) { + update["repeating_spell-" + lvl + "_" + id + "_spelloutput"] = "ATTACK"; + callbacks.push( function() {create_attack_from_spell(lvl, id, currentData.character_id);} ); + } + else if(page.data["Higher Spell Slot Desc"] && page.data["Higher Spell Slot Desc"] != "") { + var spelllevel = "?{Cast at what level?"; + for(i = 0; i < 10-lvl; i++) { + spelllevel = spelllevel + "|Level " + (parseInt(i, 10) + parseInt(lvl, 10)) + "," + (parseInt(i, 10) + parseInt(lvl, 10)); + } + spelllevel = spelllevel + "}"; + update["repeating_spell-" + lvl + "_" + id + "_rollcontent"] = "@{wtype}&{template:spell} {{level=@{spellschool} " + spelllevel + "}} {{name=@{spellname}}} {{castingtime=@{spellcastingtime}}} {{range=@{spellrange}}} {{target=@{spelltarget}}} @{spellcomp_v} @{spellcomp_s} @{spellcomp_m} {{material=@{spellcomp_materials}}} {{duration=@{spellduration}}} {{description=@{spelldescription}}} {{athigherlevels=@{spellathigherlevels}}} @{spellritual} {{innate=@{innate}}} @{spellconcentration} @{charname_output}"; + }; + if(page.data["Spell Attack"]) {update["repeating_spell-" + lvl + "_" + id + "_spellattack"] = page.data["Spell Attack"]}; + if(page.data["Damage"]) {update["repeating_spell-" + lvl + "_" + id + "_spelldamage"] = page.data["Damage"]}; + if(page.data["Damage Type"]) {update["repeating_spell-" + lvl + "_" + id + "_spelldamagetype"] = page.data["Damage Type"]}; + if(page.data["Secondary Damage"]) {update["repeating_spell-" + lvl + "_" + id + "_spelldamage2"] = page.data["Secondary Damage"]}; + if(page.data["Secondary Damage Type"]) {update["repeating_spell-" + lvl + "_" + id + "_spelldamagetype2"] = page.data["Secondary Damage Type"]}; + if(page.data["Healing"]) {update["repeating_spell-" + lvl + "_" + id + "_spellhealing"] = page.data["Healing"];}; + if(page.data["Add Casting Modifier"]) {update["repeating_spell-" + lvl + "_" + id + "_spelldmgmod"] = page.data["Add Casting Modifier"]}; + if(page.data["Save"]) {update["repeating_spell-" + lvl + "_" + id + "_spellsave"] = page.data["Save"]}; + if(page.data["Save Success"]) {update["repeating_spell-" + lvl + "_" + id + "_spellsavesuccess"] = page.data["Save Success"]}; + if(page.data["Higher Spell Slot Dice"]) {update["repeating_spell-" + lvl + "_" + id + "_spellhldie"] = page.data["Higher Spell Slot Dice"]}; + if(page.data["Higher Spell Slot Die"]) {update["repeating_spell-" + lvl + "_" + id + "_spellhldietype"] = page.data["Higher Spell Slot Die"]}; + if(page.data["Higher Spell Slot Bonus"]) {update["repeating_spell-" + lvl + "_" + id + "_spellhlbonus"] = page.data["Higher Spell Slot Bonus"]}; + if(page.data["Higher Spell Slot Desc"]) {update["repeating_spell-" + lvl + "_" + id + "_spellathigherlevels"] = page.data["Higher Spell Slot Desc"]}; + if(page.data["data-Cantrip Scaling"] && lvl == "cantrip") {update["repeating_spell-" + lvl + "_" + id + "_spell_damage_progression"] = "Cantrip " + page.data["data-Cantrip Scaling"].charAt(0).toUpperCase() + page.data["data-Cantrip Scaling"].slice(1);}; + if(page.data["data-description"]) { update["repeating_spell-" + lvl + "_" + id + "_spelldescription"] = page.data["data-description"]}; + update["repeating_spell-" + lvl + "_" + id + "_options-flag"] = "0"; + }; + if(category === "Monsters") { + update["npc"] = "1"; + update["npc_options-flag"] = "0"; + if(page.name && page.name != "") {update["npc_name"] = page.name}; + update["npc_speed"] = page.data["Speed"] ? page.data["Speed"] : ""; + update["strength_base"] = page.data["STR"] ? page.data["STR"] : ""; + update["dexterity_base"] = page.data["DEX"] ? page.data["DEX"] : ""; + update["constitution_base"] = page.data["CON"] ? page.data["CON"] : ""; + update["intelligence_base"] = page.data["INT"] ? page.data["INT"] : ""; + update["wisdom_base"] = page.data["WIS"] ? page.data["WIS"] : ""; + update["charisma_base"] = page.data["CHA"] ? page.data["CHA"] : ""; + callbacks.push( function() {update_attr("strength");} ); + callbacks.push( function() {update_attr("dexterity");} ); + callbacks.push( function() {update_attr("constitution");} ); + callbacks.push( function() {update_attr("intelligence");} ); + callbacks.push( function() {update_attr("wisdom");} ); + callbacks.push( function() {update_attr("charisma");} ); + update["npc_vulnerabilities"] = page.data["Vulnerabilities"] ? page.data["Vulnerabilities"] : ""; + update["npc_resistances"] = page.data["Resistances"] ? page.data["Resistances"] : ""; + update["npc_immunities"] = page.data["Immunities"] ? page.data["Immunities"] : ""; + update["npc_condition_immunities"] = page.data["Condition Immunities"] ? page.data["Condition Immunities"] : ""; + update["npc_languages"] = page.data["Languages"] ? page.data["Languages"] : ""; + update["token_size"] = page.data["Token Size"] ? page.data["Token Size"] : ""; + if(page.data["Challenge Rating"] && page.data["Challenge Rating"] != "") { + callbacks.push( function() {update_challenge();} ); + update["npc_challenge"] = page.data["Challenge Rating"]; + } + else { + update["npc_challenge"] = ""; + } + if(page.data["data-XP"]) { + update["npc_xp"] = page.data["data-XP"].toString().replace(",",""); + } + + var type = ""; + if(page.data["Size"]) {type = page.data["Size"]}; + if(page.data["Type"]) { + if(type.length > 0) { + type = type + " " + page.data["Type"].toLowerCase(); + } + else { + type = page.data["Type"].toLowerCase(); + } + }; + if(page.data["Alignment"]) { + if(type.length > 0) { + type = type + ", " + page.data["Alignment"]; + } + else { + type = page.data["Alignment"]; + } + }; + update["npc_type"] = type; + + if(page.data["HP"]) { + if(page.data["HP"].toString().indexOf("(") > -1) { + update["hp_max"] = page.data["HP"].toString().split(" (")[0]; + update["npc_hpformula"] = page.data["HP"].toString().split(" (")[1].slice(0, -1); + } + else { + update["hp_max"] = page.data["HP"] + update["npc_hpformula"] = "" + }; + } + else { + update["hp_max"] = "" + update["npc_hpformula"] = "" + }; + + if(page.data["AC"]) { + if(page.data["AC"].toString().indexOf("(") > -1) { + update["npc_ac"] = page.data["AC"].toString().split(" (")[0]; + update["npc_actype"] = page.data["AC"].toString().split(" (")[1].slice(0, -1); + } + else { + update["npc_ac"] = page.data["AC"]; + update["npc_actype"] = ""; + }; + } + else { + update["npc_ac"] = ""; + update["npc_actype"] = ""; + }; + + var senses = page.data["Senses"] ? page.data["Senses"] : ""; + if(page.data["Passive Perception"]) { + if(senses.length > 0) { + senses = senses + ", passive Perception " + page.data["Passive Perception"]; + } + else { + senses = "passive Perception " + page.data["Passive Perception"]; + } + } + update["npc_senses"] = senses; + + update["npc_str_save_base"] = ""; + update["npc_dex_save_base"] = ""; + update["npc_con_save_base"] = ""; + update["npc_int_save_base"] = ""; + update["npc_wis_save_base"] = ""; + update["npc_cha_save_base"] = ""; + if(page.data["Saving Throws"] && page.data["Saving Throws"] != "") { + var savearray = page.data["Saving Throws"].split(", "); + _.each(savearray, function(save) { + kv = save.indexOf("-") > -1 ? save.split(" ") : save.split(" +"); + update["npc_" + kv[0].toLowerCase() + "_save_base"] = parseInt(kv[1], 10); + }); + callbacks.push( function() {update_npc_saves();} ); + }; + + update["npc_acrobatics_base"] = ""; + update["npc_animal_handling_base"] = ""; + update["npc_arcana_base"] = ""; + update["npc_athletics_base"] = ""; + update["npc_deception_base"] = ""; + update["npc_history_base"] = ""; + update["npc_insight_base"] = ""; + update["npc_intimidation_base"] = ""; + update["npc_investigation_base"] = ""; + update["npc_medicine_base"] = ""; + update["npc_nature_base"] = ""; + update["npc_perception_base"] = ""; + update["npc_performance_base"] = ""; + update["npc_persuasion_base"] = ""; + update["npc_religion_base"] = ""; + update["npc_sleight_of_hand_base"] = ""; + update["npc_stealth_base"] = ""; + update["npc_survival_base"] = ""; + if(page.data["Skills"] && page.data["Skills"] != "") { + skillarray = page.data["Skills"].split(", "); + _.each(skillarray, function(skill) { + kv = skill.indexOf("-") > -1 ? skill.split(" ") : skill.split(" +"); + update["npc_" + kv[0].toLowerCase().replace(/ /g, '_') + "_base"] = parseInt(kv[1], 10); + }); + callbacks.push( function() {update_npc_skills();} ); + } + + getSectionIDs("repeating_npcaction-l", function(idarray) { + _.each(idarray, function(currentID, i) { + removeRepeatingRow("repeating_npcaction-l_" + currentID); + }); + }); + getSectionIDs("repeating_npcreaction", function(idarray) { + _.each(idarray, function(currentID, i) { + removeRepeatingRow("repeating_npcreaction_" + currentID); + }); + }); + getSectionIDs("repeating_npcaction", function(idarray) { + _.each(idarray, function(currentID, i) { + removeRepeatingRow("repeating_npcaction_" + currentID); + }); + }); + getSectionIDs("repeating_npctrait", function(idarray) { + _.each(idarray, function(currentID, i) { + removeRepeatingRow("repeating_npctrait_" + currentID); + }); + }); + + var contentarray = page.content; + if(page.data["data-Legendary Actions"]) { + var legendaryactionsarray = jsonparse(page.data["data-Legendary Actions"]); + update["npc_legendary_actions"] = 1; + if(page.data["Legendary Actions Desc"]) { + update["npc_legendary_actions_desc"] = page.data["Legendary Actions Desc"]; + } + else if(currentData.npc_legendary_actions > 0){ + update["npc_legendary_actions_desc"] = `The ${page.name} can take ${currentData.npc_legendary_actions}, choosing from the options below. Only one legendary option can be used at a time and only at the end of another creature's turn. The ${page.name} regains spent legendary actions at the start of its turn.`; + } + else { + update["npc_legendary_actions_desc"] = ""; + } + } + else if(contentarray && contentarray.indexOf("Legendary Actions") > -1) { + if(contentarray.indexOf(/\n Legendary Actions\n/) > -1) { + temp = contentarray.split(/\n Legendary Actions\n/) + } + else { + temp = contentarray.split(/Legendary Actions\n/) + } + var legendaryactionsarray = temp[1]; + contentarray = temp[0]; + } + + if(page.data["data-Reactions"]) { + var reactionsarray = jsonparse(page.data["data-Reactions"]); + } + else if(contentarray && contentarray.indexOf("Reactions") > -1) { + if(contentarray.indexOf(/\n Reactions\n/) > -1) { + temp = contentarray.split(/\n Reactions\n/) + } + else { + temp = contentarray.split(/Reactions\n/) + } + var reactionsarray = temp[1]; + contentarray = temp[0]; + } + + if(page.data["data-Actions"]) { + var actionsarray = jsonparse(page.data["data-Actions"]); + } + else if(contentarray && contentarray.indexOf("Actions") > -1) { + if(contentarray.indexOf("Lair Actions") > -1) { + contentarray = contentarray.replace("Lair Actions","Lair Action"); + } + if(contentarray.indexOf(/\n Actions\n/) > -1) { + temp = contentarray.split(/\n Actions\n/) + } + else { + temp = contentarray.split(/Actions\n/) + } + var actionsarray = temp[1]; + contentarray = temp[0]; + } + + if(page.data["data-Traits"]) { + var traitsarray = jsonparse(page.data["data-Traits"]); + } + else if(contentarray && contentarray.indexOf("Traits") > -1) { + if(contentarray.indexOf("Lair Traits") > -1) { + contentarray = contentarray.replace("Lair Traits","Lair Trait"); + } + if(contentarray.indexOf(/\n Traits\n/) > -1) { + temp = contentarray.split(/\n Traits\n/) + } + else { + temp = contentarray.split(/Traits\n/) + } + var traitsarray = temp[1]; + contentarray = temp[0]; + } + + if(traitsarray) { + if(page.data["data-Traits"]) { + var traitsobj = {}; + traitsarray.forEach(function(val) { traitsobj[val.Name] = val.Desc; }); + } + else { + traitsarray = traitsarray.split("**"); + traitsarray.shift(); + var traitsobj = {}; + traitsarray.forEach(function(val, i) { + if (i % 2 === 1) return; + traitsobj[val] = traitsarray[i + 1]; + }); + } + _.each(traitsobj, function(desc, name) { + newrowid = generateRowID(); + update["repeating_npctrait_" + newrowid + "_name"] = name + "."; + if(desc.substring(0,2) === ": " || encodeURI(desc.substring(0,2)) === ":%C2%A0") { + desc = desc.substring(2); + } + update["repeating_npctrait_" + newrowid + "_desc"] = desc.trim(); + // SPELLCASTING NPCS + if(name === "Spellcasting") { + var lvl = parseInt(desc.substring(desc.indexOf("-level")-4, desc.indexOf("-level")-2).trim(), 10); + lvl = !isNaN(lvl) ? lvl : 1; + var ability = desc.match(/casting ability is (.*?) /); + ability = ability && ability.length > 1 ? ability[1] : false; + ability = ability ? "@{" + ability.toLowerCase() + "_mod}+" : "0*"; + update["npcspellcastingflag"] = 1; + update["spellcasting_ability"] = ability; + update["caster_level"] = lvl; + update["class"] = "Wizard"; + update["base_level"] = lvl; + update["level"] = lvl; + callbacks.push( function() {update_pb();} ); + callbacks.push( function() {update_spell_slots();} ); + } + }); + } + if(actionsarray) { + if(page.data["data-Actions"]) { + var actionsobj = {}; + actionsarray.forEach(function(val) { actionsobj[val.Name] = val; }); + + _.each(actionsobj, function(action, name) { + newrowid = generateRowID(); + update["repeating_npcaction_" + newrowid + "_npc_options-flag"] = "0"; + update["repeating_npcaction_" + newrowid + "_name"] = name; + if(action["Desc"]) { + update["repeating_npcaction_" + newrowid + "_description"] = action["Desc"]; + } + + if(action["Type Attack"]) { + update["repeating_npcaction_" + newrowid + "_attack_flag"] = "on"; + update["repeating_npcaction_" + newrowid + "_attack_display_flag"] = "{{attack=1}}"; + update["repeating_npcaction_" + newrowid + "_attack_options"] = "{{attack=1}}"; + if(action["Type"]) { update["repeating_npcaction_" + newrowid + "_attack_type"] = action["Type"]; } + if(action["Reach"]) { update["repeating_npcaction_" + newrowid + "_attack_range"] = action["Reach"]; } + if(action["Hit Bonus"]) { update["repeating_npcaction_" + newrowid + "_attack_tohit"] = action["Hit Bonus"]; } + if(action["Target"]) { update["repeating_npcaction_" + newrowid + "_attack_target"] = action["Target"]; } + if(action["Damage"]) { update["repeating_npcaction_" + newrowid + "_attack_damage"] = action["Damage"]; } + if(action["Damage Type"]) { update["repeating_npcaction_" + newrowid + "_attack_damagetype"] = action["Damage Type"]; } + + if(action["Damage 2"] && action["Damage 2 Type"]) { + update["repeating_npcaction_" + newrowid + "_attack_damage2"] = action["Damage 2"]; + update["repeating_npcaction_" + newrowid + "_attack_damagetype2"] = action["Damage 2 Type"]; + } + } + }) + } + else { + actionsarray = actionsarray.split("**"); + actionsarray.shift(); + var actionsobj = {}; + actionsarray.forEach(function(val, i) { + if (i % 2 === 1) return; + actionsobj[val] = actionsarray[i + 1]; + }); + _.each(actionsobj, function(desc, name) { + newrowid = generateRowID(); + update["repeating_npcaction_" + newrowid + "_npc_options-flag"] = "0"; + update["repeating_npcaction_" + newrowid + "_name"] = name; + if(desc.substring(0,2) === ": " || encodeURI(desc.substring(0,2)) === ":%C2%A0") { + desc = desc.substring(2); + } + if(desc.indexOf(" Attack:") > -1) { + update["repeating_npcaction_" + newrowid + "_attack_flag"] = "on"; + update["repeating_npcaction_" + newrowid + "_attack_display_flag"] = "{{attack=1}}"; + update["repeating_npcaction_" + newrowid + "_attack_options"] = "{{attack=1}}"; + if(desc.indexOf(" Weapon Attack:") > -1) { + attacktype = desc.split(" Weapon Attack:")[0]; + } + else if(desc.indexOf(" Spell Attack:") > -1) { + attacktype = desc.split(" Spell Attack:")[0]; + } + else { + console.log("FAILED TO IMPORT ATTACK - NO ATTACK TYPE FOUND (Weapon Attack/Spell Attack)"); + return; + } + + update["repeating_npcaction_" + newrowid + "_attack_type"] = attacktype; + if(attacktype === "Melee") { + update["repeating_npcaction_" + newrowid + "_attack_range"] = (desc.match(/reach (.*?),/) || ["",""])[1]; + } + else { + update["repeating_npcaction_" + newrowid + "_attack_range"] = (desc.match(/range (.*?),/) || ["",""])[1]; + } + update["repeating_npcaction_" + newrowid + "_attack_tohit"] = (desc.match(/\+(.*) to hit/) || ["",""])[1]; + update["repeating_npcaction_" + newrowid + "_attack_target"] = (desc.match(/\.,(?!.*\.,)(.*)\. Hit:/) || ["",""])[1]; + if(desc.toLowerCase().indexOf("damage") > -1) { + update["repeating_npcaction_" + newrowid + "_attack_damage"] = (desc.match(/\(([^)]+)\)/) || ["",""])[1]; + update["repeating_npcaction_" + newrowid + "_attack_damagetype"] = (desc.match(/\) (.*?) damage/) || ["",""])[1]; + if((desc.match(/\(/g) || []).length > 1 && desc.match(/\((?!.*\()([^)]+)\)/)) { + var second_match = desc.match(/\((?!.*\()([^)]+)\)/); + if(second_match[1] && second_match[1].indexOf(" DC") === -1) { + update["repeating_npcaction_" + newrowid + "_attack_damage2"] = (desc.match(/\((?!.*\()([^)]+)\)/) || ["",""])[1]; + update["repeating_npcaction_" + newrowid + "_attack_damagetype2"] = (desc.match(/\)(?!.*\)) (.*?) damage/) || ["",""])[1]; + }; + }; + ctest1 = desc.split("damage.")[1]; + ctest2 = desc.split("damage, ")[1]; + if(ctest1 && ctest1.length > 0) { + update["repeating_npcaction_" + newrowid + "_description"] = ctest1.trim(); + } + else if(ctest2 && ctest2.length > 0) { + update["repeating_npcaction_" + newrowid + "_description"] = ctest2.trim(); + } + } + else { + update["repeating_npcaction_" + newrowid + "_description"] = desc.split("Hit:")[1].trim(); + } + } + else { + update["repeating_npcaction_" + newrowid + "_description"] = desc; + } + + }); + } + callbacks.push( function() {update_npc_action("all");} ); + } + if(reactionsarray) { + update["npcreactionsflag"] = 1; + if(page.data["data-Reactions"]) { + var reactionsobj = {}; + reactionsarray.forEach(function(val) { reactionsobj[val.Name] = val.Desc; }); + } + else { + reactionsarray = reactionsarray.split("**"); + reactionsarray.shift(); + var reactionsobj = {}; + reactionsarray.forEach(function(val, i) { + if (i % 2 === 1) return; + reactionsobj[val] = reactionsarray[i + 1]; + }); + } + _.each(reactionsobj, function(desc, name) { + newrowid = generateRowID(); + update["repeating_npcreaction_" + newrowid + "_name"] = name + "."; + if(desc.substring(0,2) === ": " || encodeURI(desc.substring(0,2)) === ":%C2%A0") { + desc = desc.substring(2); + } + update["repeating_npcreaction_" + newrowid + "_desc"] = desc.trim(); + }); + } + if(legendaryactionsarray) { + if(page.data["data-Legendary Actions"]) { + var actionsobj = {}; + legendaryactionsarray.forEach(function(val) { actionsobj[val.Name] = val; }); + _.each(actionsobj, function(action, name) { + newrowid = generateRowID(); + update["repeating_npcaction-l_" + newrowid + "_npc_options-flag"] = "0"; + update["repeating_npcaction-l_" + newrowid + "_name"] = name; + update["repeating_npcaction-l_" + newrowid + "_description"] = action["Desc"]; + + if(action["Type Attack"]) { + update["repeating_npcaction-l_" + newrowid + "_attack_flag"] = "on"; + update["repeating_npcaction-l_" + newrowid + "_attack_display_flag"] = "{{attack=1}}"; + update["repeating_npcaction-l_" + newrowid + "_attack_options"] = "{{attack=1}}"; + update["repeating_npcaction-l_" + newrowid + "_attack_type"] = action["Type Attack"]; + update["repeating_npcaction-l_" + newrowid + "_attack_range"] = action["Reach"]; + update["repeating_npcaction-l_" + newrowid + "_attack_tohit"] = action["Hit Bonus"]; + update["repeating_npcaction-l_" + newrowid + "_attack_target"] = action["Target"]; + update["repeating_npcaction-l_" + newrowid + "_attack_damage"] = action["Damage"]; + update["repeating_npcaction-l_" + newrowid + "_attack_damagetype"] = action["Damage Type"]; + + if(action["Damage 2"] && action["Damage 2 Type"]) { + update["repeating_npcaction-l_" + newrowid + "_attack_damage2"] = action["Damage 2"]; + update["repeating_npcaction-l_" + newrowid + "_attack_damagetype2"] = action["Damage 2 Type"]; + } + } + }); + } + else { + var numlegendaryactions = (legendaryactionsarray.match(/\d+/) || [""])[0]; + update["npc_legendary_actions"] = numlegendaryactions; + update["npc_legendary_actions_desc"] = `The ${page.name} can take ${numlegendaryactions}, choosing from the options below. Only one legendary option can be used at a time and only at the end of another creature's turn. The ${page.name} regains spent legendary actions at the start of its turn.`; + legendaryactionsarray = legendaryactionsarray.split("**"); + legendaryactionsarray.shift(); + var actionsobj = {}; + legendaryactionsarray.forEach(function(val, i) { + if (i % 2 === 1) return; + actionsobj[val] = legendaryactionsarray[i + 1]; + }); + _.each(actionsobj, function(desc, name) { + newrowid = generateRowID(); + update["repeating_npcaction-l_" + newrowid + "_npc_options-flag"] = "0"; + update["repeating_npcaction-l_" + newrowid + "_name"] = name; + if(desc.substring(0,2) === ": " || encodeURI(desc.substring(0,2)) === ":%C2%A0") { + desc = desc.substring(2); + } + if(desc.indexOf(" Attack:") > -1) { + update["repeating_npcaction-l_" + newrowid + "_attack_flag"] = "on"; + update["repeating_npcaction-l_" + newrowid + "_attack_display_flag"] = "{{attack=1}}"; + update["repeating_npcaction-l_" + newrowid + "_attack_options"] = "{{attack=1}}"; + if(desc.indexOf(" Weapon Attack:") > -1) { + attacktype = desc.split(" Weapon Attack:")[0]; + } + else if(desc.indexOf(" Spell Attack:") > -1) { + attacktype = desc.split(" Spell Attack:")[0]; + } + else { + console.log("FAILED TO IMPORT ATTACK - NO ATTACK TYPE FOUND (Weapon Attack/Spell Attack)"); + return; + } + update["repeating_npcaction-l_" + newrowid + "_attack_type"] = attacktype; + if(attacktype === "Melee") { + update["repeating_npcaction-l_" + newrowid + "_attack_range"] = (desc.match(/reach (.*?),/) || ["",""])[1]; + } + else { + update["repeating_npcaction-l_" + newrowid + "_attack_range"] = (desc.match(/range (.*?),/) || ["",""])[1]; + } + update["repeating_npcaction-l_" + newrowid + "_attack_tohit"] = (desc.match(/\+(.*) to hit/) || ["",""])[1]; + update["repeating_npcaction-l_" + newrowid + "_attack_target"] = (desc.match(/\.,(?!.*\.,)(.*)\. Hit:/) || ["",""])[1]; + update["repeating_npcaction-l_" + newrowid + "_attack_damage"] = (desc.match(/\(([^)]+)\)/) || ["",""])[1]; + update["repeating_npcaction-l_" + newrowid + "_attack_damagetype"] = (desc.match(/\) (.*?) damage/) || ["",""])[1]; + if((desc.match(/\(/g) || []).length > 1 && (!desc.match(/\((?!.*\()([^)]+)\)/).indexOf(" DC")[1] || desc.match(/\((?!.*\()([^)]+)\)/).indexOf(" DC")[1] === -1)) { + update["repeating_npcaction-l_" + newrowid + "_attack_damage2"] = (desc.match(/\((?!.*\()([^)]+)\)/) || ["",""])[1]; + update["repeating_npcaction-l_" + newrowid + "_attack_damagetype2"] = (desc.match(/\)(?!.*\)) (.*?) damage/) || ["",""])[1]; + } + } + else { + update["repeating_npcaction-l_" + newrowid + "_description"] = desc; + } + }); + } + + } + } + if(category === "Feats") { + update["tab"] = "core"; + if(page.name) {update["repeating_traits_" + id + "_name"] = page.name}; + if(page.content) {update["repeating_traits_" + id + "_description"] = page.content}; + update["repeating_traits_" + id + "_source"] = "Feat"; + update["repeating_traits_" + id + "_source_type"] = page.data["Properties"] ? page.data["Properties"] : ""; + update["repeating_traits_" + id + "_options-flag"] = "0"; + update["repeating_traits_" + id + "_display_flag"] = "on"; + } + if(category === "Proficiencies") { + var newrowid = generateRowID(); + var type = page.data["Type"] || ""; + if(type.toLowerCase() === "language" || type.toLowerCase() === "armor" + || type.toLowerCase() === "weapon" || type.toLowerCase() === "other") { + if( prof_names.indexOf(page.name.toLowerCase()) == -1 ) { + update["repeating_proficiencies_" + newrowid + "_prof_type"] = type.replace("custom", "").toUpperCase(); + update["repeating_proficiencies_" + newrowid + "_name"] = page.name; + update["repeating_proficiencies_" + newrowid + "_options-flag"] = 0; + prof_names.push(page.name.toLowerCase()); + }; + } + else if(type.toLowerCase() === "tool" || type.toLowerCase() === "skillcustom") { + if( prof_names.indexOf(page.name.toLowerCase()) == -1 ) { + update["repeating_tool_" + newrowid + "_toolname"] = page.name; + update["repeating_tool_" + newrowid + "_toolattr_base"] = "?{Attribute?|Strength,@{strength_mod}|Dexterity,@{dexterity_mod}|Constitution,@{constitution_mod}|Intelligence,@{intelligence_mod}|Wisdom,@{wisdom_mod}|Charisma,@{charisma_mod}}"; + update["repeating_tool_" + newrowid + "_options-flag"] = 0; + if(page.data["toolbonus_base"]) { update["repeating_tool_" + newrowid + "_toolbonus_base"] = page.data["toolbonus_base"] }; + prof_names.push(page.name.toLowerCase()); + callbacks.push( function() {update_tool(newrowid);} ); + }; + } + if(type.toLowerCase() === "skill") { + var skill_string = page.name.toLowerCase().replace(/ /g, '_'); + update[skill_string + "_prof"] = "(@{pb}*@{" + skill_string + "_type})"; + }; + } + + var modStringToAttrib = function(modString) { + var finalAttrib = ""; + if (modString == "FIN") { + if (parseInt(currentData.strength_base) > parseInt(currentData.dexterity_base)) { + finalAttrib = "@{strength_mod}"; + } else { + finalAttrib = "@{dexterity_mod}"; + } + } else { + switch(modString) { + case "STR": + finalAttrib = "@{strength_mod}"; + break; + case "DEX": + finalAttrib = "@{dexterity_mod}"; + break; + case "CON": + finalAttrib = "@{constitution_mod}"; + break; + case "WIS": + finalAttrib = "@{wisdom_mod}"; + break; + case "INT": + finalAttrib = "@{intelligence_mod}"; + break; + case "CHA": + finalAttrib = "@{charisma_mod}"; + break; + } + } + return finalAttrib; + }; + + if(category === "Classes") { + update["tab"] = "core"; + if(page.name && page.name !== "") { update["class"] = page.name; } + if(page.data["Hit Die"] && page.data["Hit Die"] !== "") { + update["base_level"] = currentData.base_level ? currentData.base_level : "1"; + update["hit_dice_max"] = update["base_level"] + page.data["Hit Die"]; + update["hit_dice"] = update["base_level"]; + } + if(page.data["data-Traits"]) { + var traits = jsonparse(page.data["data-Traits"]); + _.each(traits, function(value) { + var id = generateRowID(); + update["repeating_traits_" + id + "_name"] = value["Name"]; + update["repeating_traits_" + id + "_description"] = value["Desc"]; + update["repeating_traits_" + id + "_source"] = "Class"; + update["repeating_traits_" + id + "_source_type"] = page.name ? page.name : ""; + update["repeating_traits_" + id + "_options-flag"] = "0"; + update["repeating_traits_" + id + "_display_flag"] = "on"; + }); + } + if(page.data["data-Saving Throws"]) { + var saves = jsonparse(page.data["data-Saving Throws"]); + _.each(saves, function(value) { + update[value.toLowerCase() + "_save_prof"] = "(@{pb})"; + }); + } + if(page.data["Spellcasting Ability"] && page.data["Spellcasting Ability"] !== "") { + update["spellcasting_ability"] = "+@{" + page.data["Spellcasting Ability"].toLowerCase() + "}"; + } + if(page.data["data-Global Damage"]) { + var dmgmod = jsonparse(page.data["data-Global Damage"]); + var id = generateRowID(); + update["repeating_damagemod_" + id + "_global_damage_rollstring"] = `${dmgmod["Uses"]}[${dmgmod["Name"]}]`; + update["repeating_damagemod_" + id + "_global_damage_active_flag"] = "1"; + update["repeating_damagemod_" + id + "_options-flag"] = "0"; + update["repeating_damagemod_" + id + "_global_damage_type"] = dmgmod["Name"]; + update["global_damage_mod_flag"] = "1"; + } + if(page.data["data-Actions"]) { + var actionsobj = {}; + jsonparse(page.data["data-Actions"]).forEach(function(val) { actionsobj[val.Name] = val; }); + + _.each(actionsobj, function(action, name) { + newrowid = generateRowID(); + update["repeating_attack_" + newrowid + "_options-flag"] = "0"; + update["repeating_attack_" + newrowid + "_atkname"] = name; + if(action["Desc"]) { + update["repeating_attack_" + newrowid + "_atk_desc"] = action["Desc"]; + } + + if(action["Type Attack"]) { + update["repeating_attack_" + newrowid + "_attack_flag"] = "on"; + update["repeating_attack_" + newrowid + "_atkflag"] = "{{attack=1}}"; + update["repeating_attack_" + newrowid + "_attack_options"] = "{{attack=1}}"; + if(action["Type"]) { + update["repeating_attack_" + newrowid + "_attack_type"] = action["Type"]; + } + if(action["Reach"]) { update["repeating_attack_" + newrowid + "_atkrange"] = action["Reach"]; } + + if(action["Damage"]) { update["repeating_attack_" + newrowid + "_dmgbase"] = action["Damage"]; } + if(action["Damage Type"]) { update["repeating_attack_" + newrowid + "_dmgtype"] = action["Damage Type"]; } + if (action["Modifier"]) { + update["repeating_attack_" + newrowid + "_dmgattr"] = modStringToAttrib(action["Modifier"]); + update["repeating_attack_" + newrowid + "_atkattr_base"] = modStringToAttrib(action["Modifier"]); + } + + + if(action["Damage 2"] && action["Damage 2 Type"]) { + update["repeating_attack_" + newrowid + "_dmg2flag"] = "{{damage=1}} {{dmg2flag=1}}"; + update["repeating_attack_" + newrowid + "_atk_dmg2base"] = action["Damage 2"]; + update["repeating_attack_" + newrowid + "_attack_damagetype2"] = action["Damage 2 Type"]; + if (action["Modifier 2"]) { + update["repeating_attack_" + newrowid + "_dmg2attr"] = modStringToAttrib(action["Modifier 2"]); + } + } + } + }); + } + if(page.data["data-Resources"]) { + var resources = jsonparse(page.data["data-Resources"]); + var resource_count = 0; + var numUses = function(uses_string) { + var attribs = ["strength", "dexterity", "constitution", "wisdom", "intelligence", "charisma"]; + uses_string = uses_string.toLowerCase(); + _.each(attribs, function(attrib) { + var attribMod = Math.floor((parseInt(currentData[attrib + "_base"]) - 10) / 2); + if (attribMod < 0) attribMod = 0; + uses_string = uses_string.replace(attrib, attribMod); + }); + var terms = uses_string.split("+"); + var total = 0; + _.each(terms, function(term) { + total += parseInt(term); + }); + return total; + }; + _.each(resources, function(value) { + if (resource_count == 0) { + update["class_resource_name"] = value["Name"]; + var uses = numUses(value["Uses"]); + update["class_resource"] = uses; + update["class_resource_max"] = uses; + resource_count++; + } else if (resource_count == 1) { + update["other_resource_name"] = value["Name"]; + var uses = numUses(value["Uses"]); + update["other_resource"] = uses; + update["other_resource_max"] = uses; + resource_count++; + } + }); + } + + if(!looped) { + callbacks.push(update_class); + } + } + if(category === "Subclasses") { + if(page.name && page.name !== "") { update["subclass"] = page.name; } + if(page.data["data-HP per level"] && page.data["data-HP per level"] !== "") { + var id = generateRowID(); + update["repeating_hpmod_" + id + "_mod"] = page.data["data-HP per level"]; + update["repeating_hpmod_" + id + "_source"] = page.name ? page.name : "Subclass"; + } + if(page.data["data-Traits"]) { + var traits = jsonparse(page.data["data-Traits"]); + _.each(traits, function(value) { + var id = generateRowID(); + update["repeating_traits_" + id + "_name"] = value["Name"]; + update["repeating_traits_" + id + "_description"] = value["Desc"]; + update["repeating_traits_" + id + "_source"] = "Class"; + update["repeating_traits_" + id + "_source_type"] = page.name ? page.name : ""; + update["repeating_traits_" + id + "_options-flag"] = "0"; + update["repeating_traits_" + id + "_display_flag"] = "on"; + }); + } + if(!looped) { + callbacks.push(update_class); + } + } + if(category === "Races" || category === "Subraces") { + update["tab"] = "core"; + if(category === "Races") { + update["race"] = page.name; + if (page.name == "Halfling") { + update["halflingluck_flag"] = "1"; + } + } + else { + update["subrace"] = page.name; + }; + if(page.data["Speed"]) {update["speed"] = page.data["Speed"]}; + if(page.data["Size"]) {update["size"] = page.data["Size"]}; + + if(page.data["data-Traits"]) { + var trait_array = jsonparse(page.data["data-Traits"]); + if(trait_array && trait_array.length) { + _.each(trait_array, function(trait) { + newrowid = generateRowID(); + update["repeating_traits_" + newrowid + "_name"] = trait["Name"]; + update["repeating_traits_" + newrowid + "_description"] = trait["Desc"]; + update["repeating_traits_" + newrowid + "_source"] = "Racial"; + update["repeating_traits_" + newrowid + "_source_type"] = page.name; + update["repeating_traits_" + newrowid + "_options-flag"] = 0; + update["repeating_traits_" + newrowid + "_display_flag"] = "on"; + }); + }; + }; + + if(page.data["data-Actions"]) { + var actionsobj = {}; + jsonparse(page.data["data-Actions"]).forEach(function(val) { actionsobj[val.Name] = val; }); + + _.each(actionsobj, function(action, name) { + newrowid = generateRowID(); + update["repeating_attack_" + newrowid + "_options-flag"] = "0"; + update["repeating_attack_" + newrowid + "_atkname"] = name; + if(action["Desc"]) { + update["repeating_attack_" + newrowid + "_atk_desc"] = action["Desc"]; + } + + if(action["Type Attack"]) { + if (action["Type"] == "Spell") { + update["repeating_attack_" + newrowid + "_atkflag"] = "0"; + update["repeating_attack_" + newrowid + "_attack_options"] = ""; + update["repeating_attack_" + newrowid + "_saveflag"] = "{{save=1}} {{saveattr=@{saveattr}}} {{savedesc=@{saveeffect}}} {{savedc=[[[[@{savedc}]][SAVE]]]}}" + } else { + update["repeating_attack_" + newrowid + "_attack_flag"] = "on"; + update["repeating_attack_" + newrowid + "_atkflag"] = "{{attack=1}}"; + update["repeating_attack_" + newrowid + "_attack_options"] = "{{attack=1}}"; + } + if(action["Reach"]) { update["repeating_attack_" + newrowid + "_atkrange"] = action["Reach"]; } + + if(action["Damage"]) { update["repeating_attack_" + newrowid + "_dmgbase"] = action["Damage"]; } + if(action["Damage Type"]) { update["repeating_attack_" + newrowid + "_dmgtype"] = action["Damage Type"]; } + if (action["Modifier"]) { + update["repeating_attack_" + newrowid + "_dmgattr"] = modStringToAttrib(action["Modifier"]); + update["repeating_attack_" + newrowid + "_atkattr_base"] = modStringToAttrib(action["Modifier"]); + } else { + update["repeating_attack_" + newrowid + "_dmgattr"] = "0"; + } + if (action["Save"]) { update["repeating_attack_" + newrowid + "_saveattr"] = action["Save"] } + if (action["Save DC"]) { update["repeating_attack_" + newrowid + "_savedc"] = "(" + modStringToAttrib(action["Save DC"]) + "+8+@{pb})" } + if (action["Save Effect"]) { update["repeating_attack_" + newrowid + "_saveeffect"] = action["Save Effect"] } + + if(action["Damage 2"] && action["Damage 2 Type"]) { + update["repeating_attack_" + newrowid + "_dmg2flag"] = "{{damage=1}} {{dmg2flag=1}}"; + update["repeating_attack_" + newrowid + "_atk_dmg2base"] = action["Damage 2"]; + update["repeating_attack_" + newrowid + "_attack_damagetype2"] = action["Damage 2 Type"]; + if (action["Modifier 2"]) { + update["repeating_attack_" + newrowid + "_dmg2attr"] = modStringToAttrib(action["Modifier 2"]); + } else { + update["repeating_attack_" + newrowid + "_dmgattr"] = "0"; + } + } + } + }); + } + if(!looped) { + callbacks.push(update_race_display); + } + } + if(category === "Backgrounds") { + update["tab"] = "core"; + if(page.name && page.name !== "") { update["background"] = page.name; } + if(page.data["data-Feature Name"]) { + var id = generateRowID(); + update["repeating_traits_" + id + "_name"] = page.data["data-Feature Name"]; + update["repeating_traits_" + id + "_description"] = page.data["data-Feature Description"] || ""; + update["repeating_traits_" + id + "_source"] = "Background"; + update["repeating_traits_" + id + "_source_type"] = page.name ? page.name : ""; + update["repeating_traits_" + id + "_options-flag"] = "0"; + update["repeating_traits_" + id + "_display_flag"] = "on"; + } + if(page.data["data-Traits"]) { + var traits = jsonparse(page.data["data-Traits"]); + _.each(traits, function(value) { + var id = generateRowID(); + update["repeating_traits_" + id + "_name"] = value["Name"]; + update["repeating_traits_" + id + "_description"] = value["Desc"]; + update["repeating_traits_" + id + "_source"] = "Background"; + update["repeating_traits_" + id + "_source_type"] = page.name ? page.name : ""; + update["repeating_traits_" + id + "_options-flag"] = "0"; + update["repeating_traits_" + id + "_display_flag"] = "on"; + }); + } + } + //This one is just a catch-all for proficiencies, as they are formated the same regardless of the category + if(["Races", "Subraces", "Classes", "Subclasses", "Backgrounds"].indexOf(category) != -1) { + if(page.data["data-Skill Proficiency"]) { + var skill_array = jsonparse(page.data["data-Skill Proficiency"]); + if(skill_array["Proficiencies"] && skill_array["Proficiencies"].length) { + _.each(skill_array["Proficiencies"], function(prof) { + var skill_string = prof.toLowerCase().replace(/ /g, '_'); + update[skill_string + "_prof"] = "(@{pb}*@{" + skill_string + "_type})"; + }); + }; + }; + if(page.data["data-Language Proficiency"] || page.data["data-Weapon Proficiency"] || page.data["data-Armor Proficiency"] || page.data["data-Tool Proficiency"]) { + if(page.data["data-Language Proficiency"]) { + var lang_array = jsonparse(page.data["data-Language Proficiency"]); + if(lang_array["Proficiencies"] && lang_array["Proficiencies"].length) { + _.each(lang_array["Proficiencies"], function(prof) { + if( prof_names.indexOf(prof.toLowerCase()) == -1 ) { + newrowid = generateRowID(); + update["repeating_proficiencies_" + newrowid + "_prof_type"] = "LANGUAGE"; + update["repeating_proficiencies_" + newrowid + "_name"] = prof; + update["repeating_proficiencies_" + newrowid + "_options-flag"] = 0; + prof_names.push(prof.toLowerCase()); + } + }); + } + }; + if(page.data["data-Weapon Proficiency"]) { + var weap_array = jsonparse(page.data["data-Weapon Proficiency"]); + if(weap_array["Proficiencies"] && weap_array["Proficiencies"].length) { + _.each(weap_array["Proficiencies"], function(prof) { + if( prof_names.indexOf(prof.toLowerCase()) == -1 ) { + newrowid = generateRowID(); + update["repeating_proficiencies_" + newrowid + "_prof_type"] = "WEAPON"; + update["repeating_proficiencies_" + newrowid + "_name"] = prof; + update["repeating_proficiencies_" + newrowid + "_options-flag"] = 0; + prof_names.push(prof.toLowerCase()); + } + }); + } + }; + if(page.data["data-Armor Proficiency"]) { + var armor_array = jsonparse(page.data["data-Armor Proficiency"]); + if(armor_array["Proficiencies"] && armor_array["Proficiencies"].length) { + _.each(armor_array["Proficiencies"], function(prof) { + if( prof_names.indexOf(prof.toLowerCase()) == -1 ) { + newrowid = generateRowID(); + update["repeating_proficiencies_" + newrowid + "_prof_type"] = "ARMOR"; + update["repeating_proficiencies_" + newrowid + "_name"] = prof; + update["repeating_proficiencies_" + newrowid + "_options-flag"] = 0; + prof_names.push(prof.toLowerCase()); + } + }); + } + }; + if(page.data["data-Tool Proficiency"]) { + var tool_array = jsonparse(page.data["data-Tool Proficiency"]); + if(tool_array["Proficiencies"] && tool_array["Proficiencies"].length) { + _.each(tool_array["Proficiencies"], function(prof) { + if( prof_names.indexOf(prof.toLowerCase()) == -1 ) { + newrowid = generateRowID(); + update["repeating_tool_" + newrowid + "_toolname"] = prof; + update["repeating_tool_" + newrowid + "_toolattr_base"] = "?{Attribute?|Strength,@{strength_mod}|Dexterity,@{dexterity_mod}|Constitution,@{constitution_mod}|Intelligence,@{intelligence_mod}|Wisdom,@{wisdom_mod}|Charisma,@{charisma_mod}}"; + update["repeating_tool_" + newrowid + "_options-flag"] = 0; + prof_names.push(prof.toLowerCase()); + callbacks.push( function() {update_tool(newrowid);} ); + } + }); + } + }; + } + } + + return { + update: update, + prof_names: prof_names, + callbacks: callbacks + }; }; var check_itemmodifiers = function(modifiers, previousValue) { @@ -8516,8 +8344,7 @@ "repeating_spell-" + lvl + "_" + spellid + "_spell_damage_progression", "repeating_spell-" + lvl + "_" + spellid + "_innate", "repeating_spell-" + lvl + "_" + spellid + "_spell_ability", - "spellcasting_ability", - "character_id"], function(v) { + "spellcasting_ability"], function(v) { var update = {}; var description = ""; var spellAbility = v["repeating_spell-" + lvl + "_" + spellid + "_spell_ability"] != "spell" ? v["repeating_spell-" + lvl + "_" + spellid + "_spell_ability"].slice(0, -1) : "spell"; @@ -8527,8 +8354,6 @@ update["repeating_attack_" + attackid + "_options-flag"] = "0"; update["repeating_attack_" + attackid + "_spellid"] = spellid; update["repeating_attack_" + attackid + "_spelllevel"] = lvl; - } else { - update["repeating_spell-" + lvl + "_" + spellid + "_rollcontent"] = "%{" + v["character_id"] + "|repeating_attack_" + attackid + "_attack}"; } if(v["repeating_spell-" + lvl + "_" + spellid + "_spell_ability"] == "spell") { @@ -9948,7 +9773,7 @@ var update = {}; var xp = 0; var pb = 0; - switch(v.npc_challenge) { + switch(v.npc_challenge.toString()) { case "0": xp = "10"; pb = 2; @@ -10897,6 +10722,8 @@ on("mancerfinish:l1-mancer", function(eventinfo) { var noEquipmentDrop = false; + var startTime = Date.now(); + var allPageData = []; if(eventinfo.data["l1-equipment"]) { noEquipmentDrop = eventinfo.data["l1-equipment"].values["equipment_type"] == "gold"; } @@ -11099,51 +10926,94 @@ return {abilities: allAbilities, proficiencies: allProficiencies, expertise: _.uniq(currentExpertise), hp: hitpoints} }; var doAllDrops = function(dropArray, callback) { - var thisPage = dropArray.shift(); - var pageName = thisPage; - var additionalData = {}; - if(typeof thisPage == "object") { - pageName = thisPage.name; - additionalData = thisPage.data || {}; - } + getAttrs(["character_id"], function(v) { + _.each(stats.abilities.totals, function(scores, name) { + v[name + "_base"] = scores.total; + v[name + "_mod"] = scores.mod; + }); + v.base_level = "1"; + v.npc = "0"; + var update = {}; + var callbacks = []; + var profNames = []; + var totalDrops = dropArray.length; + var x = 0; + callbacks.push(update_class); + callbacks.push(update_race_display); - getCompendiumPage(pageName, function(pageData) { - pageName = pageName.indexOf("@@!!@@") > -1 ? pageName.replace(/@@!!@@/g,"") : pageName; // Hacky bugfix to prevent custom names from matching unavailable content - currentDrop++; - if(typeof pageData == "string") { - console.log("Creating custom drop for " + pageName); - pageData = {name: pageName.split(":")[1], content: "", data: {Category: pageName.split(":")[0], Source: "Charactermancer"}}; - }; - setCharmancerText({"mancer_category": pageData.data.Category, "mancer_progress":"Applying change " + currentDrop + " out of " + totalDrops}); - pageData.data = _.extend(pageData.data, additionalData); - if(pageData.data["data-Equipment"]) { - var json = JSON.parse(pageData.data["data-Equipment"]); - var newItems = makeItemData(json.default); - console.log("ADDING ADDITIONAL ITEMS:"); - totalDrops += newItems.length; - dropArray = dropArray.concat(newItems); - } - if(pageData.data["data-Starting Gold"] && !noEquipmentDrop) { - set["gp"] += parseInt(pageData.data["data-Starting Gold"]); - } - if(pageData.data["data-Bundle"]) { - var json = JSON.parse(pageData.data["data-Bundle"]); - var newItems = makeItemData(json); - console.log("ADDING ADDITIONAL ITEMS (FROM BUNDLE):"); - totalDrops += newItems.length - dropArray = dropArray.concat(newItems); - doAllDrops(dropArray, callback); - } else { - dropCompendiumData("licensecontainer", pageData, function(data) { - console.log("Dropped " + pageName); - if(dropArray.length > 0) { - doAllDrops(dropArray, callback); - } else { - callback(); - } + _.each(dropArray, function(page) { + var dropUpdate = processDrop(page, v, profNames, true); + callbacks = callbacks.concat(dropUpdate.callbacks); + profNames = _.uniq(profNames.concat(dropUpdate.prof_names)); + update = _.extend(dropUpdate.update, update); + x++; + setCharmancerText({"mancer_progress" :'
'}); + }); + + callbacks.push( function() {update_ac();} ); + callbacks.push( function() {update_weight();} ); + callbacks.push(callback); + setAttrs(update, {silent: true}, function() { + setCharmancerText({"mancer_progress" :'
'}); + _.each(callbacks, function(callback) { + callback(); }); + }); + }); + }; + var getAllPages = function(pageArray, callback) { + var getNames = []; + _.each(pageArray, function(page){ + if(page.name) { + getNames.push(page.name); + } else { + getNames.push(page); } }); + getCompendiumPage(getNames, function(data) { + var nextGet = []; + _.each(data, function(page, index) { + if(pageArray[index].data) { + page.data = _.extend(page.data, pageArray[index].data); + } + if(!page.id) page.data.Source = "Charactermancer"; + page.name = page.name.replace(/@@!!@@/g,""); // Hacky bugfix to prevent custom names from matching unavailable content + if(page.data["data-Equipment"]) { + console.log("ADDING ADDITIONAL ITEMS:"); + var json = {}; + try { + json = JSON.parse(page.data["data-Equipment"]); + } catch(e) { + json = page.data["data-Equipment"]; + } + var newItems = makeItemData(json.default); + nextGet = nextGet.concat(newItems); + } + if(page.data["data-Bundle"]) { + console.log("ADDING ADDITIONAL ITEMS (FROM BUNDLE):"); + var json = {}; + try { + json = JSON.parse(page.data["data-Bundle"]); + } catch(e) { + json = page.data["data-Bundle"]; + } + var newItems = makeItemData(json); + nextGet = nextGet.concat(newItems); + } + if(page.data["data-Starting Gold"] && !noEquipmentDrop) { + set["gp"] += parseInt(page.data["data-Starting Gold"]); + } + allPageData.push(page); + }); + + if(nextGet.length > 0) { + console.log("DOING ANOTHER GET!!"); + getAllPages(nextGet, callback); + } else { + callback(); + } + + }); }; var makeItemData = function(items) { if (noEquipmentDrop) { @@ -11187,7 +11057,7 @@ } }); - } + }; var data = eventinfo.data; var stats = getMancerStats(data); var spells = getMancerSpells(data); @@ -11460,8 +11330,10 @@ var profdata = {name: "Proficiencies:" + prof, data: {Type: proftype}} if(stats.expertise.indexOf(prof) != -1) { profdata.data["toolbonus_base"] = "(@{pb}*2)"; + allDrops.unshift(profdata); + } else { + allDrops.push(profdata); } - allDrops.push(profdata); }); }); //add custom proficiencies @@ -11546,20 +11418,27 @@ //erase all repeating sections eraseRepeating(eraseSections, function() { + setCharmancerText({"mancer_progress" :'
'}); //first set is silent to prevent unwanted sheet workers setAttrs(silentset, {silent:true}, function() { + setCharmancerText({"mancer_progress" :'
'}); //reset remaining attributes, and set ability scores/custom info setAttrs(clearset, function() { - doAllDrops(allDrops, function() { - console.log("DOING THE FINAL SET!!"); - setAttrs(set, function() { - update_skills(allSkills); - update_attacks("all"); - organize_section_proficiencies(); - if(set["cust_classname"]) { - update_class(); - } - finishCharactermancer(); + setCharmancerText({"mancer_progress" :'
'}); + getAllPages(allDrops, function() { + setCharmancerText({"mancer_progress" :'
'}); + doAllDrops(allPageData, function() { + console.log("DOING THE FINAL SET!!"); + setAttrs(set, function() { + setCharmancerText({"mancer_progress" :'
'}); + organize_section_proficiencies(); + update_skills(allSkills); + update_attacks("all"); + var endTime = Date.now(); + console.log("Elapsed time: "); + console.log((endTime-startTime)/1000); + finishCharactermancer(); + }); }); }); }); @@ -12722,20 +12601,25 @@

Select your choices:

- +

Select your choices:

- + +

+
+
+

+ We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:

Select your choices:

Available Points:   - +

@@ -13132,24 +13016,36 @@

+

+ +

+

+ +

+

+ +

+

+ +

@@ -13175,15 +13071,27 @@

+

+ +

+

+ +

+

+ +

+

+ +

@@ -13730,31 +13638,55 @@

Race

+
+ Return to: + +

Class

+
+ Return to: + +

Abilities

+
+ Return to: + +

Background

+
+ Return to: + +

Equipment

+
+ Return to: + +

Spells

+
+ Return to: + +

Feats

@@ -13782,11 +13714,8 @@

Building your character...

-
-

Adding your

-
-
-

+
+
@@ -15064,7 +14993,7 @@ if (data["l1-abilities"].values.abilities == "Roll for Stats") { showChoices(["abilities_rollstats"]); if (data["l1-abilities"].values.roll_results && data["l1-abilities"].values.roll_results.length) { - showChoices(["abilities_selects"]); + showChoices(["abilities_rollstats_rolled","abilities_selects"]); var roll_results = typeof data["l1-abilities"].values.roll_results == "string" ? data["l1-abilities"].values.roll_results.split(",") : data["l1-abilities"].values.roll_results; _.each(attribs, function(attrib) { setCharmancerOptions(attrib, roll_results); @@ -15141,7 +15070,7 @@ setCharmancerOptions(attrib, results); }); setAttrs({roll_results: results, strength: "", dexterity: "", constitution: "", intelligence: "", wisdom: "", charisma: ""}); - showChoices(["abilities_selects"]); + showChoices(["abilities_rollstats_rolled","abilities_selects"]); }); on("clicked:clearstats", function(eventinfo) { @@ -15400,11 +15329,16 @@ if(num === "default") { update[type + "_equipment"] = feature.join(", "); } else { + var dynamic_items = "Category:None"; var static_items = []; var hasDouble = false; var doubleOffset = 4; - + var equipmentTitle = cleanEquipment(feature).replace(/^\w/, function(char) { return char.toUpperCase(); }).replace(/(^\(|\)$)/g, ""); + if (equipmentTitle.search("Two of") == 0) { + equipmentTitle += ")"; + } + update[type + "_equipment_choice" + num + "_title"] = equipmentTitle; _.each(feature, function(f) { if(f.indexOf("Subtype:") > -1) { dynamic_items = 'Category:Items "Item Rarity":Standard ' + f.split("~")[0]; @@ -15446,6 +15380,10 @@ update_attr["class_equipment_choice2"] = ""; update_attr["class_equipment_choice3"] = ""; update_attr["class_equipment_choice4"] = ""; + update_attr["class_equipment_choice5"] = ""; + update_attr["class_equipment_choice6"] = ""; + update_attr["class_equipment_choice7"] = ""; + update_attr["class_equipment_choice8"] = ""; }; if(class_string == "custom") { @@ -15800,7 +15738,7 @@ if(type == "ability") { type = 'ability score increase' } - warnings += '

You\'re ' + sectionName; + warnings += '

Your ' + sectionName; if(type == "expertise") { warnings += " gives you expertise in "; warnings += number[0] > 1 ? 'up to ' + number[0] + ' skills' : " a skill"; @@ -15833,6 +15771,7 @@ set["race_info"] += '

You have not selected a subrace!

'; } ready = false; + showChoices(["race_button"]); } } _.each(spelldata.errors.race, function(error) { @@ -15856,6 +15795,7 @@ set["race_info"] = '

You have not selected a race!

'; } ready = false; + showChoices(["race_button"]); } if(mancerdata["l1-class"] && classname) { @@ -15897,6 +15837,7 @@ set["class_info"] += '

You have not selected a ' + mancerdata["l1-class"].data.class["Subclass Name"] + '!

'; } ready = false; + showChoices(["class_button"]); } } _.each(spelldata.errors.class, function(error) { @@ -15904,10 +15845,12 @@ case "custom_class_spell_list": set["race_info"] += '

You have selected a spellcasting ability for your custom class, but you have not selected a spell list.

'; ready = false; + showChoices(["class_button"]); break; case "custom_class_spell_number": set["race_info"] += '

You have selected a spellcasting ability for your custom class, but you have not selected a number of spells.

'; ready = false; + showChoices(["class_button"]); break; default: console.log("Unknown class spell error: " + error); @@ -15920,6 +15863,7 @@ set["class_info"] = '

You have not selected a class!

'; } ready = false; + showChoices(["class_button"]); } if(mancerdata["l1-abilities"] && mancerdata["l1-abilities"].values.abilities) { @@ -15943,12 +15887,14 @@ x++; set["ability_info"] += '

You have not selected a score for your ' + ability.toLowerCase() + '!

'; ready = false; + showChoices(["abilities_button"]); } }); if(x == 6) set["ability_info"] = '

You have not selected your ability scores!

'; } else { set["ability_info"] = '

You have not generated your ability scores!

'; ready = false; + showChoices(["abilities_button"]); } if(mancerdata["l1-background"] && bgname) { @@ -15977,6 +15923,7 @@ } else { set["background_info"] = '

You have not selected a background!

'; ready = false; + showChoices(["background_button"]); } if(mancerdata["l1-equipment"] && mancerdata["l1-equipment"].values["equipment_type"]) { @@ -16017,10 +15964,12 @@ if(mancerdata["l1-equipment"].values["equipment_class"] != getName("class", mancerdata, true) || (mancerdata["l1-equipment"].values["equipment_background"] != getName("background", mancerdata, true) && mancerdata["l1-equipment"].values["equipment_type"] != "gold")) { set["equipment_info"] = '

Your equipment options have changed, you\'ll need to choose again.

'; ready = false; + showChoices(["equipment_button"]); } } else { set["equipment_info"] = '

You have not selected any equipment!

'; ready = false; + showChoices(["equipment_button"]); } var spellsready = true; @@ -16057,7 +16006,8 @@ } } else if((raceSpells + classSpells) > 0) { set["spell_info"] = '

You haven\'t selected your spells!

'; - spellsready = false + spellsready = false; + showChoices(["spells_button"]); } else { set["spell_info"] = '

The arcane is a mystery to you.

'; spellsready = false @@ -16120,4 +16070,4 @@ }); }); - + \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translation.json b/5th Edition OGL by Roll20/translation.json index 96686e64d4..8f3df7549a 100644 --- a/5th Edition OGL by Roll20/translation.json +++ b/5th Edition OGL by Roll20/translation.json @@ -583,5 +583,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } diff --git a/5th Edition OGL by Roll20/translations/af.json b/5th Edition OGL by Roll20/translations/af.json index 88f2a03a95..ec7a0a042e 100644 --- a/5th Edition OGL by Roll20/translations/af.json +++ b/5th Edition OGL by Roll20/translations/af.json @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/cs.json b/5th Edition OGL by Roll20/translations/cs.json index 45276ac3cb..9fb9712847 100644 --- a/5th Edition OGL by Roll20/translations/cs.json +++ b/5th Edition OGL by Roll20/translations/cs.json @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/da.json b/5th Edition OGL by Roll20/translations/da.json index aa29e13ae7..2d63d20960 100644 --- a/5th Edition OGL by Roll20/translations/da.json +++ b/5th Edition OGL by Roll20/translations/da.json @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/de.json b/5th Edition OGL by Roll20/translations/de.json index 93ac9f07a8..f31ac6df1c 100644 --- a/5th Edition OGL by Roll20/translations/de.json +++ b/5th Edition OGL by Roll20/translations/de.json @@ -7,7 +7,7 @@ "armor-class-u": "Rüstungsklasse", "class-u": "Klasse", "type-u": "Typ", - "abilities-u": "ABILITIES", + "abilities-u": "ATTRIBUTE", "npc-armor-place": "Schuppenpanzer", "hit-points-u": "Trefferpunkte", "formula-u": "Formel", @@ -91,7 +91,7 @@ "ac": "Rüstungsklasse", "hp": "Trefferpunkte", "speed": "Geschwindigkeit", - "language-proficiencies": "Language Proficiencies:", + "language-proficiencies": "Sprachfertigkeiten:", "skill-proficiencies": "Skill Proficiencies:", "weapon-proficiencies": "Weapon Proficiencies", "armor-proficiencies": "Armor Proficiencies:", @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/el.json b/5th Edition OGL by Roll20/translations/el.json index aa29e13ae7..2d63d20960 100644 --- a/5th Edition OGL by Roll20/translations/el.json +++ b/5th Edition OGL by Roll20/translations/el.json @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/en.json b/5th Edition OGL by Roll20/translations/en.json index aa29e13ae7..2d63d20960 100644 --- a/5th Edition OGL by Roll20/translations/en.json +++ b/5th Edition OGL by Roll20/translations/en.json @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/es.json b/5th Edition OGL by Roll20/translations/es.json index d37a802098..ef83939e46 100644 --- a/5th Edition OGL by Roll20/translations/es.json +++ b/5th Edition OGL by Roll20/translations/es.json @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/fr.json b/5th Edition OGL by Roll20/translations/fr.json index a27f97e2aa..8ff1e7c71f 100644 --- a/5th Edition OGL by Roll20/translations/fr.json +++ b/5th Edition OGL by Roll20/translations/fr.json @@ -7,7 +7,7 @@ "armor-class-u": "CLASSE D'ARMURE", "class-u": "CLASSE", "type-u": "TYPE", - "abilities-u": "ABILITIES", + "abilities-u": "CARACTÉRISTIQUES", "npc-armor-place": "armure d'écailles", "hit-points-u": "POINTS DE VIE", "formula-u": "FORMULE", @@ -91,8 +91,8 @@ "ac": "Classe d'armure", "hp": "Points de vie", "speed": "Vitesse", - "language-proficiencies": "Language Proficiencies:", - "skill-proficiencies": "Skill Proficiencies:", + "language-proficiencies": "Maîtrises des languages :", + "skill-proficiencies": "Maîtrises des compétences :", "weapon-proficiencies": "Maîtrises des Armes", "armor-proficiencies": "Maîtrises des Armures :", "saving-throw": "Jets de sauvegarde", @@ -207,8 +207,8 @@ "core-u": "FICHE", "bio-u": "BIO", "spells-u": "SORTS", - "feats-u": "FEATS", - "review-u": "REVIEW", + "feats-u": "DONS", + "review-u": "VÉRIFICATION", "char-name-u": "NOM DU PERSONNAGE", "barbarian": "Barbare", "bard": "Barde", @@ -227,7 +227,7 @@ "background": "Historique", "race-u": "RACE", "alignment-u": "ALIGNEMENT", - "alignment": "Alignment:", + "alignment": "Alignement:", "exp-pts-u": "PX", "inspiration-u": "INSPIRATION", "prof-bonus-u": "BONUS DE MAÎTRISE", @@ -286,13 +286,13 @@ "failures-u": "ÉCHECS", "death-save-u": "SVG CONTRE LA MORT", "death-saves-u": "SVG CONTRE LA MORT", - "exhaustion-setting-u": "SHOW EXHAUSTION TRACKING:", + "exhaustion-setting-u": "Voir niveaux d'épuisement:", "exhaustion-u": "NIVEAU D'ÉPUISEMENT", "exhaustion-0": "Aucun effet", "exhaustion-1": "Désavantage aux jets de compétences", "exhaustion-2": "Vitesse réduite de motié", - "exhaustion-3": "Disadvantage on attack rolls and saving throws", - "exhaustion-4": "Hit point maximum halved", + "exhaustion-3": "Désavantage aux jets d’attaque et de sauvegarde", + "exhaustion-4": "Points de vie maximums diminués de moitié", "exhaustion-5": "Vitesse réduite à 0", "exhaustion-6": "Mort", "atk-u": "ATT", @@ -344,7 +344,7 @@ "feats-traits-u": "CAPACITÉS & TRAITS", "age-u": "ÂGE", "size-u": "TAILLE", - "size": "Size", + "size": "Taille", "height-u": "HAUTEUR", "weight-u": "POIDS", "eye-u": "YEUX", @@ -375,10 +375,10 @@ "arcane-fighter-u": "Guerrier lanceur de sorts", "arcane-rogue-u": "Roublard lanceur de sorts", "class-options-u": "OPTIONS DE CLASSE ()", - "class:-u": "CLASS:", - "subclass:-u": "SUBCLASS:", + "class:-u": "CLASSE:", + "subclass:-u": "SOUS-CLASSE:", "race:-u": "RACE:", - "subrace:-u": "SUBRACE:", + "subrace:-u": "SOUS-RACE:", "2nd-class:-u": "2e CLASSE :", "lvl:-u": "NIVEAU :", "3rd-class:-u": "3e CLASSE :", @@ -524,63 +524,65 @@ "accepting-drop-u": "PEUT RECEVOIR UN GLISSER-DÉPOSER DU COMPENDIUM", "are_you_sure": "Êtes-vous sûr de vouloir transformer ce personnage en ", "yes": "Oui", - "next": "Next", + "next": "Suivant", "cancel": "Annuler", - "cancel-u": "CANCEL", + "cancel-u": "ANNULER", "choose": "Choisir", "innate:-u": "INNÉ :", - "mod:-u": "MOD:", - "hpmods:-u": "HP MODIFIERS:", - "charmancer-welcome": "Welcome to the Charactermancer!", - "charmancer-what-is": "The Charactermancer is a step-by-step process that makes building a character simple and streamlined. Changes are saved as you progress, but the character sheet is only updated when the Charactermancer has been completed.", - "get-started": "Get started by clicking Next.", - "opt-out-u": "OPT OUT", - "charmancer-compendium": "Your Compendium Awaits.", - "charmancer-compendium-detail": "The Charactermancer currently supports Dungeons & Dragons 5th Edition SRD and the Player's Handbook. You can add the Player's Handbook to your compendium in the Marketplace, or the game owner can share their compendium with everyone in the game.", - "charmancer-choose-race": "Choose a Race:", - "charmancer-custom-race-name": "Custom Race Name:", - "suggested-abilities": "Suggested Abilities: ", - "class-spellcasting": "Class Spellcasting Ability: ", - "ability-score-increase": "Ability Score Increase:", - "lawful-good": "Lawful Good", - "neutral-good": "Neutral Good", - "chaotic-good": "Chaotic Good", - "lawful-neutral": "Lawful Neutral", - "neutral": "Neutral", - "chaotic-neutral": "Chaotic Neutral", - "lawful-evil": "Lawful Evil", - "neutral-evil": "Neutral Evil", - "chaotic-evil": "Chaotic Evil", - "tiny": "Tiny", - "small": "Small", - "medium": "Medium", - "large": "Large", - "huge": "Huge", - "age": "Age:", - "gargantuan": "Gargantuan", - "step1-equipment": "Step 5: Equipment", - "equipment-from-background": "Equipment from Background", - "equipment-from-class": "Equipment from Class", - "class-equipment": "Class Equipment", - "starting-wealth": "Starting Wealth (PHB)", - "starting-gold:": "Starting Gold:", - "no_class_warning-u": "NO CLASS HAS BEEN SELECTED OR SELECTED CLASS DOES NOT HAVE STANDARD EQUIPMENT. CLASS EQUIPMENT CANNOT BE CHOSEN AT THIS TIME.", - "standard-array": "Standard Array", - "roll-for-stats": "Roll for Stats", - "standard-roll": "Roll 4d6, drop lowest", - "charmancer-cancel-heading": "Where would you like to go, traveler?", - "continue-charmancer": "Continue Charactermancer", - "save_progress_and_exit": "Save and Exit", - "cancel_charactermancer": "Discard and exit", + "mod:-u": "MOD :", + "hpmods:-u": "MODIFICATEURS DE PV :", + "charmancer-welcome": "Bienvenue au Charactermancer !", + "charmancer-what-is": "Le Charactermancer est outil qui permet la création pas à pas d'un personnage, de manière simple et intuitive. Vos modifications sont enregistrées à chaque étape, mais le résultat est uniquement mis à jour dans une fiche de personnage lorsque le Charactermancer est terminé.", + "get-started": "Pour commencer, cliquer sur Suivant.", + "opt-out-u": "QUITTER", + "charmancer-compendium": "Votre Compendium vous attend.", + "charmancer-compendium-detail": "Le Charactermancer est compatible avec le SRD Dungeons & Dragons 5e Édition et le Player's Handbook. Vous pouvez ajouter le Player's Handbook à votre Compendium depuis la Boutique, ou le créateur de la partie peut partager son Compendium avec tous les joueurs.", + "charmancer-choose-race": "Choisir une race :", + "charmancer-custom-race-name": "Nom de race personalisée :", + "suggested-abilities": "Caractéristiques recommandées :", + "class-spellcasting": "Caractéristique de lancement de Sorts :", + "ability-score-increase": "Bonus de Caractéristique :", + "lawful-good": "Loyal Bon", + "neutral-good": "Neutre Bon", + "chaotic-good": "Chaotique Bon", + "lawful-neutral": "Loyal Neutre", + "neutral": "Neutre", + "chaotic-neutral": "Chaotique Neutre", + "lawful-evil": "Loyal Mauvais", + "neutral-evil": "Neutre Mauvais", + "chaotic-evil": "Chaotique Mauvais", + "tiny": "Très Petite", + "small": "Petite", + "medium": "Moyenne", + "large": "Grande", + "huge": "Très Grande", + "age": "Âge :", + "gargantuan": "Gigantesque", + "step1-equipment": "Étape 5 : équipement", + "equipment-from-background": "Équipement de l'Historique", + "equipment-from-class": "Équipement de Classe", + "class-equipment": "Équipement de Classe", + "starting-wealth": "Richesse de départ (PHB)", + "starting-gold:": "Or de départ :", + "no_class_warning-u": "AUCUNE CLASSE N’A ÉTÉ SÉLECTIONNÉE OU LA CLASSE SÉLECTIONNÉE N’A PAS D’ÉQUIPEMENT STANDARD. LE MATÉRIEL DE CLASSE NE PEUT PAS ÊTRE CHOISI POUR L'INSTANT.", + "standard-array": "Distribution Standard", + "roll-for-stats": "Jets de dés", + "standard-roll": "Jeter 4d6, ignorer le faibe", + "charmancer-cancel-heading": "Où vous souhaitez aller, voyageur ?", + "continue-charmancer": "Continuer le Charactermancer", + "save_progress_and_exit": "Enregistrer et Quitter", + "cancel_charactermancer": "Annuler et Quitter", "charmancer-discard-warning": "Discard and Exit will cause all choices to be lost.", - "mancer-opts-u": "CHARACTERMANCER OPTIONS", - "relaunch-lvl1mancer-u": "LAUNCH LEVEL 1 CHARACTERMANCER (CANNOT BE UNDONE)", - "point-buy": "Point Buy", - "available-points:": "Available Points: ", - "equipment-choice-text": "How would you like to choose your equipment?", - "charmancer-start": "Start", - "clear-abilities": "Clear Assignment", - "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", - "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "mancer-opts-u": "OPTIONS DU CHARACTERMANCER", + "relaunch-lvl1mancer-u": "DÉMARRER LE CHARACTERMANCER NIVEAU 1 (NE PEUT ÊTRE ANNULÉ)", + "point-buy": "Achat de Points", + "available-points:": "Points disponibles :", + "equipment-choice-text": "Comment voulez vous choisir votre équipement ?", + "charmancer-start": "Commencer", + "clear-abilities": "Tout effacer", + "use-charactermancer-for-new:-u": "UTILISER LE CHARACTERMANCER NIVEAU 1 POUR LES NOUVEAUX PERSONNAGES :", + "use-charactermancer-for-new-info": "Lorsque cette option est activée, tous les nouveaux personnages commenceront avec le Charactermancer niveau 1 de Roll20. Désactiver cette option ouvrira directement la fiche de personnage. Le Charactermancer pourra tout de même être lancer manuellement depuis l'onglet Paramètres de la fiche de personnage.", + "feat-pre-check": "Attention ! Les prérequis ne sont pas vérifiés automatiquement.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/he.json b/5th Edition OGL by Roll20/translations/he.json index aa29e13ae7..2d63d20960 100644 --- a/5th Edition OGL by Roll20/translations/he.json +++ b/5th Edition OGL by Roll20/translations/he.json @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/it.json b/5th Edition OGL by Roll20/translations/it.json index 0975673ac2..caf5328d5c 100644 --- a/5th Edition OGL by Roll20/translations/it.json +++ b/5th Edition OGL by Roll20/translations/it.json @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/ja.json b/5th Edition OGL by Roll20/translations/ja.json index aa29e13ae7..2d63d20960 100644 --- a/5th Edition OGL by Roll20/translations/ja.json +++ b/5th Edition OGL by Roll20/translations/ja.json @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/ko.json b/5th Edition OGL by Roll20/translations/ko.json index 52d4c20455..cb59294f92 100644 --- a/5th Edition OGL by Roll20/translations/ko.json +++ b/5th Edition OGL by Roll20/translations/ko.json @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/nl.json b/5th Edition OGL by Roll20/translations/nl.json index aa29e13ae7..2d63d20960 100644 --- a/5th Edition OGL by Roll20/translations/nl.json +++ b/5th Edition OGL by Roll20/translations/nl.json @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/pt.json b/5th Edition OGL by Roll20/translations/pt.json index be7323b7bf..75a843113e 100644 --- a/5th Edition OGL by Roll20/translations/pt.json +++ b/5th Edition OGL by Roll20/translations/pt.json @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/ru.json b/5th Edition OGL by Roll20/translations/ru.json index d7cf626e23..7ca9174991 100644 --- a/5th Edition OGL by Roll20/translations/ru.json +++ b/5th Edition OGL by Roll20/translations/ru.json @@ -582,5 +582,7 @@ "clear-abilities": "Настройка Значений Характеристик", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/sv.json b/5th Edition OGL by Roll20/translations/sv.json index aa29e13ae7..2d63d20960 100644 --- a/5th Edition OGL by Roll20/translations/sv.json +++ b/5th Edition OGL by Roll20/translations/sv.json @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/tr.json b/5th Edition OGL by Roll20/translations/tr.json index aa29e13ae7..2d63d20960 100644 --- a/5th Edition OGL by Roll20/translations/tr.json +++ b/5th Edition OGL by Roll20/translations/tr.json @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "USE LEVEL 1 CHARACTERMANCER FOR NEW CHARACTERS:", "use-charactermancer-for-new-info": "With this option enabled all new characters will open with the Level 1 Roll20 Charactermancer. Disabling this option will start new characters directly on the character sheet disabling the Level 1 Charactermancer, which can still be manually run from the Settings tab of the character sheet.", - "feat-pre-check": "Look carefully! Prerequisites are not checked automatically." + "feat-pre-check": "Look carefully! Prerequisites are not checked automatically.", + "stats-rolled-hint": "We rolled your dice! Check the chat window to view your results in detail. Assign the results below to your preferred attributes:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/zh.json b/5th Edition OGL by Roll20/translations/zh.json index 2808ab64d4..c0f731c7bf 100644 --- a/5th Edition OGL by Roll20/translations/zh.json +++ b/5th Edition OGL by Roll20/translations/zh.json @@ -534,7 +534,7 @@ "charmancer-welcome": "歡迎來到 Charactermancer!", "charmancer-what-is": "Charactermancer是一個循序漸進的過程,可以讓創造角色變得簡單和流暢。更改會在您進行時即儲存,但角色卡只在Charactermancer完成時更新。", "get-started": "點擊下一步開始。", - "opt-out-u": "OPT OUT", + "opt-out-u": "選擇退出", "charmancer-compendium": "你的Compendium正在等著呢", "charmancer-compendium-detail": "The Charactermancer目前支持龍與地下城第5版SRD和玩家手冊。您可以在商城中將玩家手冊添加到compendium中,或者遊戲所有者可以與遊戲中的每個人分享他的compendium。", "charmancer-choose-race": "選擇種族:", @@ -582,5 +582,7 @@ "clear-abilities": "Clear Assignment", "use-charactermancer-for-new:-u": "新角色使用等級1的Charactermancer:", "use-charactermancer-for-new-info": "啟用此選項後,將使用等級1的Roll20 Charactermancer打開所有新角色。關閉此選項將直接在角色卡上開始新角色,仍然可以從角色卡的設定選項卡中手動執行等級1的Charactermancer。", - "feat-pre-check": "仔細地看! 不會自動檢查先決條件。" + "feat-pre-check": "仔細地看! 不會自動檢查先決條件。", + "stats-rolled-hint": "我們來幫您擲骰子! 請檢查聊天視窗來察看詳細結果。將結果分配到您的屬性:", + "return-to:": "Return to: " } \ No newline at end of file diff --git a/5th Edition OGL by Roll20/translations/zu.json b/5th Edition OGL by Roll20/translations/zu.json index a9982554a6..29a672ceea 100644 --- a/5th Edition OGL by Roll20/translations/zu.json +++ b/5th Edition OGL by Roll20/translations/zu.json @@ -582,5 +582,7 @@ "clear-abilities": "crwdns71431:0crwdne71431:0", "use-charactermancer-for-new:-u": "crwdns71725:0crwdne71725:0", "use-charactermancer-for-new-info": "crwdns71726:0crwdne71726:0", - "feat-pre-check": "crwdns71727:0crwdne71727:0" + "feat-pre-check": "crwdns71727:0crwdne71727:0", + "stats-rolled-hint": "crwdns74783:0crwdne74783:0", + "return-to:": "crwdns74784:0crwdne74784:0" } \ No newline at end of file diff --git a/Agon/agon.css b/Agon/agon.css index cb62c828d4..4fdf8de1b8 100644 --- a/Agon/agon.css +++ b/Agon/agon.css @@ -1,99 +1,1325 @@ -label, span, li { font-family: serif; font-size: xx-small; font-size: 1.1vmin; text-transform: uppercase; padding: 0px; margin: 0px; line-height: 12px; } -label { margin-top: 5px; text-align: center; } -hr { margin: 10px 0px; color: #595959; background-color: #595959; height: 1.5px; border: none; } -input[type="text"], textarea { font-family: cursive; box-shadow: none; border: 1px solid #595959; padding: 4px; margin: 0px; width: 180px; } -input[type="text"] { padding: 4px; height: 28px; } -textarea { resize: none; padding-left: 5px; margin: 0px; width: 170px; height: 36px; } +html, body, div, span, h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, em, img, strong, sub, sup, b, i, dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, figure, figcaption, footer, header, hgroup, +menu, nav, output, section, time { + margin: 0; + padding: 0; + border: 0; + vertical-align: baseline; +} + + +label, +span, +li { + font-family: serif; + /* font-size: xx-small;*/ + font-size: 1.1em; + text-transform: uppercase; + padding: 0px; + margin: 0px; + line-height: 14px; +} + +label { + margin-top: 5px; + text-align: center; +} + +hr { + margin: 10px 0px; + color: #595959; + background-color: #595959; + height: 1.5px; + border: none; +} + +input[type="text"], +textarea { + font-family: cursive; + box-shadow: none; + border: 1px solid #595959; + padding: 4px; + margin: 0px; + width: 180px; +} + +input[type="text"] { + padding: 4px; + height: 28px; +} + +input[type="number"] { + font-family: cursive; + box-shadow: none; + border: 1px solid #595959; + margin: 0px; + padding: 4px; + height: 32px; + width: 65px !important; + font-size: 1.4em; + font-weight: bold; + text-align: center; + color: black; + + +} +textarea { + resize: none; + padding-left: 5px; + margin: 0px; + width: 170px; + height: 36px; +} /* This is to remove the arrow of select element in IE */ -select::-ms-expand { display: none; } -select { -webkit-appearance: none; appearance: none; margin: 0px; line-height: 12px; padding: 0px 8px; text-align-last: center; } input[type="checkbox"] { box-shadow: none; color: white; background: white; } -.sheet-container { border: 1px solid #595959; background: white; min-height: 600px; } -.sheet-logo { width: 140px; margin: auto; } -.sheet-logo .sheet-mutate { filter: invert(100%) grayscale(100%); } +select::-ms-expand { + display: none; +} -div.sheet-wounds { text-align: left; } -div.sheet-wound.sheet-row { vertical-align: bottom; } -span.sheet-wound.sheet-value { font-size: 1.5em; font-weight: bold; } span.sheet-consequence { display: inline-block; width: 65%; height: 100%; text-align: left; margin-left: 15px; } +select { + -webkit-appearance: none; + appearance: none; + margin: 0px; + line-height: 12px; + padding: 0px 8px; + text-align-last: center; + +} -div.sheet-invasive { border-bottom: 1px solid #595959; margin-bottom: 5px; height: 5px;} -div.sheet-invasive label { text-align: center; position: relative; top: 0px; color: white; background: #595959; width: 20%; padding: 0px; margin: 0px; margin-left: auto; margin-right: auto; z-index: 2; line-height: 10px; } -div.sheet-invasive label.sheet-divine-favor { width: 70px; } -div.sheet-invasive label.sheet-advantage-dice { width: 75px; } +input[type="checkbox"], +input[type="radio"] { + box-shadow: none; + color: white; + background: white; +} -.sheet-column { width: 180px; padding 5px; margin-left: 5px; text-align: center; float: left; } -.sheet-column.sheet-narrow { width: 60px; } -.sheet-column.sheet-wide { width: 260px; } +input.sheet-toggle:not([value='pc'])~div.sheet-container-pc { + display:none; +} +input.sheet-toggle:not([value='npc'])~div.sheet-container-npc { + display:none; +} +input.sheet-toggle:not([value='minion'])~div.sheet-container-minion { + display:none; +} +input.sheet-toggle:not([value='gm'])~div.sheet-container-gm { + display:none; +} +select.sheet-type { + width:auto; + font-family: serif; + font-size: 1.1em; + font-weight:bold; + text-transform: uppercase; + padding: 0px; + margin: 0px; + border:none; + margin-top:5px; + height:14px; + color:black; +} -ul { padding: 0px; margin: 0px; } -li { list-style: none; } -.sheet-notes { border: 1px solid #595959; border-radius: 5px; margin: 5px; padding: 5px; } -.sheet-notes li { text-align: left; margin-left: 10px; text-indent: -10px } -.sheet-notes label { margin: 0px; text-align: center; font-size: .75em; } +div.sheet-spacer { + height: 4px; +} +.sheet-container-gm { + display: grid; + grid-template-columns: 460px 160px; + grid-template-rows: auto auto auto; +} +.sheet-gm-name { + grid-column: 1; + grid-row: 1; +} +.sheet-gm-rolls { + grid-column: 1; + grid-row: 2; + border: 1px solid black; + border-radius: 10px; + padding:5px; + padding-left:8px; +} +.sheet-gm-notes { + grid-column: 2; + grid-row: 2; +} +.sheet-container-npc { + display: grid; + grid-template-columns: 170px 85px 85px 155px; + grid-template-rows: 60px 135px 135px 135px 135px auto auto auto; +} +.sheet-container-minion { + display: grid; + grid-template-columns: 170px 85px 85px; + grid-template-rows: auto 63px auto auto auto auto; +} +.sheet-grid-upper { + display: grid; + grid-template-columns: 185px 215px 215px 70px 160px; + grid-template-rows: auto; +} +.sheet-grid-lower { + display: grid; + grid-template-columns: 185px 325px 185px 120px ; + grid-template-rows: auto; +} +.sheet-logo { + grid-column: 1; + grid-row: 1; +} +.sheet-name { + grid-column: 2; + grid-row: 1; +} +.sheet-lineage { + grid-column: 3; + grid-row: 1; +} +.sheet-name-die { + grid-column: 4; + grid-row: 1; +} +.sheet-switcher { + grid-column: 5; + grid-row: 1; +} +.sheet-grid1 { + grid-column: 1; + grid-row: 1; +} +.sheet-grid2 { + grid-column: 2; + grid-row: 1; +} +.sheet-grid3 { + grid-column: 3; + grid-row: 1; +} +.sheet-grid4 { + grid-column: 4; + grid-row: 1; +} -input.sheet-oathgiver { border: none; border-bottom: 1px solid #595959; border-radius: 0px; width: 136px; } -input[type="number"].sheet-oathcount { border: 1px solid #595959; width: 40px; } -input.sheet-advantage { border: none; border-bottom: 1px solid #595959; border-radius: 0px; width: 136px; } +.sheet-grid-container-pc { + grid-gap: 10px; +} -div.sheet-armor.sheet-checklist { text-align: left; line-height: 5px; margin-left: 10px; text-indent: -10px; } -div.sheet-armor.sheet-checklist div.sheet-row { margin-top: 2px; } -div.sheet-armor span { line-height: 7px; font-size: .5em; } +.sheet-npc-grid, +.sheet-minion-grid { + border: 1pt solid black; + text-align:center; + padding-bottom:5px; +} +.sheet-minion-name { + grid-column: 1; + grid-row: 1; + border-right:none; +} +.sheet-minion-type { + grid-column: 2; + grid-row: 1; + border-left: none; + border-right: none; +} +.sheet-minion-strife { + grid-column: 3; + grid-row: 1; + border-left: none; +} +.sheet-minion-abilities { + grid-column: 2 / 4; + grid-row: 2 / 4; +} +.sheet-minion-master { + grid-column: 1; + grid-row: 2; + border-bottom:none; +} +.sheet-minion-master-name { + grid-column: 1; + grid-row: 3; + border-top:none; +} +.sheet-minion-dice { + grid-column: 1 / 4; + grid-row: 4; +} -div.sheet-range { display: block; margin: 0px 10px; position: relative; top: -5px; } -div.sheet-range label { font-size: .5em; text-align: center; } -div.sheet-range input { width: 50px; height: 15px; line-height: 12px; font-size: .75em; } +.sheet-minion-weapons { + grid-column: 1 / 4; + grid-row: 5; +} +.sheet-minion-powers { + grid-column: 1 / 4; + grid-row: 6; +} -div.sheet-ability { display: inline-block; margin: 0px 5px; vertical-align: top; } -div.sheet-ability label { margin: 0px; padding: 0px; text-align: center; } - -div.sheet-element { display: inline-block; padding-bottom: 2px; margin: 0px 5px; vertical-align: top; } -div.sheet-element label { margin: 0px; padding: 0px; text-align: center; } -div.sheet-element label { font-size: .5em; text-align: center; vertical-align: middle; } -div.sheet-element input { width: 46px; } -div.sheet-element textarea { width: 85px; height: 60px; } +.sheet-npc-name { + grid-column: 1; + grid-row: 1; + border-right: none; +} +.sheet-npc-type { + grid-column: 2; + grid-row: 1; + border-left: none; + border-right: none; +} +.sheet-npc-strife { + grid-column: 3; + grid-row: 1; + border-left: none; +} +.sheet-npc-customrolls { + grid-column: 4; + grid-row: 1 / 6; +} +.sheet-npc-arete { + grid-column: 1; + grid-row: 2; +} +.sheet-npc-craft { + grid-column: 1; + grid-row: 3; +} +.sheet-npc-sport { + grid-column: 1; + grid-row: 4; +} +.sheet-npc-battle { + grid-column: 1; + grid-row: 5; +} +.sheet-npc-namearmorfavor { + grid-column: 2 / 4; + grid-row: 2; +} +.sheet-npc-wounds { + grid-column: 2 / 4; + grid-row: 3 / 6; +} +.sheet-npc-weapons { + grid-column: 1 / -1; + grid-row: 6; +} +.sheet-npc-powers { + grid-column: 1 / -1; + grid-row: 7; +} +.sheet-npc-notes { + grid-column: 1 / -1; + grid-row: 8; +} -.sheet-repeating-field { margin-top: 5px; } -.sheet-repeating-field label { text-align: center; } -.repcontrol { min-height: 27px; } -.repcontrol .btn { border: medium none; color: white !important; background: none; box-shadow: none; } -.repcontrol .btn:focus { outline: 0; } -.repcontrol .repcontrol_edit:after { content: '('; visibility: visible; font-family: pictos; background-color: #fff; border: 1px solid #595959; border-radius: 2px; font-size: 12px; height: 12px; width: 12px; padding: 2px 4px 2px 4px; color: #595959; } -.editmode ~ .repcontrol .repcontrol_edit:after { content: ')'; } -.repcontrol .repcontrol_add:before { content: '&'; visibility: visible; font-family: pictos; background-color: #fff; border: 1px solid #595959; border-radius: 2px; font-size: 12px; height: 12px; width: 12px; padding: 2px 4px 2px 4px; color: #595959; } -.repcontrol .repcontrol_edit:hover:after, .repcontrol .repcontrol_add:hover:before { background-color: #EFEFEF; } -.sheet-resources .repcontrol { margin-top: -10px; } -.itemcontrol { z-index: 10; } -.itemcontrol .repcontrol_del { font-size: 10px; margin-top: 3px; padding: 0px; height: 18px; width: 18px; } -.itemcontrol .repcontrol_move { font-size: 10px; margin-top: 3px; padding: 0px; height: 18px; width: 18px; } +.sheet-container-pc { + border: 1px solid #595959; + background: white; + /* min-height: 600px; */ + width: 850px; + +} -div.sheet-impairment { margin: auto; width: 45px; height: 30px; position: relative; } -select.sheet-die { position: relative; top: 0px; left: 0px; border: 1px solid #595959; width: 100%; height: 100%; border-radius: 0; } -select.sheet-die.sheet-advantage { border: 1px solid #595959; width: 40px; height: 25px;} +.sheet-column { + width: 180px; + margin-left: 5px; + padding-right:10px; + text-align: center; + /* float: left; */ +} +.sheet-column-slight { + width: 165px; +} +.sheet-name, +.sheet-lineage { + width: 210px; +} -.sheet-checkboxes { display: block; padding-top: 5px; } -label.sheet-checkbox { display: inline-block; position: relative; padding: 0px; margin: 0px 4px; cursor: pointer; font-size: .5em; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; height: 10px; width: 10px; } -label.sheet-checkbox.sheet-glory { margin: 0px 2px; } -label.sheet-checkbox.sheet-favor { margin: 0px 6px; } -label.sheet-checkbox.sheet-wound { width: 12px; height: 12px; vertical-align: bottom; margin: 3px 0px; padding: 3px; } -label.sheet-checkbox.sheet-small, span.sheet-checkbox.sheet-small { height: 5px; width: 5px; margin: 0px; margin-right: 1px; } -label.sheet-checkbox input[type="checkbox"] { position: absolute; top: 0px; left: 0px; width: 100%; opacity: 0; cursor: pointer; } -.sheet-checkbox input:checked ~ .sheet-checkmark { background-color: #595959; color: white; } -.sheet-checkbox input:checked ~ .sheet-checkmark:after { display: block; } -.sheet-checkmark:after { content: ""; position: absolute; display: none; } -.sheet-checkmark { position: absolute; top: 0; left: 0; height: 100%; width: 100%; border: 1px solid #595959; text-align: center; } +select.sheet-pc-name { + margin-top: 10px; + margin-bottom:3px; +} +label.sheet-lineage { + margin-top: 12px; + margin-bottom: 2px; +} +label.sheet-npc-name-die { + margin-top: 1px; +} -span.sheet-impairment.sheet-checkmark { width: 5px; height: 5px; border: 1px solid #595959; } -div.sheet-corner { position: absolute; height: 7px; width: 7px; } -div.sheet-corner.sheet-top { border-top: 1px solid white; border-bottom: 1px solid #595959; top: 0px; } -div.sheet-corner.sheet-bottom { border-top: 1px solid #595959; border-bottom: 1px solid white; bottom: 0px; } -div.sheet-corner.sheet-left { border-left: 1px solid white; border-right: 1px solid #595959; left: 0px; } -div.sheet-corner.sheet-right { border-left: 1px solid #595959; border-right: 1px solid white; right: 0px; } -label.sheet-checkbox.sheet-corner { position: absolute; height: 5px; width: 5px; } -label.sheet-checkbox.sheet-corner.sheet-top { top: -1px; } -label.sheet-checkbox.sheet-corner.sheet-bottom { bottom: 1px; } -label.sheet-checkbox.sheet-corner.sheet-left { left: -1px; } -label.sheet-checkbox.sheet-corner.sheet-right { right: 1px; } +div.sheet-element.sheet-npc-armor { + margin-top:-5px; +} +label.sheet-pc-name-die { + margin-top: 5px; + margin-bottom: 2px; +} +.sheet-name input, +.sheet-lineage input { + width: 210px; +} + +input.sheet-pc-name, +.sheet-lineage input { + font-size: 1.2em; + height:32px; +} + +.sheet-column.sheet-narrow { + width: 80px; + margin-left:0; +} + + +.sheet-column.sheet-wide { + width: 320px; +} + +.sheet-logo { + display: block; + margin-left: auto; + margin-right: auto; + width:95%; +} + +.sheet-logo .sheet-mutate { + filter: invert(100%) grayscale(100%); +} + +div.sheet-wounds { + text-align: center; + + display: grid; + grid-template-columns: 20px 20px 150px; + grid-template-rows: auto auto auto auto auto auto; + grid-auto-flow: row; + grid-gap:0px; +} + +div.sheet-wound.sheet-row { + vertical-align: bottom; +} + +div.sheet-value { + margin-top:-2px; + font-size: 1.5em; + font-weight: bold; +} + +span.sheet-consequence { + display: block; + /* + vertical-align: bottom; + width: 65%; + height: 100%; + margin-left: 15px; + */ + text-align: left; + margin-left: 10px; + margin-top:10px; + font-size:0.9em; +} +span.sheet-consequence.sheet-defeated { + margin-top:0px; +} + +div.sheet-invasive { + border-bottom: 1px solid #595959; + margin-bottom: 7px; + height: 7px; +} + +div.sheet-invasive label { + text-align: center; + position: relative; + top: 0px; + color: white; + background: black; + width: 25%; + padding: 0px; + margin: 0px; + margin-left: auto; + margin-right: auto; + z-index: 2; + line-height: 14px; + margin-top:7px; + font-size:0.8em; +} + +div.sheet-invasive label.sheet-divine-favor { + width: 120px; +} +div.sheet-invasive label.sheet-divine-favor { + width: 120px; +} +div.sheet-invasive.sheet-powers, +div.sheet-invasive.sheet-weapons { + width: 99%; +} +div.sheet-invasive.sheet-powers label { + width: 100px; +} + +div.sheet-invasive.sheet-combat, +div.sheet-npc-customrolls div.sheet-invasive { + width: 135px; + margin-left: 3px; +} +div.sheet-minion-dice div.sheet-invasive { + width: 320px; + margin-left: 10px +} +div.sheet-invasive label.sheet-minion-dice { + width: 100px; +} + +div.sheet-invasive label.sheet-combat { + width: 90px; +} + +div.sheet-invasive label.sheet-weapons { + width: 200px; +} + +div.sheet-invasive label.sheet-oaths { + width: 140px; +} +div.sheet-invasive label.sheet-stuff { + width: 100px; +} +div.sheet-invasive label.sheet-glory, +div.sheet-invasive label.sheet-quests, +div.sheet-invasive label.sheet-wounds, +div.sheet-invasive label.sheet-npc-notes { + width: 70px; +} + +ul { + padding: 0px; + margin: 0px; +} + +li { + list-style: none; +} + +.sheet-weaponhands { + width:140px; +} +textarea.sheet-hand { + width:125px; + height:30px; +} +div.sheet-customroller.sheet-dieroller button[type=roll] { + margin-top: 6px; + margin-bottom: 1px; + font-size:1.1em; +} +div.sheet-column div.sheet-customroller textarea.sheet-customroll { + text-align:left; + margin-left:5px; + width:125px; + height:30px; +} + +.sheet-notes { + border: 1px solid #595959; + border-radius: 5px; + margin: 5px; + margin-left: 0px; + padding: 5px; + font-size: 0.7em; + +} +div.sheet-notes { + width:125px; +} +.sheet-notes li { + text-align: left; + margin-left: 15px; + text-indent: -15px; + line-height: 12px; + +} + +.sheet-notes label { + margin: 0px; + text-align: center; + font-size: 1.2em; + line-height: 12px; +} + +input.sheet-oathgiver { + border: none; + border-bottom: 1px solid #595959; + border-radius: 0px; + width: 136px; +} + +input[type="number"].sheet-oathcount, +input[type="text"].sheet-oathcount { + border: 1px solid #595959; + width: 40px; + text-align:center; +} + +input.sheet-advantage { + border: none; + border-bottom: 1px solid #595959; + border-radius: 0px; + width: 126px; +} + +div.sheet-armor.sheet-checklist { + text-align: left; + line-height: 5px; + margin-left: 10px; + text-indent: -10px; +} + +div.sheet-armor.sheet-checklist div.sheet-row { + margin-top: 2px; +} + +div.sheet-armor span { + line-height: 10px; + font-size: 0.8em; +} + +div.sheet-range { + display: block; + margin: 0px 10px; + position: relative; + top: -5px; +} + +div.sheet-range label { + font-size: .5em; + text-align: center; +} + +div.sheet-range input { + width: 50px; + height: 15px; + line-height: 12px; + font-size: .75em; +} + +div.sheet-ability { + display: inline-block; + margin: 0px 5px; + vertical-align: top; +} + +div.sheet-ability label { + margin: 0px; + padding: 0px; + text-align: center; +} + +div.sheet-element { + display: inline-block; + padding-bottom: 2px; + margin: 0px 1px; + vertical-align: top; +} + +div.sheet-npc-grid button[type=roll], +div.sheet-minion-grid button[type=roll], +div.sheet-element button[type=roll], +div.sheet-dieroller button[type=roll] { + border:0; + background: none; + color:black; + font-weight: bold; + text-transform: uppercase; + font-family: serif; +} + +div.sheet-element label, +div.sheet-npc-grid button[type=roll], +div.sheet-minion-grid button[type=roll], +div.sheet-element button[type=roll], +div.sheet-dieroller button[type=roll] { + margin: 0px; + padding: 0px; + text-align: center; +} + +div.sheet-minion-grid button[type=roll].sheet-ability-roll.sheet-d6::before, +div.sheet-npc-grid button[type=roll].sheet-ability-roll.sheet-d6::before, +.sheet-ability-roll button[type=roll]::before, +.sheet-dieroller button[type=roll]::before, +.sheet-element button[type=roll]::before { + content: "" !important; + +} + +div.sheet-element label, +div.sheet-pc-weapons label, +div.sheet-element button[type=roll], +div.sheet-dieroller button[type=roll] { + font-size: 0.9em; + text-align: center; + vertical-align: middle; +} + +div.sheet-weaponhands button[type=roll] { + font-size: 1.1em; +} + +div.sheet-element input { + width: 60px; +} + +div.sheet-element textarea { + width: 85px; + height: 60px; +} + + +.sheet-repeating-field { + margin-top: 5px; +} + +.sheet-repeating-field label { + text-align: center; +} + +.repcontrol { + min-height: 27px; +} + +.repcontrol .btn { + border: medium none; + color: white !important; + background: none; + box-shadow: none; +} + +.repcontrol .btn:focus { + outline: 0; +} + +.repcontrol .repcontrol_edit:after { + content: '('; + visibility: visible; + font-family: pictos; + background-color: #fff; + border: 1px solid #595959; + border-radius: 2px; + font-size: 12px; + height: 12px; + width: 12px; + padding: 2px 4px 2px 4px; + color: #595959; +} + +.editmode~.repcontrol .repcontrol_edit:after { + content: ')'; +} + +.repcontrol .repcontrol_add:before { + content: '&'; + visibility: visible; + font-family: pictos; + background-color: #fff; + border: 1px solid #595959; + border-radius: 2px; + font-size: 12px; + height: 12px; + width: 12px; + padding: 2px 4px 2px 4px; + color: #595959; +} + +.repcontrol .repcontrol_edit:hover:after, +.repcontrol .repcontrol_add:hover:before { + background-color: #EFEFEF; +} + +.sheet-resources .repcontrol { + margin-top: -10px; +} + +.itemcontrol { + z-index: 10; +} + +.itemcontrol .repcontrol_del { + font-size: 10px; + margin-top: 3px; + padding: 0px; + height: 18px; + width: 18px; +} + +.itemcontrol .repcontrol_move { + font-size: 10px; + margin-top: 3px; + padding: 0px; + height: 18px; + width: 18px; +} + +div.sheet-impairment { + margin: auto; + width: 75px; + height: 40px; + position: relative; + +} + +select.sheet-die { + position: relative; + top: 0px; + left: 0px; + border: 1px solid #595959; + width: 100%; + height: 100%; + padding: 0px; + border-radius: 0; + font-size: 18px; + letter-spacing:-1px; + font-weight:bold; + color:black; +} + +select.sheet-die.sheet-advantage { + border: 1px solid #595959; + width: 50px; + height: 25px; +} + +.sheet-checkboxes { + display: block; + padding-top: 5px; +} + +label.sheet-checkbox { + display: inline-block; + position: relative; + padding: 0px; + margin: 0px 2px; + cursor: pointer; + font-size: 1em; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + height: 14px; + width: 14px; +} + +label.sheet-checkbox.sheet-glory { + margin: 0px 1px; + width: 12px; + height: 14px; +} + +label.sheet-checkbox.sheet-favor { + margin: 0px 4px; +} + + +div.sheet-favor.sheet-row { + padding-top: 5px; +} + +label.sheet-checkbox.sheet-wound { + width: 12px; + height: 12px; + vertical-align: bottom; + margin: 3px 0px; + padding: 3px; +} + +label.sheet-checkbox.sheet-small, +span.sheet-checkbox.sheet-small { + height: 5px; + width: 5px; + margin: 0px; + margin-right: 1px; +} + +label.sheet-checkbox input[type="checkbox"], +label.sheet-checkbox input[type="radio"] { + position: absolute; + top: 0px; + left: 0px; + width: 100%; + opacity: 0; + cursor: pointer; +} + +.sheet-checkbox input:checked~.sheet-checkmark { + background-color: #595959; + color: white; +} + +.sheet-checkbox input:checked~.sheet-checkmark:after { + display: block; +} + +.sheet-checkmark:after { + content: ""; + position: absolute; + display: none; +} + +.sheet-checkmark { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + border: 1px solid #595959; + text-align: center; +} + +span.sheet-impairment.sheet-checkmark { + width: 10px; + height: 10px; + border: 1px solid #595959; +} + +div.sheet-corner { + position: absolute; + height: 12px; + width: 12px; +} + +div.sheet-corner.sheet-top { + border-top: 1px solid white; + border-bottom: 1px solid #595959; + top: 0px; +} + +div.sheet-corner.sheet-bottom { + border-top: 1px solid #595959; + border-bottom: 1px solid white; + bottom: 0px; +} + +div.sheet-corner.sheet-left { + border-left: 1px solid white; + border-right: 1px solid #595959; + left: 0px; +} + +div.sheet-corner.sheet-right { + border-left: 1px solid #595959; + border-right: 1px solid white; + right: 0px; +} + +label.sheet-checkbox.sheet-corner { + position: absolute; + height: 10px; + width: 10px; +} + +label.sheet-checkbox.sheet-corner.sheet-top { + top: -1px; +} + +label.sheet-checkbox.sheet-corner.sheet-bottom { + bottom: 1px; +} + +label.sheet-checkbox.sheet-corner.sheet-left { + left: -1px; +} + +label.sheet-checkbox.sheet-corner.sheet-right { + right: 1px; +} + +div.sheet-npc-wound { + text-align:center; + margin-top:5px; +} +div.sheet-npc-favor { + text-align:center; + margin-top:5px; +} + +input.sheet-npc-wound { + display:inline-block; + width: 130px; + height: 24px; + +} +label.sheet-npc-wound.sheet-wound { + height:14px; + width:14px; +} +div.sheet-npc-wound label.sheet-npc-wound { + font-size: 1.5em; + color:black; + font-weight:bold; + +} +span.sheet-npc-wound { + font-size: .8em; +} +input.sheet-weapons.sheet-details { + width: 220px; +} +input.sheet-minion.sheet-name { + width: 140px; + margin-top: 3px; + height:32px; + font-size:1.2em; +} +input[type="number"].sheet-die { + font-family: cursive; + box-shadow: none; + border: 1px solid #595959; + margin: 0px; + padding: 1px; + height: 20px; + width: 36px !important; + font-size: 0.8em; + font-weight: bold; +} +.sheet-die-grid { + display: grid; + grid-template-columns: 20px 36px 20px 36px; + grid-gap: 0px 2px; + + width:118px; + border: 1px solid #595959; + border-radius: 5px; + margin: 5px; + padding: 5px; + margin-left:15px; + margin-bottom: 0px; + /* grid-auto-flow: column; */ +} +label.sheet-die { + + font-size:0.9em; + text-align:right; +} +div.sheet-column.sheet-dieroller { + width: 150px; +} +.sheet-pc-weapons { + display:inline-block; +} +input.sheet-pc-weapons { + height: 20px; + margin-bottom:2px; +} +label.sheet-pc-weapons.sheet-weapon-name, +input.sheet-pc-weapons.sheet-weapon-name { + width:90px; +} +label.sheet-pc-weapons.sheet-weapon-dice, +input.sheet-pc-weapons.sheet-weapon-dice { + width:80px; + text-align:center; +} +label.sheet-pc-weapons.sheet-weapon-range, +input.sheet-pc-weapons.sheet-weapon-range { + width:50px; + text-align:center; +} +label.sheet-pc-weapons.sheet-weapon-notes, +input.sheet-pc-weapons.sheet-weapon-notes { + width:120px; +} +div.sheet-armor label.sheet-armor { + margin-top: 5px; +} +div.sheet-armor { + width: 75px; +} +div.sheet-armor.sheet-checklist { + width:80px; +} +div.sheet-pc-weapons textarea.sheet-specialitems { + width: 280px; +} +div.sheet-grid1 textarea.sheet-stuff, +div.sheet-pc-weapons textarea.sheet-specialitems { + height: 45px; + resize:vertical; +} +span.sheet-strong { + font-weight:bold; +} + +div.sheet-dieroller label.sheet-bonus-dice { + margin-bottom: 7px; +} +span.sheet-diesize { + + text-transform:lowercase; + font-size:2em; +} +div.sheet-dieroller button[type="roll"].sheet-d10 { + font-size:1.3em; + margin-top:-5px; +} + +span.sheet-d4 { + font-family: 'dicefontd4'; +} +span.sheet-d6 { + font-family: 'dicefontd6'; +} +span.sheet-d8 { + font-family: 'dicefontd8'; +} +span.sheet-d10 { + font-family: 'dicefontd10'; +} +span.sheet-d12 { + font-family: 'dicefontd12'; +} +.sheet-advances { + display:inline-block; +} +input[type="number"].sheet-advances { + width:80px !important; + height:28px; + padding:4px; +} +label.sheet-advances { + width:80px; + font-size:0.9em; +} +input.sheet-npc-wound-temp { + width:105px; +} +input.sheet-minion-number { + height:40px; +} +div.sheet-gm-rolls label.sheet-roll-label { + display:inline-block; + width: 60px; + margin-bottom: 2px; +} +div.sheet-gm-rolls label.sheet-roll-name { + width: 120px; +} +div.sheet-gm-rolls label.sheet-roll-dice { + width: 100px; +} +div.sheet-gm-rolls input.sheet-roll-name { + width: 120px; + margin-bottom:3px; +} +div.sheet-gm-rolls input.sheet-roll-dice { + width: 100px; + margin-bottom:3px; +} +div.sheet-gm-rolls input.sheet-roll-bonuses { + width: 60px; + margin-bottom:3px; +} +div.sheet-gm-rolls input.sheet-roll-notes { + width: 440px; + margin-bottom:5px; + font-size:0.9em; + height:20px; +} +div.sheet-gm-rolls button[type="roll"].sheet-d6 { + font-size:1.2em; +} +div.sheet-column div.sheet-customroller button[type="roll"].sheet-ability-roll, +div.sheet-column div.sheet-customroller textarea.sheet-customroll.sheet-npc-customroll { + margin-left: -10px; +} +div.sheet-npc-wound input.sheet-npc-favour { + height:28px; +} +div.sheet-npc-customrolls textarea.sheet-npc-notes { + resize:vertical; + margin-left: -10px; + width: 125px; + height: 100px; +} +span.sheet-stretch { + display:inline-block; + -webkit-transform:scale(.8,1.2); /* Safari and Chrome */ + -moz-transform:scale(.8,1.2); /* Firefox */ + -ms-transform:scale(.8,1.2); /* IE 9 */ + -o-transform:scale(.8,1.2); /* Opera */ + transform:scale(.8,1.2); /* W3C */ +} +input.sheet-version { + display:none; +} +div.sheet-npc-grid textarea, +div.sheet-npc-grid div.sheet-column.sheet-dieroller textarea.sheet-npc-customroll.sheet-npc-customroll { + height:15px; +} +div.sheet-minion-name div.sheet-name, +div.sheet-npc-name div.sheet-name { + width: 160px; +} +div.sheet-minion-name input.sheet-character-name, +div.sheet-npc-name input.sheet-character-name { + width: 150px; +} +div.sheet-minion-type div.sheet-column, +div.sheet-npc-type div.sheet-column { + width: 80px; +} +.sheet-strife { + width:auto; +} + +div.sheet-minion-type select.sheet-creature-type, +div.sheet-npc-type select.sheet-creature-type { + width:80px; + height:28px; + margin-left:-10px; + text-align-last:center; +} +div.sheet-minion-type label.sheet-creature-type, +div.sheet-npc-type label.sheet-creature-type, +div.sheet-npc-strife label.sheet-strife, +div.sheet-minion-strife label.sheet-strife { + margin-top:7px; + margin-bottom:3px; +} +div.sheet-npc-strife input.sheet-strife, +div.sheet-minion-strife input.sheet-strife { + height: 28px; + font-size:1.2em; +} +div.sheet-minion-type label.sheet-creature-type, +div.sheet-npc-type label.sheet-creature-type { + margin-left:-10px; +} +div.sheet-minion-dice div.sheet-weaponhands { + width: 110px +} +div.sheet-minion-dice div.sheet-weaponhands textarea { + width: 100px; + height: 35px; +} +div.sheet-minion-dice div.sheet-weaponhands.sheet-bonusdice { + width: 80px +} +div.sheet-minion-dice div.sheet-weaponhands.sheet-bonusdice label { + font-size:1.1em; + margin-top:5px; +} + +div.sheet-npc-powers.sheet-npc-grid select, +div.sheet-npc-weapons.sheet-npc-grid select, +div.sheet-minion-powers.sheet-minion-grid select, +div.sheet-minion-weapons.sheet-minion-grid select, +select.sheet-creature-type { + font-family:cursive; + width: 70px; + padding:0; + margin: 0px; + text-align-last: left; + box-shadow: none; + border: 1px solid #595959; + height:24px; +} +div.sheet-npc-powers.sheet-npc-grid input.sheet-dice, +div.sheet-minion-powers.sheet-minion-grid input.sheet-dice { + width: 60px; + text-align:center; +} +div.sheet-npc-weapons.sheet-npc-grid input.sheet-dice, +div.sheet-minion-weapons.sheet-minion-grid input.sheet-dice { + width: 90px; + text-align:center; +} +div.sheet-npc-powers.sheet-npc-grid input, +div.sheet-npc-weapons.sheet-npc-grid input, +div.sheet-minion-powers.sheet-minion-grid input, +div.sheet-minion-weapons.sheet-minion-grid input { + margin-top: -5px; + height: 24px; + /* margin-bottom: 5px; */ +} +div.sheet-npc-grid input.sheet-weapons.sheet-details, +input.sheet-powers.sheet-details, +div.sheet-minion-grid input.sheet-weapons.sheet-details, +div.sheet-minion-grid input.sheet-powers.sheet-details { + width: 190px; +} + +div.sheet-npc-grid input.sheet-weapons.sheet-name, +input.sheet-powers.sheet-name { + width: 110px; +} +div.sheet-minion-grid input.sheet-weapons.sheet-name, +div.sheet-minion-grid input.sheet-powers.sheet-name { + width: 150px; +} +div.sheet-npc-powers label.sheet-npc-power, +div.sheet-npc-weapons label.sheet-npc-weapon, +div.sheet-minion-powers label.sheet-npc-power, +div.sheet-minion-weapons label.sheet-npc-weapon { + display:inline-block; + text-align:left; + margin-left:5px; + font-size:0.9em; +} +div.sheet-npc-powers label.sheet-power-name, +div.sheet-npc-weapons label.sheet-weapon-name { + width: 105px; +} +div.sheet-minion-powers label.sheet-power-name, +div.sheet-minion-weapons label.sheet-weapon-name { + width: 155px; +} +div.sheet-npc-powers label.sheet-power-details, +div.sheet-minion-powers label.sheet-power-details { + width: 185px; +} +div.sheet-npc-powers label.sheet-power-ability, +div.sheet-minion-powers label.sheet-power-ability { + width: 72px; +} +div.sheet-npc-weapons label.sheet-weapon-ability, +div.sheet-minion-weapons label.sheet-weapon-ability { + width: 82px; +} +div.sheet-npc-weapons label.sheet-weapon-details, +div.sheet-minion-weapons label.sheet-weapon-details { + width: 195px; +} + +div.sheet-npc-powers label.sheet-power-dice, +div.sheet-npc-weapons label.sheet-weapon-dice, +div.sheet-minion-powers label.sheet-power-dice, +div.sheet-minion-weapons label.sheet-weapon-dice { + width: 40px; +} +div.sheet-npc-weapons, +div.sheet-npc-powers, +label.sheet-npc-weapons, +label.sheet-npc-powers, +div.sheet-minion-weapons, +div.sheet-minion-powers, +label.sheet-minion-weapons, +label.sheet-minion-powers { + text-align:left; + padding-left: 5px; + +} +input.sheet-weapons, +input.sheet-powers { + margin-top: 5px; +} +div.sheet-npc-grid.sheet-npc-notes { + display: none; +} diff --git a/Agon/agon.html b/Agon/agon.html index c435abc12a..0f12697c64 100644 --- a/Agon/agon.html +++ b/Agon/agon.html @@ -1,1361 +1,3175 @@ -
-
- -
- -
-
-
- - - - - - - - -
-
- - - - - - - - -
-
-
- -
    -
  • 1: Open-end die
  • -
  • 1: +1d6 for 1 roll
  • -
  • 2: Re-roll one die
  • -
  • 2: Attack again
  • -
  • 2: move hero 1 range
  • -
  • 2: no dmg pen for 1 ex
  • -
  • 3: +1d8 for 1 roll
  • -
  • 4: Re-roll any/all dice
  • -
  • 5: divine weapon
  • -
-
-
- -
    -
  • 1: avoid wounds from 1 attack
  • -
  • 1: Remove 4 impair levels
  • -
  • 1: Completed quest
  • -
  • 1: defeated
  • -
  • 1: Challenge a god
  • -
-
-
- -
    -
  • Completed quest: 1 divine favor
  • -
  • Win contest: 1 glory
  • -
  • highest hero roll: 1-7 glory
  • -
  • defeat minion: 1 glory
  • -
  • defeat NPC: glory = highest wound done
  • -
-
-
-
-
- - -
-
- - -
-
-
- -
-
- - -
-
-
-
- -
-
- - -
-
-
-
-
- - -
-
-
-
- - -
-
-
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
-
-
- -
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
-
- -
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
-
- -
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
-
- -
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
-
-
- - -
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
- - -
-
- - -
-
-
-
- - - - -
-
-
-
- - Helmet
- (-1 Missile) -
-
- - Breastplate
- (-1 Melee) -
-
- - Greaves
- (-1 Position) -
-
-
-
- - -
-
-
-
-
- -
-
-
- - - - - - - - -
-
- - - - - - - - -
-
-
- - -
-
- - -
-
-
- -
-
- - - - - - - -
-
- - - - - - - -
-
-
- -
-
-
- - - - - - - - - - -
-
-
- - -
-
- -
-
- - 1 - -1 to next roll -
-
- - 2 - -1 to next roll -
-
- - 3 - -2 to next roll -
-
- - 4 - -1 to all rolls -
-
- - 5 - -2 to all rolls -
-
- - 6 - -4 to all rolls (defeated) -
-
-
-
-
-
-
- Left Hand -
-
-
-
- Right Hand -
-
-
+ + + + + + + +
+
+ +
+
+
+ +
+ + + + +
+
+ + + + + +
+ +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+ +
+
+ + + + + + +
+
+ +
+
+ + +
+
+ + +
+
+ +
    +
  • 1: Open-end die
  • +
  • 1: +1d6 for 1 roll
  • +
  • 2: Re-roll one die
  • +
  • 2: Attack again
  • +
  • 2: move hero 1 range
  • +
  • 2: no dmg pen for 1 ex
  • +
  • 3: +1d8 for 1 roll
  • +
  • 4: Re-roll any/all dice
  • +
  • 5: divine weapon
  • +
+
+
+ +
    +
  • 1: avoid wounds from 1 attack
  • +
  • 1: Remove 4 impair levels
  • +
  • 1: Completed quest
  • +
  • 1: defeated
  • +
  • 1: Challenge a god
  • +
+
+
+ +
    +
  • Completed quest: 1 divine favor
  • +
  • Win contest: 1 glory
  • +
  • highest hero roll: 1-7 glory
  • +
  • defeat minion: 1 glory
  • +
  • defeat NPC: glory = highest wound
  • +
+
+
+
+ +
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+ + +
+
+ + +
+
+
+
+ +
+ + -1 to next roll +
+ + + +
+
+ + -1 to next roll +
+ + +
+
+ + -2 to next roll +
+ + +
+
+ + -1 to all rolls +
+ + +
+
+ + -2 to all rolls +
+ + +
+
+ + Defeated +
+ + +
+
+
+
+ +
+ + + + +
+ + + + +
+
+
+
+ +
+ + + + +
+ + + + + +
+
+
+
+ +
+ +
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+ + + +
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+
+ + +
+ +
+
+
+ +
+
+ + +
+
+ + +
+
+ + + + +
+ + +
+ +
+
+
+ +
+ + + +
+ + + +
+
+
+
+ +
+ + + +
+ + + + +
+
+ +
+
+
+ +
+ + + +
+
+ + +
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+ + + + + + + + +
+
+ + + + + + + + +
+
+
+ + +
+
+ + +
+
+
+ +
+
+ + +
+
+
+ +
+ +
+
+
+ +
+
+
+ + +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+ + + +
+
+ + + +
+
+
+
+
+ +
+ + + +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ + Helmet
+ (-1 Missile) +
+
+ + Breastplate
+ (-1 Melee) +
+
+ + Greaves
+ (-1 Position) +
+
+ + + Bonus
+ (+1 Armor) +
+
+ +
+
+
+
+ + +
+
+
+ +
+
+ +
+
+
+ + + + + + + + +
+
+ + + + + + + + +
+
+
+ + +
+
+ + +
+
+
+ +
+
+ + + + + + + +
+
+ + + + + + + +
+
+
+ +
+
+
+ + + + + + + + + + +
+
+
+ + + +
+ + +
+
+
+ +
+ +
+
+ +
+
1
+
+ -1 to next roll +
+
+ +
+
2
+
+ -1 to next roll +
+
+ +
+
3
+
+ -2 to next roll +
+
+ +
+
4
+
+ -1 to all rolls +
+
+ +
+
5
+
+ -2 to all rolls +
+
+ +
+
6
+
+ -4 to all rolls (defeated) +
+
+ +
+
*
+
+ Uncheck To Reset Temporary Penalties +
+
+
+
+ +
+
+ + + + + + +
+
+ +
+
+ + +
+
+ + +
+
+ +
    +
  • 1: Open-end die
  • +
  • 1: +1d6 for 1 roll
  • +
  • 2: Re-roll one die
  • +
  • 2: Attack again
  • +
  • 2: move hero 1 range
  • +
  • 2: no dmg pen for 1 ex
  • +
  • 3: +1d8 for 1 roll
  • +
  • 4: Re-roll any/all dice
  • +
  • 5: divine weapon
  • +
+
+
+ +
    +
  • 1: avoid wounds from 1 attack
  • +
  • 1: Remove 4 impair levels
  • +
  • 1: Completed quest
  • +
  • 1: defeated
  • +
  • 1: Challenge a god
  • +
+
+
+ +
    +
  • Completed quest: 1 divine favor
  • +
  • Win contest: 1 glory
  • +
  • highest hero roll: 1-7 glory
  • +
  • defeat minion: 1 glory
  • +
  • defeat NPC: glory = highest wound
  • +
+
+
+ +
+
+ + \ No newline at end of file diff --git a/Agon/agon.png b/Agon/agon.png index dbcb533ee2..165af96291 100644 Binary files a/Agon/agon.png and b/Agon/agon.png differ diff --git a/Agon/sheet.json b/Agon/sheet.json index 8f03c0a2ba..332f816f9c 100644 --- a/Agon/sheet.json +++ b/Agon/sheet.json @@ -1,8 +1,8 @@ { "html": "agon.html", "css": "agon.css", - "authors": "Tsolval (@Tsolval)", - "roll20userid": "1628415", + "authors": "Tsolval (@Tsolval), G-G-G", + "roll20userid": "1628415,157788", "preview": "agon.png", - "instructions": "This is a rough draft copy of a character sheet for John Harper's Agon Roll Playing Game (Agon-rpg.com). Current functionality is limited. Please feel free to contribute." -} + "instructions": "This sheet is for John Harper's Agon Role Playing Game (Agon-rpg.com). Recent updates inlude resizing many page elements, fixing some elements, and shifting column contents around to improve usablilty. Also added a number of features: \n* Added NPC and Minion sheets, as well as a GM sheet for saving quick rolls. (click \"PC NAME\" for dropdown). \n* Ability scores can now have a +1 or +2 bonus included. \n* An Ability Roller - the title of each Ability is a button to roll that Ability. This button automatically rolls the Ability, the Name Die, and asks for any other dice (enter a valid die string like 1d6+2 or 1d10+2d6). \n* A Custom Die Roller at top right: just enter a dice string (like \"1d8+1d6+2\") and click the title to roll. \n* A combat die roller - enter the dice in the Left Hand and Right hand boxes (e.g. 1d6+1d8+1d10+1) and click the title to roll them. \n* a Bonus Die roller, for open-ended rolls, and any simple 1d4, d6, d8, 10, or d12 rolls. \n* The Ability Roller buttons automatically include the Name Die, while the combat and custom die rollers do not. \n* When making an Ability roll, the die rolled will take Impairment levels into account. For custom and combat rolls, you'll need to enter the correct die size. \n* Wound Penalties are included in Ability and Combat rolls. Temporary wound modifiers (for Wounds 1-3) are applied; after making a roll, uncheck the \"Clear Temporary Penalties\" box to remove the penalty. \n* The Armor Die will be automatically calculated - just click the pieces worn (greaves, helmet, breastplate). Bonuses boxes are provided in case you gain armor better than standard. As with Abilities, Armor rolls take Impairment into account. \n* Finally, your Name Die is automatically calculated from Fate boxes. \n\n " +} \ No newline at end of file diff --git a/Anima-Beyond-Fantasy/translations/pt.json b/Anima-Beyond-Fantasy/translations/pt.json index 3bd6d3b7c1..8907180721 100644 --- a/Anima-Beyond-Fantasy/translations/pt.json +++ b/Anima-Beyond-Fantasy/translations/pt.json @@ -2,7 +2,7 @@ "0": "", "tab-general": "Geral", "tab-magic": "Magia", - "tab-psychic": "Psychic", + "tab-psychic": "Psíquico", "tab-ki": "Ki", "tab-armory": "Arsenal", "char-info": "Informação do Personagem", @@ -12,53 +12,53 @@ "char-weight": "Peso", "char-size": "Tamanho", "char-appearance": "Aparên.", - "race": "Race", - "class": "Class", - "age": "Age", - "level": "Level", - "development-points": "DP", - "presence": "Presence", - "xperience-points": "XP", - "level-next": "Next Level", - "resistances": "Resistances", - "type": "Type", - "physical-resistance": "Physical Resistance", - "physical-resistance-short": "PhR", - "disease-resistance": "Disease Resistance", - "disease-resistance-short": "DR", - "poison-resistance": "Poison Resistance", - "poison-resistance-short": "PsnR", - "magic-resistance": "Magic Resistance", - "magic-resistance-short": "MR", - "psychic-resistance": "Psychic Resistance", - "psychic-resistance-short": "PsyR", + "race": "Raça", + "class": "Classe", + "age": "Idade", + "level": "Nível", + "development-points": "PD", + "presence": "Presença", + "xperience-points": "EXP", + "level-next": "Próximo Nível", + "resistances": "Resistências", + "type": "Tipo", + "physical-resistance": "Resistência Física", + "physical-resistance-short": "RFC", + "disease-resistance": "Resistência a Doenças", + "disease-resistance-short": "RD", + "poison-resistance": "Resistência a Veneno", + "poison-resistance-short": "RV", + "magic-resistance": "Resistência Mágica", + "magic-resistance-short": "RM", + "psychic-resistance": "Resistência Psíquica", + "psychic-resistance-short": "RP", "all-action-modifier": "All Action Mod", - "characteristics": "Characteristics", - "ability": "Ability", - "magic-ability": "Magic Ability", - "agility": "Agility", + "characteristics": "Características", + "ability": "Habilidade", + "magic-ability": "Habilidade Mágica", + "agility": "Agilidade", "agility-short": "AGI", - "constitution": "Constitution", + "constitution": "Constituição", "constitution-short": "CON", "dexterity": "Dexterity", "dexterity-short": "DEX", - "strength": "Strength", - "strength-short": "STR", - "intelligence": "Intelligence", + "strength": "Força", + "strength-short": "FOR", + "intelligence": "Inteligência", "intelligence-short": "INT", - "perception": "Perception", + "perception": "Percepção", "perception-short": "PER", - "soul-power": "Power", + "soul-power": "Poder", "soul-power-short": "POW", - "willpower": "Willpower", + "willpower": "Desejo de Poder", "willpower-short": "WP", "opposed": "Opposed", "final-opposed": "Final Opp.", - "movement": "Movement", + "movement": "Movimento", "penalty-short": "Pen.", - "bonus": "Bonus", + "bonus": "Bônus", "full-movement": "Full", - "1/4-movement": "1/4 Move", + "1/4-movement": "1/4 de Movimento", "running-movement": "Running", "lifepoints-short": "LP", "base-value": "Base", @@ -67,13 +67,13 @@ "temporary-bonus": "Temp.", "final-value": "Final", "bought": "Bought", - "yes": "Yes", - "no": "No", - "description": "Description", - "fatigue": "Fatigue", - "system": "System", - "new": "New", - "old": "Old", + "yes": "Sim", + "no": "Não", + "description": "Descrição", + "fatigue": "Fadiga", + "system": "Sistema", + "new": "Novo", + "old": "Velho", "roll": "Roll", "roll-as": "as", "actual-value": "Actual", @@ -82,8 +82,8 @@ "block": "Block", "dodge": "Dodge", "initiative": "Initiative", - "armor": "Armor", - "weapon": "Weapon", + "armor": "Armadura", + "weapon": "Armas", "secondary-abilities": "Secondary Abilities", "secondary-penalty": "Secondary Abilities bordered in red are affected by armor penalties", "tab-athletics": "Athletics", @@ -99,10 +99,10 @@ "natural-ability-short": "N.A.", "acrobatics": "Acrobatics", "athleticism": "Athleticism", - "climb": "Climb", - "jump": "Jump", + "climb": "Subir", + "jump": "Pular", "ride": "Ride", - "swim": "Swim", + "swim": "Nadar", "etiquette": "Etiquette", "intimidate": "Intimidate", "leadership": "Leadership", @@ -135,12 +135,12 @@ "stealth": "Stealth", "theft": "Theft", "trap-lore": "Trap Lore", - "art": "Art", - "dance": "Dance", + "art": "Arte", + "dance": "Dançar", "forging": "Forging", - "music": "Music", + "music": "Música", "slight-of-hand": "Sl. of Hand", - "advantages": "Advantages", + "advantages": "Vantagens", "cost": "Cost", "disadvantages": "Disadvantages", "benefit": "Benefit", @@ -168,7 +168,7 @@ "innate-magic": "Innate Magic", "summoning-abilities": "Summoning Abilities", "summon-ritual": "Summon", - "control-ritual": "Control", + "control-ritual": "Controle", "bind-ritual": "Bind", "banish-ritual": "Banish", "ritual": "Ritual", diff --git a/Ars_Magica_5th/Ars_Magica_5th.css b/Ars_Magica_5th/Ars_Magica_5th.css index 1a0bb6c4e2..4e0b41da52 100644 --- a/Ars_Magica_5th/Ars_Magica_5th.css +++ b/Ars_Magica_5th/Ars_Magica_5th.css @@ -1,6 +1,6 @@ -/*----------- Repeating Blocks -------------*/ +/*----------- Repeating Blocks -------------*/ .charsheet .repcontrol_add { - display: block; + display: inline-block; background:#7F2108; color:white; text-shadow:0px 0px 2px #000,0px 0px 2px #000,0px 0px 2px #000; @@ -11,8 +11,7 @@ height:2.2em; font-family: Copperplate, 'Copperplate Gothic Light', fantasy; } -.charsheet .repcontrol_edit -{ +.charsheet .repcontrol_edit { display: inline-block; background:#7F2108; color:white; @@ -46,9 +45,31 @@ height:1.4em; padding-top:3px; padding-bottom:3px; - } +} /*----------- End of Repeating Blocks -------------*//*=======================Tabs=======================*/ +/*---------- Hide number scrollers + +/*-- Hide arrows on number fields --*/ +/* For Firefox */ +input[type='number'] { + -moz-appearance:textfield; +} +/* Webkit browsers like Safari and Chrome */ +input[type=number]::-webkit-inner-spin-button, +input[type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} + + +----------*/ + + +div.sheet-padding { + padding-left: 5px; + padding-right: 5px; +} div.sheet-tab-content { display: none; } @@ -60,7 +81,7 @@ input.sheet-tab4:checked ~ div.sheet-tab4, input.sheet-tab5:checked ~ div.sheet-tab5, input.sheet-tab6:checked ~ div.sheet-tab6, input.sheet-tab7:checked ~ div.sheet-tab7 { - display: block; + display:block; } input.sheet-tab { @@ -72,48 +93,41 @@ input.sheet-tab { cursor: pointer; z-index: 1; border-radius: 5px 5px 5px 5px; + } -input.sheet-tab::before +input.sheet-tab:before { content: attr(title); - font-family: "Shadows Into Light", cursive; + font-family: "Copperplate Gothic Light"; color:white; text-shadow:0px 0px 0.5em black; text-align: center; - display: inline-block; + display:block; background: #fff; - background: -moz-linear-gradient(to top, #fff, #B35439, #fff); - background: -webkit-linear-gradient(to top, #fff, #B35439, #fff); - background: -ms-linear-gradient(to top, #fff, #B35439, #fff); - background: -o-linear-gradient(to top, #fff, #B35439, #fff); - background: linear-gradient(to top, #fff, #B35439, #fff); + background-image: url('https://i.imgur.com/3HUOZ39.jpg'); + width: 130px; height: 20px; font-size: 16px; font-weight:700; - border-radius: 15px 15px 15px 15px; + border-radius: 5px 5px 0px 0px ; border:1px solid black; } -input.sheet-tab:checked::before +input.sheet-tab:checked:before { background: #dcdcdc; - background: -moz-linear-gradient(to top, #B35439, #000, #B35439); - background: -webkit-linear-gradient(to top, #B35439, #000, #B35439); - background: -ms-linear-gradient(to top, #B35439, #000, #B35439); - background: -o-linear-gradient(to top, #B35439, #000, #B35439); - background: linear-gradient(to top, #B35439, #000, #B35439); - /* border-bottom-color: #fff; */ + background-image:url(https://i.imgur.com/rbGvDZZ.jpg); text-shadow:0px 0px 0.5em black,0px 0px 0.5em black; } -input.sheet-tab:not(:first-child)::before +input.sheet-tab:not(:first-child):before { border-left: none; } @@ -121,18 +135,20 @@ input.sheet-tab:not(:first-child)::before div.sheet-tab-content { width: 835px; background:white; - box-shadow: inset 0px 0px 10px #B35439, inset 0px 0px 8px #B35439,inset 0px 0px 4px #B35439; + background-image: url('https://i.imgur.com/ZSKzxUK.jpg'); + box-shadow: inset 0px 0px 10px #cdab6c, inset 0px 0px 8px #544477,inset 0px 0px 4px #30233d; padding: 5px; - border-radius:15px; + margin-bottom:20px; + border-radius:0px 0px 15px 15px; margin-right:auto; margin-left:auto; } div.sheet-top_bar { width: 835px; background:white; - box-shadow: inset 0px 0px 10px #B35439, inset 0px 0px 8px #B35439,inset 0px 0px 4px #B35439; + box-shadow: inset 0px 0px 10px #cdab6c, inset 0px 0px 8px #544477,inset 0px 0px 4px #30233d; padding: 5px; - border-radius:15px; + border-radius:15px 15px 0px 0px; margin-right:auto; margin-left:auto; } @@ -154,20 +170,33 @@ div.sheet-top_bar { /*----------- End of Banner -------------*/ /*----------- background -------------*/ .charsheet { - background:black; + background-image:url('https://i.imgur.com/DhAKnG5.jpg'); width:850px; } + +.sheet-divider { + background-image:url('https://i.imgur.com/pRSHb6q.jpg'); + width:600px; + margin:0px auto; + height:15px; + display:block;" + margin-top:5px; margin-bottom:15px; + box-shadow:0px 0px 5px 0px #f0ede4 inset; +} + /*----------- End of background -------------*/ /*----------- Text -------------*/ .sheet-heading { - font-family: "Shadows Into Light", cursive; + font-family: "Copperplate Gothic Light"; font-weight:bold; font-size:1.3em; } .sheet-heading_1 { - font-family: "Shadows Into Light", cursive; - font-size:1.3em; + background: transparent; + font-family: "Copperplate", fantasy; + color:#663333; + font-size:1.4em; line-height:1.4em; border-top: none; border-bottom: none; @@ -176,6 +205,7 @@ div.sheet-top_bar { width:200px; } +textarea.sheet-textarea_4:hover,textarea.sheet-textarea_4:focus, textarea.sheet-textarea_3:hover,textarea.sheet-textarea_3:focus, textarea.sheet-textarea_2:hover,textarea.sheet-textarea_2:focus, textarea.sheet-textarea_1:hover,textarea.sheet-textarea_1:focus, @@ -183,75 +213,134 @@ textarea.sheet-textarea_1:hover,textarea.sheet-textarea_1:focus, .sheet-heading_2:hover, .sheet-heading_2:focus, .sheet-heading_3:hover, .sheet-heading_3:focus, .sheet-heading_1:hover, .sheet-heading_1:focus { - box-shadow: inset -9px -8px 18px -4px #B35439; - text-shadow: 0px 0px 5px white, 0px 0px 5px white, 0px 0px 5px white; + background: white; /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(#e6dbc6, white); /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(#e6dbc6, white); /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(#e6dbc6, white); /* For Firefox 3.6 to 15 */ + background: linear-gradient(#e6dbc6, white); /* Standard syntax */ } .sheet-heading_2 { - font-family: "Shadows Into Light", cursive; - font-size:1.1em; - line-height:1.2em; + background: transparent; + font-family: "Copperplate", fantasy; + color:#663333; + font-size:1.2em; + line-height:1.2em; border-top: none; border-left: none; border-right: none; - border-bottom: 1px solid black; - - width:160px; + border-bottom: 2px solid #53332a; + width:160px; +} +.sheet-heading_2a { + background: transparent; + font-family: "Copperplate", fantasy; + color:#663333; + font-size:1.2em; + line-height:1.2em; + border-top: none; + border-left: none; + border-right: none; + border-bottom: 2px solid #53332a; + width:100px; } .sheet-heading_3 { - font-family: "Shadows Into Light", cursive; - font-size:1.1em; - line-height:1.2em; + background: transparent; + font-family: "Copperplate Gothic Light"; + font-size:1em; + font-weight:bold; + line-height:1.2em; + color:#53332a;; border-top: none; border-left: none; border-right: none; - border-bottom: 1px solid black; - - width:200px; + border-bottom: 2px solid #53332a; + width:200px; } .sheet-heading_4 { - font-family: "Shadows Into Light", cursive; + background: transparent; + font-family: "Copperplate Gothic Light"; font-size:1.1em; line-height:1.2em; border-top: none; border-left: none; border-right: none; - border-bottom: 1px solid black; + border-bottom: 2px solid #53332a; width:120px; } .sheet-number_1 { - width:60px; - font-family: "Shadows Into Light", cursive; - font-size:1.3em; - line-height:1.4em; + width:40px; + font-family: "Copperplate", fantasy; + color:#663333; + font-size:1.2em; + line-height:1.2em; + text-align:center; border-top: none; border-left: none; border-right: none; - border-bottom: 1px solid black; + border-bottom: 2px solid #53332a; box-shadow: none; background:transparent; } .sheet-number_2 { - width:40px; - font-family: Copperplate, 'Copperplate Gothic Light', fantasy; + width: 40px; + font-family: Copperplate Gothic Light, 'Copperplate Gothic Light', fantasy; + color:#53332a; font-size:1.1em; line-height:1.2em; + text-align: center; border-top: none; border-left: none; border-right: none; - border-bottom: 1px solid black; + border-bottom: 2px solid #53332a; box-shadow: none; background:transparent; } - -.sheet-number_2:disabled { - background: black; +.sheet-number_3 { + width:32px; + font-family: Copperplate Gothic Light, 'Copperplate Gothic Light', fantasy; + color:#53332a; + font-size:1.1em; + line-height:1.2em; + text-align:center; + border-top: none; + border-left: none; + border-right: none; + border-bottom: 2px solid #53332a; + box-shadow: none; + background:transparent; + } + +/* Advancement */ +.sheet-advance { + background-image: url("https://i.imgur.com/u6g61Nq.png"); + background-size: 100% 100%; +} + +/* Advancement Total */ +.sheet-total { + background-image: url("https://i.imgur.com/vF0GGC5.png"); + background-size: 100% 100%; +} + +/* Misc Formatting */ +.sheet-minor { + color:gray; +} + +.sheet-number_3:disabled, +.sheet-number_2:disabled, +.sheet-number_2:read-only, +.sheet-number_1:disabled { + background: #53332a; + border:2px solid #e6dbc6; color:white; + text-align: right; } .sheet-counter { width:90px; - font-family: Copperplate, 'Copperplate Gothic Light', fantasy; + font-family: Copperplate Gothic Light, 'Copperplate Gothic Light', fantasy; font-size:1.1em; line-height:1.2em; border-top: none; @@ -270,55 +359,147 @@ input.sheet-counter[type=number]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; } +/*-----Subsection Header------*/ .sheet-heading_label { margin-left:0px; margin-bottom:-6px; padding-left: 10px; - border: 1px solid #B35439; - border-radius: 15px 15px 0px 0px; - background:#B35439; - text-shadow: 0px 0px 5px white, 0px 0px 5px white, 0px 0px 5px white; + border: 2px solid #d49d4b; + border-radius: 0px 15px 0px 0px; + background:#544177; + background-image: url("https://i.imgur.com/mOpFkSQ.jpg"); + /* text-shadow: 0px 0px 20px black, 0px 0px 15px black, 0px 0px 5px #cb8f33; */ + font-family: "Copperplate Gothic Light"; + text-shadow: 0px 0px 30px #bea05a, 0px 0px 20px #bea05a, 0px 0px 10px white, 2px 2px 15px white, 2px 2px 10px white;, 2px 2px 5px white, 2px 2px 2px white; + + color:black; width:155px; } /*----------- End of Text -------------*/ +/*----------- Virtue Formatting--------*/ +.sheet-Vmajor { + background: transparent; + font-family: "Copperplate", fantasy; + color:#663333; + font-size:1.2em; + line-height:1.2em; + border-top: none; + border-left: none; + border-right: none; + border-bottom: 2px solid #53332a; + width:160px; +} +.sheet-Vminor { + background: transparent; + font-family: "Copperplate", fantasy; + color:#663333; + font-size:1em; + line-height:1em; + border-top: none; + border-left: none; + border-right: none; + border-bottom: 2px solid #53332a; + width:160px; +} +.sheet-Vfree { + background: transparent; + font-family: "Copperplate", fantasy; + font-style:italics; + color:#663333; + font-size:1em; + line-height:1em; + border-top: none; + border-left: none; + border-right: none; + border-bottom: 2px solid #53332a; + width:160px; +} /*----------- Tables -------------*/ .sheet-table_1 th { - font-family: "Shadows Into Light", cursive; + font-family: "Copperplate Gothic Light"; + font-variant:small-caps; + color:#53332a; } .sheet-table_2 { - border: 1px solid black; + font-family: "Copperplate Gothic Light"; + font-weight:bold; margin-top:5px; margin-bottom:5px; + color:#53332a; } .sheet-table_2 th { - font-family: "Shadows Into Light", cursive; + font-family: "Copperplate Gothic Light"; text-align:left; + color:#53332a; } +.sheet-table_3 { + font-family: "Copperplate Gothic Light"; + font-weight:bold; + margin-top:5px; + margin-bottom:5px; + color:#53332a; + + } +.sheet-table_3 th { + font-family: "Copperplate Gothic Light"; + text-align:left; + color:#e7e3d8; + background:url("https://i.imgur.com/aO0oiJL.jpg"); + /* border: 2px solid #e6dbc6;*/ + border-bottom: 2px solid #53332a; border-top: 1px solid #d49d4b; + padding-left:5px; + } +.sheet-table_3 tr:nth-child(even) { + background:#e6dbc6; +} +.sheet-cellgroup { + background:#e6dbc6; +} + /*----------- End of Tables -------------*/ /*----------- textarea -------------*/ textarea.sheet-textarea_1 { width: 200px; resize:vertical; - height:90px; + height:85px; border:1px dotted #d3d3d3; - border-radius:15px; + border-radius:0px 10px; + background: #e6dbc6; + font-family: "Lucida Bright", "Book Antiqua", "Candara", "Verdana"; + color:#53332a; } textarea.sheet-textarea_2 { width: 400px; resize:vertical; - height:45px; + height:85px; border:1px dotted #d3d3d3; - border-radius:15px; + border-radius:0px 10px; + background:#e6dbc6; + font-family: "Lucida Bright", "Book Antiqua", "Candara", "Verdana"; + color:#53332a; + } textarea.sheet-textarea_3 { width: 180px; resize:vertical; height:30px; border:1px dotted #d3d3d3; - border-radius:15px; + border-radius:0px 10px; + background:#e6dbc6; + margin-bottom:0px; } +textarea.sheet-textarea_4 { + width: 390px; + resize:vertical; + height:100px; + border:1px dotted #d3d3d3; + border-radius:0px 10px; + background: #e6dbc6; + font-family: "Lucida Bright", "Book Antiqua", "Candara", "Verdana"; + color:#53332a; +} /*----------- End of textarea -------------*/ /*----------- Select -------------*/ select.sheet-select_1 { @@ -328,7 +509,25 @@ select.sheet-select_1 { appearance: none; margin-bottom: 0; width:110px; - font-family: "Shadows Into Light", cursive; + font-family: "Copperplate Gothic Light"; + color:#53332a; + font-weight:bold; + background:none; + /* background:url("https://i.imgur.com/gIacv0f.jpg");*/ +} + +select.sheet-select_2 { + -webkit-appearance: none; + padding-top:0px; + padding-right:0px; + appearance:none; + margin-bottom:0px; + width:110px; + font-family: "Copperplate Gothic Light"; + font-variant: small-caps; + color: #53332a; + font-weight: bold; + background-color: transparent; } select { @@ -350,13 +549,14 @@ input.sheet-hider:checked ~ div.sheet-hide { /*----------- End of Hide Things -------------*/ /*----------- Checkbox -------------*/ /* Hide actual checkbox */ - + +input.sheet-checkbox_wound[type="checkbox"], input.sheet-checkbox_3[type="checkbox"], input.sheet-checkbox_2[type="checkbox"], input.sheet-checkbox_1[type="checkbox"] { opacity: 0; width: 16px; - height: 16px; + height: 20px; position: relative; top: 0px; left: 8px; @@ -369,35 +569,24 @@ input.sheet-checkbox_1[type="checkbox"] { input.sheet-checkbox_2[type="checkbox"] + span::before, input.sheet-checkbox_1[type="checkbox"] + span::before { margin-right: 4px; - border: solid 1px #a8a8a8; + border: solid 0px #a8a8a8; line-height: 14px; text-align: center; display: inline-block; vertical-align: middle; - -moz-box-shadow: 0 0 2px #ccc; - -webkit-box-shadow: 0 0 2px #ccc; - box-shadow: 0 0 2px #ccc; - - background: #f6f6f6; - background: -moz-radial-gradient(#f6f6f6, #dfdfdf); - background: -webkit-radial-gradient(#f6f6f6, #dfdfdf); - background: -ms-radial-gradient(#f6f6f6, #dfdfdf); - background: -o-radial-gradient(#f6f6f6, #dfdfdf); - background: radial-gradient(#f6f6f6, #dfdfdf); } /* Fake checkbox */ input.sheet-checkbox_2[type="checkbox"] + span::before, input.sheet-checkbox_1[type="checkbox"] + span::before { - content: ""; + font-family:"Pictos"; + content: "W"; + color:#6a8c55; width: 14px; height: 14px; - font-size: 12px; - - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; + font-size: 24px; + } input.sheet-checkbox_1[type="checkbox"] + span::before { position: relative; @@ -413,7 +602,9 @@ input.sheet-checkbox_2[type="checkbox"] + span::before { margin:-10px; } input.sheet-checkbox_1[type="checkbox"]:checked + span::before { - content: "✓"; + font-family:"Pictos"; + content:"W"; + color:#53332a; } input.sheet-checkbox_2[type="checkbox"]:checked + span::before { content: "x"; @@ -523,9 +714,53 @@ input.sheet-puissant[type="checkbox"] + span::before { background: #f6f6f6; } +/*--------Health Fake Checkbox-----------*/ + +input.sheet-checkbox_wound[type="checkbox"] + span::before { + margin-right: 0px; + position: relative; + top: 5px; + left: 0px; + margin:-10px; + content:url("https://i.imgur.com/V0jW9os.png"); + +} +input.sheet-checkbox_wound[type="checkbox"]:checked + span::before { + content:url("https://i.imgur.com/IMgWmkt.png"); +} +/*----------- Dropdown ----------*/ +select.sheet-dropdown { + font-size: 1.1em; + height: 25px; + width: 70px; + text-align-last: center; + vertical-align: middle; + background: #9f8779; + border: 0px; + position: relative; + padding: 2px 10px; + + margin-bottom: 0px; + left: 30px; + color: white; + font-family: "Lucida Bright", "Book Antiqua", "Candara", "Verdana"; + font-weight: bold; + font-variant: small-caps; + -webkit-appearance: none; + + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + +} + +select.sheet-dropdown:hover { + background: #53332a; +} + /*----------- Radio -------------*/ /* Hide actual radio */ +input.sheet-selector[type="radio"], input.sheet-radio_2[type="radio"], input.sheet-radio_1[type="radio"] { opacity: 0; @@ -540,6 +775,7 @@ input.sheet-radio_1[type="radio"] { } /* Fake radio */ +input.sheet-selector[type="radio"] + span::before, input.sheet-radio_2[type="radio"] + span::before, input.sheet-radio_1[type="radio"] + span::before { margin-right: 4px; @@ -565,6 +801,7 @@ input.sheet-radio_1[type="radio"] + span::before { background: radial-gradient(#f6f6f6, #dfdfdf); } +input.sheet-selector[type="radio"] + span::before, input.sheet-radio_1[type="radio"] + span::before { position: relative; top: 0px; @@ -580,6 +817,7 @@ input.sheet-radio_2[type="radio"] + span::before { } /* Fake radio */ +input.sheet-selector[type="radio"] + span::before, input.sheet-radio_2[type="radio"] + span::before, input.sheet-radio_1[type="radio"] + span::before { content: ""; @@ -591,10 +829,23 @@ input.sheet-radio_1[type="radio"] + span::before { -webkit-border-radius: 3px; border-radius: 3px; } +input.sheet-selector[type="radio"]:checked + span::before, input.sheet-radio_2[type="radio"]:checked + span::before, input.sheet-radio_1[type="radio"]:checked + span::before { content: "x"; } +/* -----Based on the selector radio, hides options -------*/ +.input.sheet-selector[type="radio"][value="major"]:checked ~ div.sheet-options { + +} +.input.sheet-selector[type="radio"][value="minor"]:checked ~ div.sheet-options { + font-family: "Gopperplate Gothic Light"; + font-size: 1em; +} +.input.sheet-selector[type="radio"][value="free"]:checked ~ div.sheet-options { + font-family: "Gopperplate Gothic Light"; + font-size: 1em; +} /* ===== ====== ====== ===== ====== */ /* Hide actual radio */ input.sheet-puissant[type="radio"] { opacity: 0; @@ -677,7 +928,7 @@ button.sheet-botch:before{ } button.sheet-botch { - font-family: "Shadows Into Light", cursive; + font-family: "Copperplate Gothic Light"; color:white; text-shadow:0px 0px 0.5em black; @@ -685,36 +936,36 @@ button.sheet-botch { display: inline-block; background: #fff; - background: -moz-linear-gradient(to top, #fff, #08667f, #fff); - background: -webkit-linear-gradient(to top, #fff, #08667f, #fff); - background: -ms-linear-gradient(to top, #fff, #08667f, #fff); - background: -o-linear-gradient(to top, #fff, #08667f, #fff); - background: linear-gradient(to top, #fff, #08667f, #fff); + background: -moz-linear-gradient(to top, #652b1f, #652b1f, #eea82e); + background: -webkit-linear-gradient(to top, #652b1f, #652b1f, #eea82e); + background: -ms-linear-gradient(to top, #652b1f, #652b1f, #eea82e); + background: -o-linear-gradient(to top, #652b1f, #652b1f, #eea82e); + background: linear-gradient(to top, #652b1f, #652b1f, #eea82e); width: 130px; height: 24px; font-size: 16px; line-height:18px; font-weight:700; - border-radius: 15px 15px 15px 15px; + border-radius: 8px 8px 2px 2px; border:1px solid black; } button.sheet-botch:hover { background: #fff; - background: -moz-linear-gradient(to top, #08667f, #fff, #08667f); - background: -webkit-linear-gradient(to top, #08667f, #fff, #08667f); - background: -ms-linear-gradient(to top, #08667f, #fff, #08667f); - background: -o-linear-gradient(to top, #08667f, #fff, #08667f); - background: linear-gradient(to top, #08667f, #fff, #08667f); + background: -moz-linear-gradient(to top, #9e3c0e, #d43d14, #eea82e); + background: -webkit-linear-gradient(to top, #9e3c0e, #d43d14, #eea82e); + background: -ms-linear-gradient(to top, #9e3c0e, #d43d14, #eea82e); + background: -o-linear-gradient(to top, #9e3c0e, #d43d14, #eea82e); + background: linear-gradient(to top, #9e3c0e, #d43d14, #eea82e); } button.sheet-botch:active { background: #fff; - background: -moz-linear-gradient(to left, #08667f, #fff, #08667f); - background: -webkit-linear-gradient(to left, #08667f, #fff, #08667f); - background: -ms-linear-gradient(to left, #08667f, #fff, #08667f); - background: -o-linear-gradient(to left, #08667f, #fff, #08667f); - background: linear-gradient(to left, #08667f, #fff, #08667f); + background: -moz-linear-gradient(to top, #9e3c0e, #d43d14, #eea82e); + background: -webkit-linear-gradient(to top, #9e3c0e, #d43d14, #eea82e); + background: -ms-linear-gradient(to top, #9e3c0e, #d43d14, #eea82e); + background: -o-linear-gradient(to top, #9e3c0e, #d43d14, #eea82e); + background: linear-gradient(to top, #9e3c0e, #d43d14, #eea82e); } /* ======== skillbtn ========*/ @@ -737,7 +988,7 @@ button.sheet-botch:active { margin: 0; background: radial-gradient(circle at 0px 10px, white, gray); font-size:1em !important; - font-family: 'Contrail One', Copperplate, 'Copperplate Gothic Light'; + font-family: 'Contrail One', Copperplate Gothic Light, 'Copperplate Gothic Light'; font-weight:bold; height:25px; width: 90px; @@ -757,39 +1008,36 @@ button.sheet-botch:active { /* ======== button ========*/ .sheet-button button[type="roll"]:before, .sheet-button:before { - content: ""!important; + content: "0"!important; display: none; - border:none; + border: none; } .sheet-button button[type="roll"], .sheet-button { display: block; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - border: 1px solid #2A4792; - box-shadow: none; - outline:0; - - margin: 0; - background: radial-gradient(circle at 0px 10px, white, gray); + background:url("https://i.imgur.com/96aRDdi.png"); + background-repeat: no-repeat; + margin: 0px auto; + font-family: 'Contrail One', Copperplate Gothic Light, 'Copperplate Gothic Light'; font-size:1em !important; - font-family: 'Contrail One', Copperplate, 'Copperplate Gothic Light'; + color:white; + text-shadow: 1px 1px 2px black; font-weight:bold; height:25px; - width: 35px; - padding-left:0px; - color: black; - text-shadow: 0px 0px 10px #fff, 0px 0px 10px #fff, 0px 0px 10px #fff; + width: 25px; + padding-left:0px;; + border:none; } .sheet-button button[type="roll"]:hover, .sheet-button:hover { - background: radial-gradient(circle at 40px 10px, white, gray); + background:url("https://i.imgur.com/HMXA2QE.png"); + background-repeat: no-repeat; } .sheet-button button[type="roll"]:active, .sheet-button:active { - background: radial-gradient(circle at 80px 10px, white, gray); + background:url("https://i.imgur.com/Xht7AhA.png"); + background-repeat: no-repeat; } /* ======== magic ========*/ .sheet-magic button[type="roll"]:before, @@ -811,7 +1059,7 @@ button.sheet-botch:active { margin: 0; background: radial-gradient(circle at 0px 10px, white, #08667f); font-size:1em !important; - font-family: 'Contrail One', Copperplate, 'Copperplate Gothic Light'; + font-family: 'Contrail One', 'Copperplate Gothic Light', 'Copperplate Gothic Light'; font-weight:bold; height:25px; width: 35px; @@ -831,153 +1079,400 @@ button.sheet-botch:active { /*----------- End of Buttons -------------*/ /*=== spell ===*/ .sheet-rolltemplate-spell table { - width: 100%; - background: white; - color: black; + width: 235px; + border-spacing: 5px; background: white; + background: url(https://i.imgur.com/gIacv0f.jpg); + color: #53332a;; font-size: 1em; - font-family: "Helvetica Neue", Helvetica, sans-serif; - box-shadow: -5px -5px 6px #8B0000, -5px -5px 6px black; - border-top-left-radius:15px; - border-top-right-radius:15px; + font-family: "Lucida Bright", "Book Antiqua", "Candara", "Verdana"; + /* box-shadow: -5px -5px 6px #8B0000, -5px -5px 6px black; */ + border-top-left-radius:3px; + border-top-right-radius:3px; + box-shadow: 0px 25px 4px black; +} +.sheet-rolltemplate-spell::after { + content:url(https://i.imgur.com/Hs6r7k6.png); + position:relative; + left:-4px; +} +.sheet-rolltemplate-spell table tr td.sheet-spellsubheader { + background:#D3E5F5; + background-image: url(https://i.imgur.com/IaYgcRC.png); + background-position:bottom left; + background-size: 100% 100%; + background-repeat:no-repeat; + text-indent: 5px; + Height:23px; + color:white; + font-family:"Copperplate"; + font-size: 1.2em; + text-shadow: 2px 2px 2px black; } .sheet-rolltemplate-botch table { width: 100%; background: white; - color: black; - background: white; - font-size: 1em; - font-family: "Helvetica Neue", Helvetica, sans-serif; - box-shadow: -5px -5px 6px #08667f, -5px -5px 6px black; - border-top-left-radius:15px; - border-top-right-radius:15px; + color: white; + text-shadow: 2px 2px 2px black; + text-shadow: 2px 2px 5px black; + text-shadow: 2px 2px 5px black; + background-image: url(https://i.imgur.com/j2X8kzg.jpg); + height:82px; + width:235px; + font-size: 2em; + text-align: center; + border-radius: 30px 2px 30px 30px; +} +.sheet-rolltemplate-botch th { + color: #bc4f3a; + line-height: .5em; + font-size: .5em; + font-family: "Aclonica Font", "Copperplate"; + text-shadow: 0px 0px 5px black; + text-shadow: 2px 2px 5px black; } - .sheet-rolltemplate-spell th { background:#B35439; - background-size: 100%; - color: white; - padding: 2px; + background-image: url('https://i.imgur.com/VVOqlrY.jpg'); + background-size: 240px; + color:white; + padding: 5px; border-bottom: 1px solid black; - line-height: 1.6em; - font-size: 1.2em; - text-shadow: 0px 0px 2px black; - border-top-left-radius:15px; - border-top-right-radius:15px; + font-family:"Copperplate"; + line-height: 1.6em; + font-size: 1.2em; + text-shadow: 2px 2px 2px black; + border-top-left-radius:3px; + border-top-right-radius:3px; } -.sheet-rolltemplate-botch th { - background:#08667f; - background-size: 100%; - color: white; - padding: 2px; - border-bottom: 1px solid #08667f; - line-height: 1.6em; - font-size: 1.2em; - text-shadow: 0px 0px 2px black; - border-top-left-radius:15px; - border-top-right-radius:15px; -} + .sheet-rolltemplate-spell .sheet-tcat { - font-weight: bold; + font-weight: bold; } +.sheet-rolltemplate-arcane .inlinerollresult, .sheet-rolltemplate-botch .inlinerollresult, +.sheet-rolltemplate-ability .inlinerollresult, .sheet-rolltemplate-spell .inlinerollresult { - display: inline-block; - min-width: 1.5em; - text-align: center; - border: none; /*Cool Gray 6 C*/ - background:none; + display: inline-block; + /* min-width: 1.5em; */ + text-align: center; + border: none; /*Cool Gray 6 C*/ + background:none; + padding:0px; } -.sheet-rolltemplate-botch .inlinerollresult.fullfail, +.sheet-rolltemplate-arcane .inlinerollresult.fullfail, .sheet-rolltemplate-spell .inlinerollresult.fullfail { - color: #B31515; - border: none; /*Cool Gray 6 C*/ - background:none; + color: #0099cc; + border: none; /*Cool Gray 6 C*/ + background:none; } +.sheet-rolltemplate-arcane .inlinerollresult.importantroll, .sheet-rolltemplate-botch .inlinerollresult.importantroll, .sheet-rolltemplate-spell .inlinerollresult.importantroll { - color: #4A57ED; - border: none; /*Cool Gray 6 C*/ - background:none; + color: #ba0000; + border: none; /*Cool Gray 6 C*/ + background:none; } + .sheet-rolltemplate-arcane .inlinerollresult.fullcrit, .sheet-rolltemplate-botch .inlinerollresult.fullcrit, .sheet-rolltemplate-spell .inlinerollresult.fullcrit { - color: #4A57ED; - border: none; /*Cool Gray 6 C*/ - background:none; + color: #ba0000; + border: none; /*Cool Gray 6 C*/ + background:none; } .sheet-rolltemplate-spell td.sheet-top_bottom { - border-top: 1px solid #8B0000; + border-top: 1px solid #8B0000; border-bottom: 1px solid #8B0000; } /*=== attack & initiative ===*/ .sheet-rolltemplate-attack table, .sheet-rolltemplate-initiative table { - width: 100%; - background: white; - color: black; - background: white; - font-size: 1em; - font-family: "Helvetica Neue", Helvetica, sans-serif; - box-shadow: -5px -5px 6px #8B0000, -5px -5px 6px black; - border-top-left-radius:15px; - border-top-right-radius:15px; + width: 235px; + background: url(https://i.imgur.com/aO0oiJL.jpg), white; + color: #cccc99; + font-size: 1.2em; + font-family: "Franklin Gothic Bold"; + text-align:center; + border-top-left-radius:10px; + border-top-right-radius:10px; + box-shadow: 0px 0px 4px black; +} +.sheet-rolltemplate-attack::after { + content:url(https://i.imgur.com/G7cFyyW.png); } .sheet-rolltemplate-attack th, .sheet-rolltemplate-initiative th { background:#B35439; + background: url("https://i.imgur.com/5FxmcTN.jpg"); background-size: 100%; color: white; padding: 2px; border-bottom: 1px solid black; - line-height: 1.6em; - font-size: 1.2em; - text-shadow: 0px 0px 2px black; - border-top-left-radius:15px; - border-top-right-radius:15px; + line-height: 1.6em; + font-size: 1.2em; + border-top-left-radius:10px; + border-top-right-radius:10px; } .sheet-rolltemplate-attack .sheet-tcat , .sheet-rolltemplate-initiative .sheet-tcat { - font-weight: bold; + font-weight: bold; + color:white; } .sheet-rolltemplate-attack .inlinerollresult, .sheet-rolltemplate-initiative .inlinerollresult { - display: inline-block; - min-width: 1.5em; - text-align: center; - border: none; /*Cool Gray 6 C*/ - background:none; + display: inline-block; + font-family:"Franklin Gothic Bold"; + min-width: 1.5em; + font-size: 1.5em; + color:white; + text-align: center; + border: none; /*Cool Gray 6 C*/ + background:none; } .sheet-rolltemplate-attack .inlinerollresult.fullfail, +.sheet-rolltemplate-generic .inlinerollresult.fullfail, +.sheet-rolltemplate-ability .inlinerollresult.fullfail, .sheet-rolltemplate-initiative .inlinerollresult.fullfail { - color: #B31515; - border: none; /*Cool Gray 6 C*/ - background:none; + color: #0099cc; + border: none; /*Cool Gray 6 C*/ + background:none; +} + +.sheet-rolltemplate-botch .inlinerollresult.fullfail { + color: #FFFFFF; + border: none; /*Cool Gray 6 C*/ + background:none; } .sheet-rolltemplate-attack .inlinerollresult.importantroll, +.sheet-rolltemplate-generic .inlinerollresult.importantroll, +.sheet-rolltemplate-ability .inlinerollresult.importantroll, .sheet-rolltemplate-initiative .inlinerollresult.importantroll { - color: #4A57ED; - border: none; /*Cool Gray 6 C*/ - background:none; + color: #ba0000; + border: none; /*Cool Gray 6 C*/ + background:none; } .sheet-rolltemplate-attack .inlinerollresult.fullcrit, + .sheet-rolltemplate-generic .inlinerollresult.fullcrit, + .sheet-rolltemplate-ability .inlinerollresult.fullcrit, .sheet-rolltemplate-initiative .inlinerollresult.fullcrit { - color: #4A57ED; - border: none; /*Cool Gray 6 C*/ - background:none; + color: #ba0000; + border: none; /*Cool Gray 6 C*/ + background:none; } + +.sheet-rolltemplate-ability table { + background:white; + background:url('https://i.imgur.com/gIacv0f.jpg'); + font-family: "Copperplate", "Geneva"; + font-size: 1em; + line-height: 1.5em; + color:#53332a; + width:235px; + box-shadow: 0px 25px 4px black; +} +.sheet-rolltemplate-ability th { + width: 235px; + background:#D3E5F5; + background-image: url(https://i.imgur.com/IaYgcRC.png); + background-position:bottom left; + background-size: 100% 100%; + background-repeat:no-repeat; + text-align: left; + text-indent: 5px; + Height:23px; + color:white; + font-family:"Copperplate"; + font-size: 1.2em; + font-weight: normal; + text-shadow: 2px 2px 2px black; + font-style:italic; +} +.sheet-rolltemplate-ability td.sheet-banner { + background:url(https://i.imgur.com/cuBJDMZ.jpg); + text-shadow: 2px 2px 2px black; + color:white; + text-align:center; + +} +.sheet-rolltemplate-ability tr.sheet-subheader { + +} +/*----.sheet-rolltemplate-ability .sheet-flex_container { + display:flex; + justify-content:space-around; + vertical-align:middle; +}----*/ +.sheet-rolltemplate-ability div.sheet-define{ + font-family: "Copperplate", fantasy; + font-size: 1.5em; + margin-left:15px; + padding-bottom:17px; + +} +.sheet-rolltemplate-ability div.sheet-define::first-letter { + color:#337999; + font-size: 200%; + line-height: 100%; +} +.sheet-rolltemplate-ability div.sheet-flex_item { + display:block; + margin:-14px; + margin-left:95px; +} +.sheet-rolltemplate-ability div.sheet-bigresult { + font-size: 2em; + font-family: "Copperplate", fantasy; + text-align:right; + margin:5px; + margin-right:15px; +} +.sheet-rolltemplate-ability td.sheet-label { + width:50%; + padding-left:20px; + font-weight:bold; +} +.sheet-rolltemplate-ability::after { + content:url(https://i.imgur.com/ZGOKHai.png); + position:relative; + left:-4px; +} +.sheet-rolltemplate-ability td.sheet-result { + text-align:right; + padding-right:50px; + font-weight:bold; +} +/*---------Roll Template Generic------------*/ +.sheet-rolltemplate-generic { +} +.sheet-rolltemplate-generic table { + background-image:url('https://i.imgur.com/gIacv0f.jpg'); + font-family: "Copperplate"; + width:235px; + font-size: 1em; + line-height: 1em; + color: #53332a; + box-shadow: 0px 26px 4px black; +} +.sheet-rolltemplate-generic th { + background-image:url('https://i.imgur.com/xOcdfsE.jpg'); + background-repeat: no-repeat; + font-family: "Copperplate"; + font-size:1.4em; + color: white; + text-shadow: 2px 2px 2px black,0px 0px 5px black,0px 0px 10px black,0px 0px 10px black; + padding-bottom: 10px; + vertical-align:bottom; + height: 125px; + border-top: none; +} +.sheet-rolltemplate-generic .sheet-Label { + font-weight: bold; + padding-left: 10px; +} +.sheet-rolltemplate-generic div.sheet-result { + font-size: 2em; + font-family: "Copperplate", fantasy; + +} +.sheet-rolltemplate-generic::after { + content:url(https://i.imgur.com/ZGOKHai.png); + position:relative; + left:-4px; +} +/*--------Roll Template Arcane--------*/ +.sheet-rolltemplate-arcane { + background:none; + font-family:"Book Antiqua"; + width:235px; + font-size: 1em; + line-height: 1em; + color: #53332a; +} +.sheet-rolltemplate-arcane table { + position:relative; + top:-50px; + width:210px; + margin:auto; + border-collapse:separate; +} +.sheet-rolltemplate-arcane th { + background:#e6dbc6; + font-size:1.4em; + line-height:.6em; + border: 10px solid black; + + -webkit-border-image: url(https://i.imgur.com/AoJHLa5.png) 16 stretch; /* Safari 3.1-5 */ + -o-border-image: url(https://i.imgur.com/AoJHLa5.png) 16 stretch; /* Opera 11-12.1 */ + border-image: url(https://i.imgur.com/AoJHLa5.png) 16 stretch; + + border-image-outset:6px; + border-image-width:10px; + border-spacing:20px; + padding:0px; + +} +.sheet-rolltemplate-arcane td { +/* background-image:url("https://i.imgur.com/gIacv0f.jpg"); */ + padding-left:10px; + padding-right:10px; +} +.sheet-rolltemplate-arcane td.sheet-label { + width:50%; + font-size:12px; + line-height:1em; + text-align:center; + font-weight:bold; +} +.sheet-rolltemplate-arcane td.sheet-result { + width:50%; + font-size:12px; + font-size:1em; + line-height:1em; + text-align:right; + font-weight:bold; + padding:0px; + padding-right:50px; + min-width:none; +} + +.sheet-rolltemplate-arcane td.sheet-textfield { + font-style:italic; + font-size: .8em; +} +.sheet-rolltemplate-arcane td.sheet-bigresult { + background-color:none; + padding: 0px; + font-weight: bold; + background-image:url("https://i.imgur.com/vwr2aQo.png"); + background-repeat:no-repeat; + background-position:49.5%; + text-align:center; + position:relative; + font-size:25px; + color:white; + line-height:55px; + text-shadow: + -1px -1px 0 #000, + 1px -1px 0 #000, + -1px 1px 0 #000, + 1px 1px 0 #000, + 1px -2px 1px #000; +} +.sheet-rolltemplate-arcane .sheet-bigresult .inlinerollresult { + vertical-align:-5px; +} diff --git a/Ars_Magica_5th/Ars_Magica_5th.html b/Ars_Magica_5th/Ars_Magica_5th.html index eceb2ad5ca..ef1230fa54 100644 --- a/Ars_Magica_5th/Ars_Magica_5th.html +++ b/Ars_Magica_5th/Ars_Magica_5th.html @@ -1,16 +1,22 @@ + +
- + + + + +
Character
Character
Player
Unspent XP
@@ -22,15 +28,17 @@ - - - - - + - + + + + + + +
Saga
Setting
Current Year
ConfidencePool
@@ -49,51 +57,56 @@
-
- - - - - - - - - - - - - - - - - -
Covenant
Age
Size
Confidence
+
-

Decrepitude

- +
- - + + - + + + + + +
Effects of AgingAge
+ +
Warp Score
-

Warping

- +
- - + + + + + + + - + +
Effects of WarpingApparent Age
Pool
Warp Points
+
+
+

Warping Scars

+ +
+
@@ -127,19 +140,21 @@ - + - + + + + + + + - + - - - - - +
Height Weight
SizeHandedness
Hair Eyes
Handedness
@@ -147,24 +162,24 @@
-

Magical Arts

+

Magus Background

- +
- + - + - +
House
Covenant
Wizard's Sigil

Wizard's Sigil

@@ -186,11 +201,7 @@ Covenant of Apprenticeship - - Aura - - - +
@@ -202,14 +213,21 @@
- + @@ -221,14 +239,21 @@
+ +
- + +
- + @@ -248,36 +273,34 @@ - - + + + - - + + + - - + + + - - + + + - - + + + - - - - - - - - - - + + +
+ + +
- +
Score
@@ -291,43 +314,39 @@ - - + + + - - + + + - - + + + - - + + + - - + + + - - - - - - - - - - - - + + +
@@ -345,15 +364,15 @@
- - + + @@ -364,144 +383,142 @@
-
+
-

Characteristics

-
- +
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DescriptionScorePuissant
IntelligenceInt - - -
PerceptionPer - - -
StrengthStr - - -
StaminaSta - - -
PresencePre - - -
CommunicationCom - - -
DexterityDex - - -
QuicknessQik - - -
+
+

Characteristics

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriptionScoreAgingBonus
Intelligence
Perception
Strength
Stamina
Presence
Communication
Dexterity
Quickness
+
+
+ + + + + + + + +

Decrepitude/Aging

+
+
+

Ongoing Effects

+ +

Abilities

- - + -
Exp.
Ability
Ability
Score
*
Puissant
- - - - + + + -
[]
- - + + + + + + - - + + + + + +
CharacteristicSpecialityScoreBonus
XP [ / / ]Accelerated
@@ -513,277 +530,151 @@
-
+

Techniques

- +
- - - - - - + + + + - - - - - - + + + + - - - - - - + + + + - - - - - - + + + + - - - - - - + + + + - - - - - - + + + +
Exp.
Technique
Score
Puissant
Score
Art
Exp.
Bonus
[/]Creo - - - Creo[//]
[/]Intellego - - - Intellego[//]
[/]Muto - - - Muto[//]
[/]Perdo - - - Perdo[//]
[/]Rego - - - Rego[//]

Forms

- +
- - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + + +
Exp.
Form
Score
Puissant
Score
Art
Exp.
Bonus
[]Animal - - - Animal[//]
[]Aquam - - - Aquam[//]
[]Auram - - - Auram[//]
[]Corpus - - - Corpus[//]
[]Herbam - - - Herbam[//]
+
+
+
+ + + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + + - - - - - + + + +
Score
Art
Exp.
Bonus
[]Ignem - - - Ignem[//]
[]Imaginem - - - Imaginem[//]
[]Mentem - - - Mentem[//]
[]Terram - - - Terram[//]
[]Vim - - - Vim[//]
+
 

Base Casting Totals

- +
- - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + +
TotalTechniqueFormStaAuraArtes Lib.Philos.StressRollSpontaneous SpellsRollTotalTechniqueFormStaAuraArtes Lib.Philos.
Formulaic - - - -
Ritual - - - -
Spontaneous
(Fatigue)
Fatiguing 1d10
Spontaneous
(No Fatigue)
Ceremonial + + + +
Non-Fatiguing
Designed Spells
Formulaic + + + +
Ritual + + + +
Aura

+
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Qik
Finesse
Total
Fast Casting Speed
Per
Awareness
Total
Determining Effect
Per
Finesse
Total
Base Targeting
Sta
Concentration
Total
Concentration
Parma
Total
Magic Resistance
x
+
+

Lab Characteristics

+
+ + + + + + + + + + + + + + + + + + + + + +
Score
Size
Refinement
General Quality
Upkeep
+
+
+ + + + + + + + + + + + + + + + + + + +
Score
Safety
Warping
Health
Aesthetics
+
+
+
+
+

Lab Virtues

+
+ + + + + + + + +
+ +
+ +
+
+
+
+
+

Flaws

+
+ + + + + + + + +
+ +
+ +
+
+
+
+
+
+

Sanctum Marker

+ +
+
+

Description

+ +
-

Lab

- - - - +
+

Lab Totals

+
Basic Lab Total
+ + + + + + + + + + + + + + + + + + + + +
Basic Lab Total
Modifiers
+ +
+ + + +
IntTheoryAuraTechniqueForm
+
+
+

Lab Bonuses

+ + + + + + +
Specializations & Bonuses
Score
Inc.
+
+ + + + + +
+
+
+ + + + + +
Total Specialization Modifier
- - -
-
-
- - - - - - - - - Int - Theory - Aura - Technique - Form - - -

Longevity Ritual

- - - - - - - - - - - - - -
Lab Total
Age Roll Modifier
Twilight Scars
+
-
-
+
+

Fatigue Levels

- +
- - - + + + + - - - + + + + - - - + + + + - - + + + + + + + + + - - + + - + - - + + - +
- FreshCurrentPenaltyRecoveryLevel
02 min. - WindedFresh
-110 min. - Weary02 min.Winded
-3-110 min.Weary
-3 30 min. - TiredTired
-5-5 1 hr.DazedDazed
2 hr.UnconciousUnconscious

Wounds

- +
- + - - + - + - + - -
RangeNumberNumber PenaltyNotes
Light Wounds - - - - - + + + + + -1 - -1
Medium Wounds - - - - - + + + + + -3 - -3
Heavy Wounds - - - - - + + + + + -5 - -5
Incapacitated - + -
Dead - + -
@@ -1111,6 +1162,10 @@ + +
+
+ @@ -1118,7 +1173,7 @@ - + @@ -1129,19 +1184,18 @@

Weapons

Soak
- - + + - + - - - - - - - + + + + + +
Weapon Name
Weapon Name
Init
Atk
DFN
Dam
Load
Range
DFN
Dam
Ability
Load
Range
@@ -1149,155 +1203,173 @@ - + - - - - - - + + + + + +
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
QikWeapEncDexAbilityWeapQikAbilityWeapStrWeap
+-=Init++=Atk++=Dfn+=Dam
+
+ + + + + + + + + + + + + + + + + + +
Initiative
QikWeap.Enc.
+-
+ + + + + + + + + + + + + + + + + + +
Attack
DexAbilityWeap
++
+ + + + + + + + + + + + + + + + + + +
Defense
QikAbilityWeapon
++
+ + + + + + + + + + + + + + +
Damage
StrengthWeapon
+
-

Spells

+

Spells

- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
Technique - - Form - - LevelBonus
RangeDurationTargetExp[/]
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Technique + + Form + + LevelBonus
RangeDurationTargetExp[/]
+
@@ -1305,96 +1377,261 @@ - + + + + - - - - + - - - - + + - - - - + + + + - - - - - - + + + + + + + + + + + + - - - - - - - - + + - - -
{{character}} casts
{{spell}}
{{character}} casts {{spell}}!
{{Technique}}{{Form}}{{Level}}
{{sigil}}
RDT
{{Technique}}{{Form}}{{Level}}
{{range}}{{duration}}{{target}}
Roll:
R
D
T
{{range}}
{{duration}}
{{target}}
Roll:
{{roll}}
Effect
{{effect}}
Mastery
Effect
{{mastery}}
-
- +
{{effect}}
+ + +
Mastery
+ + +
{{mastery}}
+ + + + - - - - + + + + - -
Botch Roll
Botch
{{roll}}
-
- + + + + - - - + + + {{#defend}} - + - + {{/defend}} {{#attack}} - - - - - - - - + + + + + + + + {{/attack}} -
{{weapon}}
{{name}}
Defend {{defend}}
Attack{{attack}}
Damage{{damage}}
Attack
{{attack}}
Damage
{{damage}}
-
- + + + - - - - - - -
Initiative
{{name}} rolls {{roll}} for initiative with {{weapon}}
-
+ + {{name}} + + +
Initiative {{roll}} with {{weapon}}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{name}} leverages
{{label0}},
Attaining
{{result0}}
{{label1}}{{result1}}
{{label2}}{{result2}}
{{label3}}{{result3}}
{{label4}}{{result4}}
+
+ + + + + + + + + + +
{{Banner}}
{{Label}}{{Result}}
+
+ + + +
+
+ + + + + + + + + + + {{#label1}} + + + + + {{/label1}} + {{#label2}} + + + + + {{/label2}} + {{#label3}} + + + + + {{/label3}} + {{#label4}} + + + + + {{/label4}} + {{#label5}} + + + + + {{/label5}} + {{#label6}} + + + + + {{/label6}} + {{#textlabel}} + + + + + + + + + + {{/textlabel}} +
{{result0}}
{{label0}}
 
{{label1}}{{result1}}
{{label2}}{{result2}}
{{label3}}{{result3}}
{{label4}}{{result4}}
{{label5}}{{result5}}
{{label6}}{{result6}}

{{textlabel}}
{{textfield}}
+
+
+ +
+ diff --git a/Ars_Magica_5th/Ars_Magica_5th.png b/Ars_Magica_5th/Ars_Magica_5th.png index 648ff31fc8..fbed42a253 100644 Binary files a/Ars_Magica_5th/Ars_Magica_5th.png and b/Ars_Magica_5th/Ars_Magica_5th.png differ diff --git a/Ars_Magica_5th/arsbanner.psd b/Ars_Magica_5th/arsbanner.psd new file mode 100644 index 0000000000..32781c2792 Binary files /dev/null and b/Ars_Magica_5th/arsbanner.psd differ diff --git a/Ars_Magica_5th/images/advancement_advance.png b/Ars_Magica_5th/images/advancement_advance.png new file mode 100644 index 0000000000..2510826c53 Binary files /dev/null and b/Ars_Magica_5th/images/advancement_advance.png differ diff --git a/Ars_Magica_5th/images/advancement_total.png b/Ars_Magica_5th/images/advancement_total.png new file mode 100644 index 0000000000..d75fe3a2fd Binary files /dev/null and b/Ars_Magica_5th/images/advancement_total.png differ diff --git a/Ars_Magica_5th/images/arcane-footer.jpg b/Ars_Magica_5th/images/arcane-footer.jpg new file mode 100644 index 0000000000..f5b3efebf3 Binary files /dev/null and b/Ars_Magica_5th/images/arcane-footer.jpg differ diff --git a/Ars_Magica_5th/images/arcane-header.jpg b/Ars_Magica_5th/images/arcane-header.jpg new file mode 100644 index 0000000000..5bc31bfddb Binary files /dev/null and b/Ars_Magica_5th/images/arcane-header.jpg differ diff --git a/Ars_Magica_5th/images/basicroller_footer.png b/Ars_Magica_5th/images/basicroller_footer.png new file mode 100644 index 0000000000..7e9707e65b Binary files /dev/null and b/Ars_Magica_5th/images/basicroller_footer.png differ diff --git a/Ars_Magica_5th/images/botchbanner.jpg b/Ars_Magica_5th/images/botchbanner.jpg new file mode 100644 index 0000000000..7262210c3e Binary files /dev/null and b/Ars_Magica_5th/images/botchbanner.jpg differ diff --git a/Ars_Magica_5th/images/combatroller_bg1.jpg b/Ars_Magica_5th/images/combatroller_bg1.jpg new file mode 100644 index 0000000000..b3d52a0741 Binary files /dev/null and b/Ars_Magica_5th/images/combatroller_bg1.jpg differ diff --git a/Ars_Magica_5th/images/combatroller_bg2.jpg b/Ars_Magica_5th/images/combatroller_bg2.jpg new file mode 100644 index 0000000000..90588df4b9 Binary files /dev/null and b/Ars_Magica_5th/images/combatroller_bg2.jpg differ diff --git a/Ars_Magica_5th/images/combatroller_header.jpg b/Ars_Magica_5th/images/combatroller_header.jpg new file mode 100644 index 0000000000..d141a248c9 Binary files /dev/null and b/Ars_Magica_5th/images/combatroller_header.jpg differ diff --git a/Ars_Magica_5th/images/divider-block.jpg b/Ars_Magica_5th/images/divider-block.jpg new file mode 100644 index 0000000000..80ecd490ac Binary files /dev/null and b/Ars_Magica_5th/images/divider-block.jpg differ diff --git a/Ars_Magica_5th/images/downspikes.png b/Ars_Magica_5th/images/downspikes.png new file mode 100644 index 0000000000..20be427161 Binary files /dev/null and b/Ars_Magica_5th/images/downspikes.png differ diff --git a/Ars_Magica_5th/images/genericheader.jpg b/Ars_Magica_5th/images/genericheader.jpg new file mode 100644 index 0000000000..93c33a1009 Binary files /dev/null and b/Ars_Magica_5th/images/genericheader.jpg differ diff --git a/Ars_Magica_5th/images/horizontalbanner.png b/Ars_Magica_5th/images/horizontalbanner.png new file mode 100644 index 0000000000..90dd048d16 Binary files /dev/null and b/Ars_Magica_5th/images/horizontalbanner.png differ diff --git a/Ars_Magica_5th/images/metalbar.jpg b/Ars_Magica_5th/images/metalbar.jpg new file mode 100644 index 0000000000..c39c4e4804 Binary files /dev/null and b/Ars_Magica_5th/images/metalbar.jpg differ diff --git a/Ars_Magica_5th/images/metalbar_dark.jpg b/Ars_Magica_5th/images/metalbar_dark.jpg new file mode 100644 index 0000000000..d85685e016 Binary files /dev/null and b/Ars_Magica_5th/images/metalbar_dark.jpg differ diff --git a/Ars_Magica_5th/images/numbercircle.png b/Ars_Magica_5th/images/numbercircle.png new file mode 100644 index 0000000000..d844eafd0c Binary files /dev/null and b/Ars_Magica_5th/images/numbercircle.png differ diff --git a/Ars_Magica_5th/images/paintbar.jpg b/Ars_Magica_5th/images/paintbar.jpg new file mode 100644 index 0000000000..a75f7dd6d9 Binary files /dev/null and b/Ars_Magica_5th/images/paintbar.jpg differ diff --git a/Ars_Magica_5th/images/rollbutton.png b/Ars_Magica_5th/images/rollbutton.png new file mode 100644 index 0000000000..84cefaa61f Binary files /dev/null and b/Ars_Magica_5th/images/rollbutton.png differ diff --git a/Ars_Magica_5th/images/rollbutton_act.png b/Ars_Magica_5th/images/rollbutton_act.png new file mode 100644 index 0000000000..1ccffd85dc Binary files /dev/null and b/Ars_Magica_5th/images/rollbutton_act.png differ diff --git a/Ars_Magica_5th/images/rollbutton_base.png b/Ars_Magica_5th/images/rollbutton_base.png new file mode 100644 index 0000000000..30a84f5616 Binary files /dev/null and b/Ars_Magica_5th/images/rollbutton_base.png differ diff --git a/Ars_Magica_5th/images/rollbutton_hvr.png b/Ars_Magica_5th/images/rollbutton_hvr.png new file mode 100644 index 0000000000..82e0eaf76d Binary files /dev/null and b/Ars_Magica_5th/images/rollbutton_hvr.png differ diff --git a/Ars_Magica_5th/images/spellroller_footer.png b/Ars_Magica_5th/images/spellroller_footer.png new file mode 100644 index 0000000000..faa58a631e Binary files /dev/null and b/Ars_Magica_5th/images/spellroller_footer.png differ diff --git a/Ars_Magica_5th/images/spellroller_header.jpg b/Ars_Magica_5th/images/spellroller_header.jpg new file mode 100644 index 0000000000..259116713f Binary files /dev/null and b/Ars_Magica_5th/images/spellroller_header.jpg differ diff --git a/Ars_Magica_5th/images/spellroller_subheader.gif b/Ars_Magica_5th/images/spellroller_subheader.gif new file mode 100644 index 0000000000..3d50b951e6 Binary files /dev/null and b/Ars_Magica_5th/images/spellroller_subheader.gif differ diff --git a/Ars_Magica_5th/images/splitbanner.jpg b/Ars_Magica_5th/images/splitbanner.jpg new file mode 100644 index 0000000000..4b46eb43d7 Binary files /dev/null and b/Ars_Magica_5th/images/splitbanner.jpg differ diff --git a/Ars_Magica_5th/images/starbanner.png b/Ars_Magica_5th/images/starbanner.png new file mode 100644 index 0000000000..fb960216a1 Binary files /dev/null and b/Ars_Magica_5th/images/starbanner.png differ diff --git a/Ars_Magica_5th/images/subtlepaper.jpg b/Ars_Magica_5th/images/subtlepaper.jpg new file mode 100644 index 0000000000..d0c5eda4e5 Binary files /dev/null and b/Ars_Magica_5th/images/subtlepaper.jpg differ diff --git a/Ars_Magica_5th/images/unwounded.png b/Ars_Magica_5th/images/unwounded.png new file mode 100644 index 0000000000..124642f5e2 Binary files /dev/null and b/Ars_Magica_5th/images/unwounded.png differ diff --git a/Ars_Magica_5th/images/velvet.jpg b/Ars_Magica_5th/images/velvet.jpg new file mode 100644 index 0000000000..c7c058d98b Binary files /dev/null and b/Ars_Magica_5th/images/velvet.jpg differ diff --git a/Ars_Magica_5th/images/wounded.png b/Ars_Magica_5th/images/wounded.png new file mode 100644 index 0000000000..648ec87564 Binary files /dev/null and b/Ars_Magica_5th/images/wounded.png differ diff --git a/Ars_Magica_5th/sheet.json b/Ars_Magica_5th/sheet.json index d3153b262b..d39e5f235c 100644 --- a/Ars_Magica_5th/sheet.json +++ b/Ars_Magica_5th/sheet.json @@ -1,8 +1,8 @@ { "html": "Ars_Magica_5th.html", "css": "Ars_Magica_5th.css", - "authors": "Coal Powered Puppet.", - "roll20userid": "492849", + "authors": "Medieve & Felan, original sheet by Coal Powered Puppet.", + "roll20userid": "492849,23472", "preview": "Ars_Magica_5th.png", - "instructions": "#Ars Magica 5th \r \r **For use with Ars Magica 5th edition** \r \r Chrome Users must load unsafe scripts to see ultra-cool Font. \r\r If there's something you want added, or you'd like to report a bug, please contact the author of this sheet. " -} \ No newline at end of file + "instructions": "#Ars Magica 5th \r \r **For use with Ars Magica 5th edition** \r\r If there's something you want added, or you'd like to report a bug, please contact the author of this sheet. " +} diff --git a/CWOD-V20/translations/de.json b/CWOD-V20/translations/de.json index de59e7a0b4..a995033887 100644 --- a/CWOD-V20/translations/de.json +++ b/CWOD-V20/translations/de.json @@ -1,89 +1,89 @@ { "name-u": "Name:", - "player-u": "Player:", - "chronicle-u": "Chronicle:", - "nature-u": "Nature:", - "demeanor-u": "Demeanor:", - "concept-u": "Concept:", + "player-u": "Spieler:", + "chronicle-u": "Chronik:", + "nature-u": "Wesen:", + "demeanor-u": "Verhalten:", + "concept-u": "Konzept:", "clan-u": "Clan:", "generation-u": "Generation:", - "sire-u": "Sire:", - "attributes-u": "Attributes", - "physical-u": "Physical", - "social-u": "Social", - "mental-u": "Mental", - "strength-u": "Strength", - "dexterity-u": "Dexterity", - "stamina-u": "Stamina", + "sire-u": "Erschaffer:", + "attributes-u": "Attribute", + "physical-u": "K?rperlich", + "social-u": "Gesellschaftlich", + "mental-u": "Geistig", + "strength-u": "K?rperkraft", + "dexterity-u": "Geschick", + "stamina-u": "Widerstandsf?higkeit", "charisma-u": "Charisma", "manipulation-u": "Manipulation", - "appearance-u": "Appearance", - "intelligence-u": "Intelligence", - "wits-u": "Wits", - "perception-u": "Perception", - "abilities-u": "Abilities", - "talents-u": "Talents", - "skills-u": "Skills", - "knowledges-u": "Knowledges", - "alertness-u": "Alertness", - "athletics-u": "Athletics", - "awareness-u": "Awareness", - "brawl-u": "Brawl", - "empathy-u": "Empathy", - "expression-u": "Expression", - "intimidation-u": "Intimidation", - "leadership-u": "Leadership", - "subterfuge-u": "Subterfuge", - "streetwise-u": "Subterfuge", - "animalken-u": "Animal Ken", - "craft-u": "Craft", - "drive-u": "Drive", - "etiquette-u": "Etiquette", - "firearms-u": "Firearms", - "larceny-u": "Larceny", - "melee-u": "Melee", - "performance-u": "Performance", - "stealth-u": "Stealth", - "survival-u": "Survival", - "academics-u": "Academics", + "appearance-u": "Erscheinungsbild", + "intelligence-u": "Intelligenz", + "wits-u": "Wahrnehmung", + "perception-u": "Geistessch?rfe", + "abilities-u": "F?higkeiten", + "talents-u": "Talente", + "skills-u": "Fertigkeiten", + "knowledges-u": "Kenntnisse", + "alertness-u": "Aufmerksamkeit", + "athletics-u": "Sportlichkeit", + "awareness-u": "Magiegesp?r", + "brawl-u": "Handgemenge", + "empathy-u": "Empathie", + "expression-u": "Ausdruck", + "intimidation-u": "Einsch?chtern", + "leadership-u": "F?hrungsqualit?ten", + "subterfuge-u": "Ausfl?chte", + "streetwise-u": "Szenekenntnis", + "animalken-u": "Tierkunde", + "craft-u": "Handwerk", + "drive-u": "Fahren", + "etiquette-u": "Etikette", + "firearms-u": "Schusswaffen", + "larceny-u": "Diebstahl", + "melee-u": "Nahkampf", + "performance-u": "Vortrag", + "stealth-u": "Heimlichkeit", + "survival-u": "?berleben", + "academics-u": "Akademisches Wissen", "computer-u": "Computer", - "finance-u": "Finance", - "investigation-u": "Investigation", - "law-u": "Law", - "medicine-u": "Medicine", - "occult-u": "Occult", - "politics-u": "Politics", - "science-u": "Science", - "technology-u": "Technology", - "advantages-u": "Advantages", - "disciplines-u": "Disciplines", - "backgrounds-u": "Backgrounds", - "virtues-u": "Virtues", - "conscience-u": "Conscience", - "convinction-u": "Convinction", - "selfcontrol-u": "Self-Control", - "instinct-u": "Instinct", - "courage-u": "Courage", - "othertraits-u": "Other Traits", - "paths-u": "Paths", - "merits-u": "Merits", - "flaws-u": "Flaws", - "humanitypath-u": "Humanity/path", + "finance-u": "Finanzen", + "investigation-u": "Nachforschungen", + "law-u": "Gesetzeskenntnis", + "medicine-u": "Medizin", + "occult-u": "Okkultismus", + "politics-u": "Politik", + "science-u": "Naturwissenschaften", + "technology-u": "Technologie", + "advantages-u": "Vorteile", + "disciplines-u": "Disziplinen", + "backgrounds-u": "Hintergr?nde", + "virtues-u": "Tugenden", + "conscience-u": "Gewissen", + "convinction-u": "?berzeugung", + "selfcontrol-u": "Selbstbeherrschung", + "instinct-u": "Instinkt", + "courage-u": "Mut", + "othertraits-u": "Andere Eigenschaften", + "paths-u": "Pfad", + "merits-u": "Vorzug", + "flaws-u": "Schw?che", + "humanitypath-u": "Menschlichkeit/Pfad", "bearing-u": "Bearing:", - "willpower-u": "Willpower", - "bloodpool-u": "Blood Pool", - "pointsperturn-u": "Points Per Turn", - "dicepools-u": "Dice Pools", - "attributeability-u": "Attribute            Ability", - "health-u": "Health", - "bruised-u": "Bruised", - "hurt-u": "Hurt", - "injured-u": "Injured", - "wounded-u": "Wounded", - "mauled-u": "Mauled", - "crippled-u": "Crippled", - "incapacitated-u": "Incapacitated", - "weakness-u": "Weakness", + "willpower-u": "Willenskraft", + "bloodpool-u": "Blutvorrat", + "pointsperturn-u": "Blutpunkte pro Runde", + "dicepools-u": "W?rfelbecher", + "attributeability-u": "Attribut            F?higkeit", + "health-u": "Gesundheit", + "bruised-u": "Blaue Flecken", + "hurt-u": "Verletzt", + "injured-u": "Schwer verletzt", + "wounded-u": "Verwundet", + "mauled-u": "Schwer verwundet", + "crippled-u": "Verkr?ppelt", + "incapacitated-u": "Au?er Gefecht", + "weakness-u": "Clansschw?che", "experience-u": "Experience", - "notes-u": "Notes" + "notes-u": "Notizen" } \ No newline at end of file diff --git a/CWOD-W20/W20.html b/CWOD-W20/W20.html index dc101ea7ef..be988ad3d6 100644 --- a/CWOD-W20/W20.html +++ b/CWOD-W20/W20.html @@ -768,7 +768,7 @@ - + @@ -850,7 +850,7 @@ - + @@ -931,14 +931,14 @@ - - - - - - - - + + + + + + + + @@ -1012,7 +1012,7 @@ - + @@ -1093,7 +1093,7 @@ - + @@ -1178,7 +1178,7 @@ - + @@ -2269,18 +2269,19 @@ @@ -2316,18 +2317,19 @@ @@ -2363,18 +2365,19 @@ @@ -2410,18 +2413,19 @@ @@ -2457,18 +2461,19 @@ @@ -2504,18 +2509,19 @@ @@ -2551,18 +2557,19 @@ diff --git a/Call_of_Cthulhu_7th_Ed/translations/pt.json b/Call_of_Cthulhu_7th_Ed/translations/pt.json index 5e0e705e7c..f40a44d4f1 100644 --- a/Call_of_Cthulhu_7th_Ed/translations/pt.json +++ b/Call_of_Cthulhu_7th_Ed/translations/pt.json @@ -22,9 +22,9 @@ "majorwound-u": "", "pulphp-u": "", "luck-u": "Sorte", - "current": "current", + "current": "atual", "damagebonus-u": "Bônus de dano", - "None": "None", + "None": "Nenhum", "build-u": "Estrutura", "sanity-u": "Sanidade", "start": "start", @@ -99,7 +99,7 @@ "Fighting(Brawl)": "Fighting(Brawl)", "Firarms(HG)": "Firarms(HG)", "Firarms(R/S)": "Firarms(R/S)", - "Throw": "Throw", + "Throw": "Lançar", "Other Skill #1": "Other Skill #1", "Other Skill #2": "Other Skill #2", "Other Skill #3": "Other Skill #3", diff --git a/Call_of_Cthulhu_Spanish/translations/de.json b/Call_of_Cthulhu_Spanish/translations/de.json index 75de2a659a..64b8cab289 100644 --- a/Call_of_Cthulhu_Spanish/translations/de.json +++ b/Call_of_Cthulhu_Spanish/translations/de.json @@ -65,7 +65,7 @@ "own-language-u": "Muttersprache (EDU x5)", "mechanical-repair-u": "Mechanische Reparaturen (20%)", "medicine-u": "Medizin (05%)", - "cthulhu-mythos-u": "Cthulhu Mythos (00%)", + "cthulhu-mythos-u": "Cthulhu-Mythos (00%)", "swim-u": "Schwimmen (00%)", "conceal-u": "Tarnen (15%)", "hide-u": "Verbergen (10%)", @@ -87,12 +87,12 @@ "shotgun-u": "Schrotflinte (30%)", "submachine-gun-u": "Maschinenpistole (15%)", "other-skills-u": "Andere Fertigkeiten", - "time-area-u": "Time Area", - "art-u": "Art (05%)", - "all-ages-u": "anytime", + "time-area-u": "Zeitbereich", + "art-u": "Kunst (05 %)", + "all-ages-u": "jederzeit", "job-u": "Handwerk (05%)", "computer-u": "Computernutzung (00%)", - "90s-u": "1990s", + "90s-u": "1990er", "not-1890-u": "ab 1920er", "carriage-u": "Fahren Kutsche (20%)", "1890s-u": "Gaslicht", @@ -138,6 +138,6 @@ "heal-u": "Heilung", "weekly-u": "Wöchentlich", "objective-u": "Ziel", - "edition-u": "Game edition", + "edition-u": "Spiel Edition", "edition-info": "Choose between editions. If you are playing the 6e french edition, please, use the especific sheet, this isn't the one you're looking for. If you convert a game between editions, you will need to change the skills manually." } \ No newline at end of file diff --git a/Coriolis/translations/fr.json b/Coriolis/translations/fr.json index f10813b6db..0c13835de6 100644 --- a/Coriolis/translations/fr.json +++ b/Coriolis/translations/fr.json @@ -1,114 +1,114 @@ { - "tab-character": "Character", - "tab-characternotes": "Character Notes", - "tab-spaceship": "Spaceship", - "tab-spaceshipnotes": "Spaceship Notes", + "tab-character": "Personnage", + "tab-characternotes": "Notes - Personnage", + "tab-spaceship": "Vaisseau spatial", + "tab-spaceshipnotes": "Notes - Vaisseau spatial", "tab-scripts": "Scripts", - "title-character-u": "CHARACTER SHEET", - "title-characternotes-u": "CHARACTER NOTES", - "title-spaceship-u": "SPACESHIP SHEET", - "title-spaceshipnotes-u": "SPACESHIP NOTES", + "title-character-u": "FEUILLE DE PERSONNAGE", + "title-characternotes-u": "NOTES - PERSONNAGE", + "title-spaceship-u": "FEUILLE DE VAISSEAU", + "title-spaceshipnotes-u": "NOTES - VAISSEAU", "notes-u": "NOTES", - "modifiers-u": "MODIFIERS", - "modifiers-positive": "Positive", - "modifiers-negative": "Negative", - "attributes-u": "ATTRIBUTES", - "attributes-strength": "Strength", - "attributes-agility": "Agility", - "attributes-wits": "Wits", - "attributes-empathy": "Empathy", - "character-trauma-u": "TRAUMA", - "character-trauma-hitpoints-strength-plus-agility": "Hit Points (Str+Agi)", - "character-trauma-critical-injuries": "Critical Injuries:", - "character-trauma-mindpoints-wits-plus-empathy": "Mind points (Wits+Emp)", - "name": "Name:", - "character-background": "Background:", - "character-concept": "Concept:", - "character-icon": "Icon:", - "character-group-concept": "Group concept:", - "character-reputation": "Reputation:", - "character-personal-problem": "Personal Problem:", - "appearance-u": "Appearance", - "appearance-face": "Face:", - "appearance-clothing": "Clothing:", - "character-relationships-u": "RELATIONSHIPS", - "character-relationships-buddy-u": "BUDDY", - "radiation-u": "RADIATION", - "experience-u": "EXPERIENCE", - "character-skills-u": "SKILLS", - "character-skills-general-u": "GENERAL", - "character-skills-advanced-u": "ADVANCED", - "character-skills-dexterity-agility": "Dexterity (Agi)", - "character-skills-command-empathy": "Command (Emp)", - "character-skills-force-strength": "Force (Str)", + "modifiers-u": "MODIFICATEURS", + "modifiers-positive": "Positif", + "modifiers-negative": "Négatif", + "attributes-u": "ATTRIBUTS", + "attributes-strength": "Vigueur", + "attributes-agility": "Agilité", + "attributes-wits": "Astuce", + "attributes-empathy": "Empathie", + "character-trauma-u": "BLESSURES", + "character-trauma-hitpoints-strength-plus-agility": "Points de Vie (Vig+Agi)", + "character-trauma-critical-injuries": "Blessure critique :", + "character-trauma-mindpoints-wits-plus-empathy": "Points d'Esprit (Ast+Emp)", + "name": "Nom :", + "character-background": "Historique :", + "character-concept": "Concept :", + "character-icon": "Icône :", + "character-group-concept": "Concept de groupe :", + "character-reputation": "Réputation :", + "character-personal-problem": "Problème personnel :", + "appearance-u": "Apparence", + "appearance-face": "Visage :", + "appearance-clothing": "Vêtements :", + "character-relationships-u": "RELATIONS", + "character-relationships-buddy-u": "AMI", + "radiation-u": "IRRADIATION", + "experience-u": "EXPÉRIENCE", + "character-skills-u": "COMPÉTENCES", + "character-skills-general-u": "GÉNÉRALES", + "character-skills-advanced-u": "AVANCÉES", + "character-skills-dexterity-agility": "Dextérité (Agi)", + "character-skills-command-empathy": "Commandement (Emp)", + "character-skills-force-strength": "Force (Vig)", "character-skills-culture-empathy": "Culture (Emp)", "character-skills-infiltration-agility": "Infiltration (Agi)", - "character-skills-datadjinn-wits": "Data Djinn (Wit)", + "character-skills-datadjinn-wits": "Génie Numérique (Ast)", "character-skills-manipulation-empathy": "Manipulation (Emp)", - "character-skills-medicurgy-wits": "Medicurgy (Wit)", - "character-skills-meleecombat-strength": "Melee Combat (Str)", - "character-skills-mysticpowers-empathy": "Mystic Powers (Emp)", - "character-skills-observation-wits": "Observation (Wit)", - "character-skills-pilot-agility": "Pilot (Agi)", - "character-skills-rangedcombat-agility": "Ranged Combat (Agi)", - "character-skills-science-wits": "Science (Wit)", - "character-skills-survival-wits": "Survival (Wit)", - "character-skills-technology-wits": "Technology (Wit)", - "character-skills-talents-u": "TALENTS", - "carry-u": "CARRY", + "character-skills-medicurgy-wits": "Médirurgie (Ast)", + "character-skills-meleecombat-strength": "Mêlée (Vig)", + "character-skills-mysticpowers-empathy": "Pouvoirs Mystiques (Emp)", + "character-skills-observation-wits": "Observation (Ast)", + "character-skills-pilot-agility": "Pilotage (Agi)", + "character-skills-rangedcombat-agility": "Tir (Agi)", + "character-skills-science-wits": "Science (Ast)", + "character-skills-survival-wits": "Survie (Ast)", + "character-skills-technology-wits": "Technologie (Ast)", + "character-skills-talents-u": "DONS", + "carry-u": "TRANSPORT", "carry-max-u": "MAX", - "inventory-gear-u": "GEAR", + "inventory-gear-u": "EQUIPEMENT", "bonus-u": "BONUS", - "armor-u": "ARMOR", - "armor-rating-u": "RATING", - "comment-u": "COMMENT", - "comments-u": "COMMENTS", - "weapons-u": "WEAPONS", + "armor-u": "ARMURE", + "armor-rating-u": "SCORE", + "comment-u": "COMMENTAIRE", + "comments-u": "COMMENTAIRES", + "weapons-u": "ARMES", "init-initiative-u": "INIT", - "weapons-damage-u": "DAMAGE", + "weapons-damage-u": "DÉGÂTS", "weapons-crit-critical-u": "CRIT", - "weapons-range-u": "RANGE", - "weapons-reloads-u": "RELOADS", - "people-u": "PEOPLE I'VE MET", + "weapons-range-u": "PORTÉE", + "weapons-reloads-u": "RECHARGE", + "people-u": "PERSONNES RENCONTRÉES", "people-concept-u": "CONCEPT", - "characternotes-cabin-u": "MY CABIN", - "characternotes-cabin-description": "Description:", - "characternotes-cabin-gear": "Gear:", - "characternotes-cabin-other": "Other:", - "tiny-items-u": "TINY ITEMS", - "characternotes-money-birr-u": "Birr:", - "spaceship-class": "Class & Type:", - "spaceship-shipyard": "Shipyard:", - "spaceship-problem": "Problem:", - "spaceship-debt": "Debt", - "spaceship-data-u": "DATA", - "spaceship-data-maneuverability": "Maneuverability", + "characternotes-cabin-u": "MA CABINE", + "characternotes-cabin-description": "Description :", + "characternotes-cabin-gear": "Equipement :", + "characternotes-cabin-other": "Autre :", + "tiny-items-u": "PETITS OBJETS", + "characternotes-money-birr-u": "Birrs :", + "spaceship-class": "Classe & Type :", + "spaceship-shipyard": "Chantier naval :", + "spaceship-problem": "Problème :", + "spaceship-debt": "Dette", + "spaceship-data-u": "DONNÉES", + "spaceship-data-maneuverability": "Manœuvrabilité", "spaceship-data-signature": "Signature", - "spaceship-data-speed": "Speed", - "spaceship-data-armor": "Armor", + "spaceship-data-speed": "Vitesse", + "spaceship-data-armor": "Armure", "spaceship-modules-u": "MODULES", - "spaceship-modules-disabled-u": "DISABLED", - "spaceship-modules-maximum": "Maximum number of modules", - "spaceship-energypoints-u": "ENERGY POINTS", - "spaceship-hullpoints-u": "HULL POINTS", - "spaceship-hullpoints-criticaldamage": "Critical Damage:", - "spaceship-features-u": "FEATURES", - "spaceship-skill-level-u": "Skill Level", - "spaceship-captain-u": "CAPTAIN", - "spaceship-pilot-u": "PILOT", - "spaceship-sensor-operator-u": "SENSOR OPERATOR", - "spaceship-gunner-u": "GUNNER", - "spaceship-engineer-u": "ENGINEER", - "spaceshipnotes-log-u": "SHIP'S LOG", + "spaceship-modules-disabled-u": "HORS SERVICE", + "spaceship-modules-maximum": "Nombre maximum de modules", + "spaceship-energypoints-u": "POINTS D'ENERGIE", + "spaceship-hullpoints-u": "POINTS DE COQUE", + "spaceship-hullpoints-criticaldamage": "Dégâts critiques :", + "spaceship-features-u": "FONCTIONNALITES", + "spaceship-skill-level-u": "Niveau de Compétence", + "spaceship-captain-u": "CAPITAINE", + "spaceship-pilot-u": "PILOTE", + "spaceship-sensor-operator-u": "OPÉRATEUR DE SENSEURS", + "spaceship-gunner-u": "ARTILLEUR", + "spaceship-engineer-u": "INGENIEUR", + "spaceshipnotes-log-u": "JOURNAL DE BORD", "spaceshipnotes-log-coriolis-cycles-segment-u": "CC/SEGMENT", "spaceshipnotes-log-route-u": "ROUTE", "spaceshipnotes-log-danger-u": "DANGER", - "spaceshipnotes-cargo-u": "CARGO AND GEAR", - "rolltemplate-autofail": "Missing skill point in advanced skill. Automatic fail.", - "rolltemplate-dice-pool": "Dice pool is 0 or less.
Rolling 2d6 instead.", - "rolltemplate-difficult-fail": "Difficult Roll Failure.", - "rolltemplate-difficult-success": "Difficult Roll Success.", - "rolltemplate-fail": "Failure.", - "rolltemplate-limitedsuccess": "Limited Success.", - "rolltemplate-criticalsuccess": "Critical Success." + "spaceshipnotes-cargo-u": "CARGAISON ET EQUIPEMENT", + "rolltemplate-autofail": "Absence de point de compétence avancée. Échec automatique.", + "rolltemplate-dice-pool": "Total des dé de 0 ou moins.
Lancement de 2D6.", + "rolltemplate-difficult-fail": "Échec au Jet Difficile.", + "rolltemplate-difficult-success": "Réussite au Jet Difficile.", + "rolltemplate-fail": "Échec.", + "rolltemplate-limitedsuccess": "Réussite limitée.", + "rolltemplate-criticalsuccess": "Réussite critique." } \ No newline at end of file diff --git a/CthulhuTech_1ed/CthulhuTech_1_ed.css b/CthulhuTech_1ed/CthulhuTech_1_ed.css index 37b60ba53b..9e686b5c67 100644 --- a/CthulhuTech_1ed/CthulhuTech_1_ed.css +++ b/CthulhuTech_1ed/CthulhuTech_1_ed.css @@ -545,7 +545,7 @@ input.sheet-tager_human:checked ~ div.sheet-tager_block } .sheet-arcane_green { width:275px; - background: url('http://pre08.deviantart.net/7350/th/pre/i/2011/345/6/f/arcane_circles_by_todachan96-d4it7ff.jpg'); + background: url('https://78.media.tumblr.com/2326815cab68c1ec514ce60fff9b3f49/tumblr_pderycBCGy1s9slulo1_1280.jpg'); background-size: 400px; border-radius:15px; padding:2px; @@ -1253,8 +1253,8 @@ input.sheet-shadow[type="radio"]:checked ~ input.sheet-shadow[type="radio"] + sp .sheet-feat_button button[type="roll"], .sheet-feat_button { border-radius: 5px; - height: 25px; - width: 80px; + height: 20px; + width: 70px; font-weight:bold; margin: 0; background: transparent; @@ -1289,8 +1289,8 @@ input.sheet-shadow[type="radio"]:checked ~ input.sheet-shadow[type="radio"] + sp .sheet-tager_block .sheet-feat_button button[type="roll"], .sheet-tager_block .sheet-feat_button { border-radius: 5px; - height: 25px; - width: 80px; + height: 20px; + width: 70px; font-weight:bold; margin: 0px; background: #b30000; diff --git a/CthulhuTech_1ed/CthulhuTech_1_ed.html b/CthulhuTech_1ed/CthulhuTech_1_ed.html index ecf3f71ec2..1c058ab54c 100644 --- a/CthulhuTech_1ed/CthulhuTech_1_ed.html +++ b/CthulhuTech_1ed/CthulhuTech_1_ed.html @@ -152,7 +152,7 @@
-
+
@@ -182,7 +182,7 @@
-
+
Name
@@ -242,7 +242,7 @@
Monster Name
-
+
@@ -252,7 +252,7 @@ - + @@ -297,7 +297,7 @@
-
+
Feat
@@ -307,7 +307,7 @@ - + @@ -395,7 +395,7 @@
Feat
-
+
@@ -460,7 +460,7 @@
-
+
@@ -535,7 +535,7 @@ - - - + @@ -230,7 +230,7 @@ - + @@ -265,12 +265,12 @@ @@ -360,7 +360,7 @@ @@ -1993,7 +1971,7 @@

Flesh

- +   @@ -581,7 +581,7 @@

Light

- +   @@ -631,7 +631,7 @@

Moderate

- +   @@ -677,7 +677,7 @@

Serious

- +   @@ -726,7 +726,7 @@

Death's Door

- +   @@ -794,7 +794,7 @@

Flesh

- +   @@ -840,7 +840,7 @@

Light

- +   @@ -862,7 +862,6 @@
- @@ -889,7 +888,7 @@

Moderate

- +   @@ -934,7 +933,8 @@

Serious

+ +   @@ -982,8 +982,8 @@

Death's Door

- + +   @@ -7084,7 +7084,7 @@

Cosmetic

- +   @@ -7130,7 +7130,7 @@

Light

- +   @@ -7180,7 +7180,7 @@

Moderate

- +   @@ -7226,7 +7226,7 @@

Serious

- +   @@ -7274,6 +7274,7 @@

Critical

+   @@ -7348,6 +7349,7 @@

Cosmetic

+   @@ -7393,6 +7395,7 @@

Light

+   @@ -7414,7 +7417,6 @@
- @@ -7441,6 +7443,7 @@

Moderate

+   @@ -7486,6 +7489,7 @@

Serious

+   @@ -7533,6 +7537,7 @@

Critical

+   diff --git a/D6StarWars/D6StarWars.css b/D6StarWars/D6StarWars.css index 317ee55365..aab10cc60f 100644 --- a/D6StarWars/D6StarWars.css +++ b/D6StarWars/D6StarWars.css @@ -10,7 +10,7 @@ } .charsheet .sheet-version::after { - content: 'Sheet Version 1.71'; + content: 'Sheet Version 1.72'; } .charsheet label, h1, h2, h3{ diff --git a/D6StarWars/README.md b/D6StarWars/README.md index 22bf5ee918..9d7fd10be7 100644 --- a/D6StarWars/README.md +++ b/D6StarWars/README.md @@ -1,77 +1,129 @@ - D6-StarWars-Character-Sheet - =========================== +# D6-StarWars-Character-Sheet This is the Character sheet for the D6-Based WEG Star Wars and the new D6 Star Wars games. The sheet is geared to 2E and REUP as the rolls use wild die, but the option to disable wild die and others are on the top upcoming improvement. List your dice and pips next to the appropriate skills - 3pips equal another die. The text areas are expandable for additional info. -Wiki page for the sheet: - --------------->https://wiki.roll20.net/Star_Wars_WEG_D6_character_sheet<------------- - -Version 1.71 (2018-07-31): - Fix: - -Corrected Force Emptiness to scale properly with DarkSidePoints - -Version 1.70 (2018-07-24): - Layout: - -Made wound tracker wider - -Force section - New Feature: - -Under Force skills, space for powers and their roll buttons added - -Version 1.68 (2018-07-17): - Layout: - -remove empty gap on top of sheet - -improved layout in most sections - -added some tooltip info to menu settings - -Moved Backgorund section under Equipment Section - -Sheet version number & sheet type is now shown in corner - Fixes: - -corrected Lightsaber Combat dmg roll - -Force Emptiness bonus is now properly reduced by number of DSP - New Feature: - -added Resist Pain Force power(with sheet worker) - Other: - -code cleanup of some rolls - -removed all sheetworkers that where Gumshoe inmort and unnecessary - -updated preview - - - -Version 1.6 (2018-07-10): - -sheet customization menu added with these options: - -pc/npc sheet switch (condenced basic info block & equipment sections) - -hide/show gmroll buttons option (these rolls are whispered to GM) - -show/hide options for Force, Background & Equipment section - -Fixed Force Emptiness tracker (now able to change it's strength according to DSP) - -minor formatting - -some code cleanup - -Prior v1.6: - -Weapon section roll fixed (2018-02) - -Vehicle/Ship text blocks have been added to the bottom of the sheet(2018-02) - -"Lightsaber Combat" option added to the Force section so you can have your attack and damage rolls preset for "Lightsaber Combat" (2018-02) - -Unused Resist Pain attribute removed (2018-02) - -Added a Skill Section and Attack Button (weapon section) (2018-01-15) - -Increased the Size of the Medium Range to take triple digit numbers (weapon section) (2018-01-15) - -Weapon name is properly showed when damage is rolled from the sheet (2017-11) - -Perception skills and old weapons are back! (2017-11) - -All skills and attributes now rolls with a template and dice/pip mod can be given (2017-11) - -Armor section is working, rolls and all (2017-11) - -added tracker for permanent initiative bonus(some races have that) (2017-11) - -A initiative skill have been added to second section next to char points, with a roll that sends to tracker (2017-11) - -Custom rollers, with and without wild die have been added to same section (2017-11) - -Roller for char points have been added next to char point attribute (2017-11) - -Force and Background section can now be hidden with a checkbox each (2017-11) - -Resist pain in force section have been disabled for not working properly (2017-11) - -Duplicating text fields "character connections" <-> "other notes" is fixed (2017-11) - -Added attributes for wound levels, and trackers for force emptiness, number of force powers active and Resist Pain (2017-11-15) - -Added repeating armor section with soak rolls (2017-11) - -All attributes & skill roll using a template, taking wounds in considerations, and the player can additionally choose to include Dice/pip mods for the rolls (2017-11-15) - -Added missing Star Wars logo & black space background (2017-11-15) - -Checkbox to hide force section (2017-11-15) - -Change dice icon to d6 (2017-11-15) +[Wiki page for the sheet](https://wiki.roll20.net/Star_Wars_WEG_D6_character_sheet) Good source for all things D6 Star wars related, including fanmade conversions of campaign settings, forums and more: - --------------->http://www.d6holocron.com/<------------- \ No newline at end of file + +**--------------->[http://www.d6holocron.com/](http://www.d6holocron.com/)<-------------** + +## Sheet Versions + +### Version 1.72 (2018-08-22) + +- Readme formatting + +### Version 1.71 (2018-07-31) +**Fix:** + +- Corrected Force Emptiness to scale properly with DarkSidePoints + +### Version 1.70 (2018-07-24) +**Layout:** + +- Made wound tracker wider + +- Force section + +**New Feature:** + +- Under Force skills, space for powers and their roll buttons added + +### Version 1.68 (2018-07-17) +**Layout:** + +- remove empty gap on top of sheet + +- improved layout in most sections + +- added some tooltip info to menu settings + +- Moved Backgorund section under Equipment Section + +- Sheet version number & sheet type is now shown in corner + +**Fixes:** + +- corrected Lightsaber Combat dmg roll + +- Force Emptiness bonus is now properly reduced by number of DSP + +**New Feature:** + +- added Resist Pain Force power(with sheet worker) + +**Other:** + +- code cleanup of some rolls + +- removed all sheetworkers that where Gumshoe inmort and unnecessary + +- updated preview + +### Version 1.6 (2018-07-10) + +- sheet customization menu added with these options: + + - pc/npc sheet switch (condenced basic info block & equipment sections) + + - hide/show gmroll buttons option (these rolls are whispered to GM) + + - show/hide options for Force, Background & Equipment section + +- Fixed Force Emptiness tracker (now able to change it's strength according to DSP) + +- minor formatting + +- some code cleanup + +### Prior v1.6 + +- Weapon section roll fixed (2018-02) + +- Vehicle/Ship text blocks have been added to the bottom of the sheet(2018-02) + +- "Lightsaber Combat" option added to the Force section so you can have your attack and damage rolls preset for "Lightsaber Combat" (2018-02) + +- Unused Resist Pain attribute removed (2018-02) + +- Added a Skill Section and Attack Button (weapon section) (2018-01-15) + +- Increased the Size of the Medium Range to take triple digit numbers (weapon section) (2018-01-15) + +- Weapon name is properly showed when damage is rolled from the sheet (2017-11) + +- Perception skills and old weapons are back! (2017-11) + +- All skills and attributes now rolls with a template and dice/pip mod can be given (2017-11) + +- Armor section is working, rolls and all (2017-11) + +- added tracker for permanent initiative bonus(some races have that) (2017-11) + +- A initiative skill have been added to second section next to char points, with a roll that sends to tracker (2017-11) + +- Custom rollers, with and without wild die have been added to same section (2017-11) + +- Roller for char points have been added next to char point attribute (2017-11) + +- Force and Background section can now be hidden with a checkbox each (2017-11) + +- Resist pain in force section have been disabled for not working properly (2017-11) + +- Duplicating text fields "character connections" <-> "other notes" is fixed (2017-11) + +- Added attributes for wound levels, and trackers for force emptiness, number of force powers active and Resist Pain (2017-11-15) + +- Added repeating armor section with soak rolls (2017-11) + +- All attributes & skill roll using a template, taking wounds in considerations, and the player can additionally choose to include Dice/pip mods for the rolls (2017-11-15) + +- Added missing Star Wars logo & black space background (2017-11-15) + +- Checkbox to hide force section (2017-11-15) + +- Change dice icon to d6 (2017-11-15) \ No newline at end of file diff --git a/Dark_Heresy/translations/ru.json b/Dark_Heresy/translations/ru.json index c2c905b86c..2aecac6ea5 100644 --- a/Dark_Heresy/translations/ru.json +++ b/Dark_Heresy/translations/ru.json @@ -89,11 +89,11 @@ "leftleg": "Левая Нога", "rightleg": "Правая Нога", "rangedweapons": "Дистанционное Оружие", - "range:": "Дистанция:", + "range:": "Дист:", "type:": "Тип:", "rof:": "РоФ:", "clip:": "Обойма:", - "reload:": "Перезарядка:", + "reload:": "Пер:", "gear": "Оборудование", "thronegelt:": "Троны: ", "income:": "Доход: ", diff --git a/Deadlands Classic/deadlandsclassic.css b/Deadlands Classic/deadlandsclassic.css index 2760701f1b..fb650477b4 100644 --- a/Deadlands Classic/deadlandsclassic.css +++ b/Deadlands Classic/deadlandsclassic.css @@ -156,6 +156,10 @@ margin: auto; } +.sheet-chiprow .sheet-item { + width: 8%; +} + .sheet-itemright { margin: auto; margin-right: 5px; @@ -386,14 +390,16 @@ textarea { .sheet-big input[type=radio], .sheet-location input[type=radio] { display: inline-block; - text-align: center; - position: relative; - left: 20px; - width: 25px; opacity: 0; + position: relative; + width: 30px; z-index: 2; } +.sheet-chiprow .sheet-buttons input[type=radio] { + top: 20px; +} + .sheet-big input[type=radio] + span { position: relative; left: -15px; @@ -408,13 +414,13 @@ textarea { .sheet-location input[type=radio]:hover + span, .sheet-location input[type=radio]:checked + span { color: white; - font-size: 1rem; + font-size: 1.5em; text-shadow: 1px 0 0 #000, 0 -1px 0 #000, 0 1px 0 #000, -1px 0 0 #000; } .sheet-buttons input[type=radio] + span { font-weight: bolder; - font-size: 1rem; + font-size: 1.2em; } .sheet-buttonsred input[type=radio]:hover + span, @@ -461,6 +467,31 @@ textarea { left: 5px; } +.sheet-weapon-headers .sheet-wea-label { + width: 13%; +} + +.sheet-weapon-headers .sheet-wea-label:nth-of-type(3) { + width: 4%; +} + +.sheet-weapon-headers .sheet-wea-label:nth-of-type(4) { + width: 5%; +} + +.sheet-weapon .sheet-large { + text-align: left; + width: 5%; +} + +.sheet-weapon .sheet-large input[type=text] { + text-align: center; +} + +.sheet-weapon .sheet-xxxlarge input[type=text] { + width: 39%; +} + .sheet-xxxlarge .sheet-xxhuge { padding-bottom: 5px; } @@ -470,12 +501,23 @@ textarea { float: right; } +.sheet-location input[type=radio] { + height: 25px; + margin-right: -27px; +} + +.sheet-location input[type=radio]:last-child, +.sheet-location input[type=radio]:last-child + span { + margin-left: 10px; +} + .sheet-location label { display: inline; margin-right: -10px; } .sheet-location span { + padding: 5px; font-weight: bolder; } @@ -486,4 +528,30 @@ textarea { .sheet-rolltemplate-default table { border-color: #6d4b3e; +} + +.sheet-xxxlarge .repcontrol .repcontrol_edit { + position: relative; + left: 30px; + width: 40%; + top: 25px; + z-index: 3; +} + +.sheet-xxxlarge .repcontrol .repcontrol_edit:after { + position: relative; + left: -35px; +} + +.sheet-xxxlarge .repcontrol .repcontrol_add { + position: relative; + width: 40%; +} + +.sheet-xxxlarge .repcontrol .repcontrol_add:after { + +} + +.sheet-arcane-row .sheet-item { + vertical-align: top; } \ No newline at end of file diff --git a/Deadlands Classic/deadlandsclassic.html b/Deadlands Classic/deadlandsclassic.html index e0bce247cb..167972aa89 100644 --- a/Deadlands Classic/deadlandsclassic.html +++ b/Deadlands Classic/deadlandsclassic.html @@ -119,25 +119,25 @@
Pace: - +
Size: - +
Max Wind: - +
Grit: - +
@@ -145,48 +145,74 @@
Fate Chips
-
-
-
White Chips
+
+
+
+
White Chips
+
+
+
+ 0 +
+
+ 1 +
+
+ 2 +
+
+ 3 +
+
+ 4 +
+
+ 5 +
+
+ 6 +
+
+ 7 +
+
+ 8 +
+
+ 9 +
+
+ 10 +
+
-
-
- 0 +
+
+
Legend Chips
-
- 1 -
-
- 2 -
-
- 3 -
-
- 4 -
-
- 5 -
-
- 6 -
-
- 7 -
-
- 8 -
-
- 9 -
-
- 10 +
+
+ 0 +
+
+ 1 +
+
+ 2 +
+
+ 3 +
+
+ 4 +
+
+ 5 +
-
-
+
Red Chips
@@ -210,6 +236,21 @@
5
+
+ 6 +
+
+ 7 +
+
+ 8 +
+
+ 9 +
+
+ 10 +
@@ -232,28 +273,28 @@
4
-
-
-
-
-
Legend Chips
-
-
-
- 0 +
+ 5
-
- 1 +
+ 6
-
- 2 +
+ 7 +
+
+ 8 +
+
+ 9 +
+
+ 10
-
-
Common Rolls
@@ -262,7 +303,7 @@
- +
@@ -1375,6 +1416,186 @@

+
+
Shootin Irons & Such
+
+
+
+
+
+
+
+
+ On + Off +
+
+
+
+
+
/ +
+
+
+
+ + + + +
+
+
+
+
+
+
+
+
Hand-To-Hand Weapons
+
+
+
+
+
+
+
+ On + Off +
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
Arcane Abilities
+
+
+
+
+
Ritual
+
+ +
+
Rituals
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+ + +
+
+
+
+
+

Edges

+
+
+
+
+ +
+
+
+
+
+

Hindrances

+
+
+
+
+ +
+
+
+
+
+
+
+

Equipment

+
+
+ +
+
+
+
+

Money

+
+
+ +
+
+
+
+
+
+

Your Worst Nightmare

+
+
+ +
+
+
+
+

Character Notes

+
+
+ +
+
+
+
+
+ +
+
+
+
+ This sheet has been recently updated. This section was broke and has been made obsolete. Data on this tab will be removed over time. +
+
+
Shootin Irons & Such
@@ -1558,362 +1779,5 @@
- - -
-
-
Arcane Abilities
-
-
-
-
-
Ritual
-
- -
-
Rituals
-
- -
-
-
-
-
-
-
-
-
-
-
- -
-
- - - -
-
-
-
-
-

Edges

-
-
-
-
- -
-
-
-
-
-

Hindrances

-
-
-
-
- -
-
-
-
-
-
-
-

Equipment

-
-
- -
-
-
-
-

Money

-
-
- -
-
-
-
-
-
-

Your Worst Nightmare

-
-
- -
-
-
-
-

Character Notes

-
-
- -
-
-
-
-
- - - -
-
-
-
- This sheet has been recently updated. Some fields have been obsoleted. Please review and ensure your information is correct.
- Data on this tab will be removed over time. It is obsolete fields from the orginal Kevin Justus sheet design. -
-
-
-
-
-
Shootin Irons & Such
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Weapon

Shots

RoF

Range

Damage

-
-
Hand-To-Hand Weapons
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -

Weapon

Defense

Speed

Damage

- - - - - - - -
- - - - - - - -
- - - - - - - -
-
-
-
-
-
-
Ammo One
-
-
0
-
1
-
2
-
3
-
4
-
5
-
6
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
Ammo Two
-
-
-
0
-
1
-
2
-
3
-
4
-
5
-
6
-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
- - - -
-
Ammo Three
-
-
-
0
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
- -
\ No newline at end of file +
\ No newline at end of file diff --git a/Dungeon_World_Official/translations/de.json b/Dungeon_World_Official/translations/de.json index 4f3a60dfde..7709b8c5b6 100644 --- a/Dungeon_World_Official/translations/de.json +++ b/Dungeon_World_Official/translations/de.json @@ -8,7 +8,7 @@ "tags:": "Eigenschaften: ", "tags": "Eigenschaften", "attack-name": "Name des Angriffs", - "1d8+2": "1d8+2", + "1d8+2": "1W8+2", "zero-piercing": "Durchdringung 0", "hp-u": "TP", "attack-reach": "Reichweite", @@ -59,7 +59,7 @@ "moves-u": "SPIELZÜGE", "move-name": "Spielzug-Name:", "move-trigger": "Auslöser:", - "roll1d61d8formoves": "Roll 1d6+1d8 for Moves", + "roll1d61d8formoves": "Würfel 1W6+1W8 für bewegen", "move-roll": "Würfelwurf:", "ask-u": "MANUELL", "move-success": "Voller Erfolg (10+):", @@ -70,7 +70,7 @@ "gear-u": "AUSRÜSTUNG", "load-u": "TRAGKR.", "gear-name": "Name des Gegenstands:", - "gear-tags": "Gear Tags:", + "gear-tags": "Ausrüstungskennzeichen:", "value:": "Wert:", "qty:": "Anz:", "weight:": "Gewicht:", diff --git a/EngineHeart/.gitignore b/EngineHeart/.gitignore new file mode 100644 index 0000000000..3c3629e647 --- /dev/null +++ b/EngineHeart/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/EngineHeart/GruntFile.js b/EngineHeart/GruntFile.js new file mode 100644 index 0000000000..1d4f65dc5c --- /dev/null +++ b/EngineHeart/GruntFile.js @@ -0,0 +1,51 @@ +module.exports = function(grunt) { + grunt.initConfig({ + less: { + default: { + files: { + 'sheet.css': 'less/index.less' + } + } + }, + pug: { + default: { + files: { + 'sheet.html': 'pug/index.pug' + }, + options: { + pretty: true + } + } + }, + 'string-replace': { + default: { + files: { + 'sheet.css': 'sheet.css' + }, + options: { + replacements: [ + { + pattern: /,\n/g, + replacement: ', ' + }, + { + pattern: /\.((?!charsheet)[^ .\n]+)(?=.+\{)/g, + replacement: function(match, p1) { + if(p1 === 'itemcontrol' || p1 === 'repcontrol') + return '.' + p1; + else + return '.sheet-' + p1; + } + } + ] + } + } + } + }); + + grunt.loadNpmTasks('grunt-contrib-less'); + grunt.loadNpmTasks('grunt-contrib-pug'); + grunt.loadNpmTasks('grunt-string-replace'); + + grunt.registerTask('default', ['less', 'pug', 'string-replace']); +}; diff --git a/EngineHeart/README.md b/EngineHeart/README.md new file mode 100644 index 0000000000..b1c96198f6 --- /dev/null +++ b/EngineHeart/README.md @@ -0,0 +1,11 @@ +# Engine Heart + +This is a character sheet for the Kickstarter-funded system Engine Heart, a +post-apocalyptic game where humans left Earth. Now the little appliance robots +that were left behind fend for themselves, doing the best they can. + +Engine Heart official web site: http://www.viralgamespublishing.com/2.html + +Icon graphics used with permission from Viral Games. + +Please enjoy! diff --git a/EngineHeart/img/iconChassis.png b/EngineHeart/img/iconChassis.png new file mode 100644 index 0000000000..71d22d29f0 Binary files /dev/null and b/EngineHeart/img/iconChassis.png differ diff --git a/EngineHeart/img/iconCrux.png b/EngineHeart/img/iconCrux.png new file mode 100644 index 0000000000..9f99b86161 Binary files /dev/null and b/EngineHeart/img/iconCrux.png differ diff --git a/EngineHeart/img/iconIntelligence.png b/EngineHeart/img/iconIntelligence.png new file mode 100644 index 0000000000..1534de089e Binary files /dev/null and b/EngineHeart/img/iconIntelligence.png differ diff --git a/EngineHeart/img/iconMovement.png b/EngineHeart/img/iconMovement.png new file mode 100644 index 0000000000..a06614e751 Binary files /dev/null and b/EngineHeart/img/iconMovement.png differ diff --git a/EngineHeart/img/iconPhysicalInteraction.png b/EngineHeart/img/iconPhysicalInteraction.png new file mode 100644 index 0000000000..54747f3d1a Binary files /dev/null and b/EngineHeart/img/iconPhysicalInteraction.png differ diff --git a/EngineHeart/img/iconThresholds.png b/EngineHeart/img/iconThresholds.png new file mode 100644 index 0000000000..d16a54d823 Binary files /dev/null and b/EngineHeart/img/iconThresholds.png differ diff --git a/EngineHeart/js/worker.js b/EngineHeart/js/worker.js new file mode 100644 index 0000000000..6618e7a220 --- /dev/null +++ b/EngineHeart/js/worker.js @@ -0,0 +1,291 @@ +/** + * Forces an update on a list of numerical fields, also making sure that + * any undefined fields are set to 0. + * @param {string[]} attrs + * @param {function} cb + */ +function forceUpdate(attrs, cb) { + parseAttrs(attrs, values => { + let tempValues = {}; + _.each(attrs, attr => { + tempValues[attr] = -9999; + }); + setAttrs(tempValues); + setAttrs(values); + }); +} + + +function onChange(attrs, cb) { + attrs = _.map(attrs, attr => { + return 'change:' + attr; + }).join(' '); + on(attrs, cb); +} + +function onChangeParse(attrs, cb) { + onChange(attrs, () => { + parseAttrs(attrs, cb); + }); +} + +/** + * Gets the specified attributes and parses them as an integer or 0. + */ +function parseAttrs(attrs, cb) { + getAttrs(attrs, function(values) { + _.each(attrs, function(attr) { + if(_.isUndefined(values[attr])) + values[attr] = 0; + else if(!isNaN(values[attr])) + values[attr] = parseInt(values[attr]); + }); + cb(values); + }); +} + +/** + * Updates the roll calculation for an attribute. + * @param {string} attr + */ +function updateAttribute(attr) { + parseAttrs([attr, attr + '_mod'], values => { + let rating = parseInt(values[attr]); + let mod = parseInt(values[attr + '_mod']) || 0; + let total = rating + mod; + let calc = `(${total})d10>?{Target Number (TN)}`; + setAttrs({ + [attr + '_calc']: calc, + [attr + '_total']: total + }); + }); +} + +function updateRcom() { + updateAttribute('rcom'); +} +function updateHcom() { + updateAttribute('hcom'); +} +function updateDcon() { + updateAttribute('dcon'); +} +function updateMcon() { + updateAttribute('mcon'); +} + +function updateDex() { + updateAttribute('dex'); +} +function updateMobil() { + updateAttribute('mobil'); +} +function updatePer() { + updateAttribute('per'); +} +function updateRef() { + updateAttribute('ref'); +} +function updateStr() { + updateAttribute('str'); +} + +function updateDur() { + updateAttribute('dur'); +} +function updateBuf() { + updateAttribute('buf'); +} +function updateSize() { + updateAttribute('size'); +} +function updatePow() { + updateAttribute('pow'); +} + +function updateAllAttributes() { + updateRcom(); + updateHcom(); + updateDcon(); + updateMcon(); + + updateDex(); + updateMobil(); + updatePer(); + updateRef(); + updateStr(); + + updateDur(); + updateBuf(); + updateSize(); + updatePow(); +} + +function updateIntPool() { + parseAttrs(['dex_total', 'ref_total', 'intPool_mod'], values => { + let dex_total = parseInt(values['dex_total']); + let ref_total = parseInt(values['ref_total']); + let intPool_mod = parseInt(values['intPool_mod']) || 0; + + let intPool = dex_total + ref_total; + let intPool_total = intPool + intPool_mod; + let intPool_calc = `(${intPool_total})d10>?{Target Number (TN)}`; + setAttrs({ intPool, intPool_calc, intPool_total }); + }); +} + +function updateTn2bStruck() { + parseAttrs(['mobil_total', 'ref_total', 'tn2bStruck_mod'], values => { + let mobil_total = parseInt(values['mobil_total']); + let ref_total = parseInt(values['ref_total']); + let tn2bStruck_mod = parseInt(values['tn2bStruck_mod']) || 0; + + let tn2bStruck = mobil_total + ref_total; + let tn2bStruck_total = tn2bStruck + tn2bStruck_mod; + setAttrs({ tn2bStruck, tn2bStruck_total }); + }); +} + +function updateDmgFromStrike() { + parseAttrs(['str_total', 'dmgFromStrike_mod'], values => { + let str_total = parseInt(values['str_total']); + let dmgFromStrike_mod = parseInt(values['dmgFromStrike_mod']) || 0; + + let dmgFromStrike = Math.floor(str_total/2); + let dmgFromStrike_total = dmgFromStrike + dmgFromStrike_mod; + setAttrs({ dmgFromStrike, dmgFromStrike_total }); + }); +} + +function updateInitiative() { + parseAttrs(['ref_total', 'initiative_mod'], values => { + let ref_total = parseInt(values['ref_total']); + let initiative_mod = parseInt(values['initiative_mod']) || 0; + + let initiative = ref_total; + let initiative_total = initiative + initiative_mod; + let initiative_calc = `1d10 + ${initiative_total}`; + setAttrs({ initiative, initiative_total, initiative_calc }); + }); +} + +function updateSpeed() { + parseAttrs(['mobil_total', 'ref_total', 'speed_mod'], values => { + let mobil_total = parseInt(values['mobil_total']); + let ref_total = parseInt(values['ref_total']); + let speed_mod = parseInt(values['speed_mod']) || 0; + + let speed = mobil_total + ref_total; + let speed_total = speed + speed_mod; + setAttrs({ speed, speed_total }); + }); +} + +function updateOsThreshold() { + parseAttrs(['dcon_total', 'buf_total'], values => { + let dcon_total = parseInt(values['dcon_total']); + let buf_total = parseInt(values['buf_total']); + + let osThreshold_max = dcon_total + buf_total; + setAttrs({ osThreshold_max }); + }); +} + +function updateDmgThreshold() { + parseAttrs(['dur_total', 'size_total'], values => { + let dur_total = parseInt(values['dur_total']); + let size_total = parseInt(values['size_total']); + + let dmgThreshold_max = dur_total + size_total; + setAttrs({ dmgThreshold_max }); + }); +} + +// Change events +onChange(['rcom', 'rcom_mod'], () => { + updateRcom(); +}); + +onChange(['hcom', 'hcom_mod'], () => { + updateHcom(); +}); + +onChange(['dcon', 'dcon_mod'], () => { + updateDcon(); +}); + +onChange(['mcon', 'mcon_mod'], () => { + updateMcon(); +}); + +onChange(['dex', 'dex_mod'], () => { + updateDex(); +}); + +onChange(['mobil', 'mobil_mod'], () => { + updateMobil(); +}); + +onChange(['per', 'per_mod'], () => { + updatePer(); +}); + +onChange(['ref', 'ref_mod'], () => { + updateRef(); +}); + +onChange(['str', 'str_mod'], () => { + updateStr(); +}); + +onChange(['dur', 'dur_mod'], () => { + updateDur(); +}); + +onChange(['buf', 'buf_mod'], () => { + updateBuf(); +}); + +onChange(['size', 'size_mod'], () => { + updateSize(); +}); + +onChange(['pow', 'pow_mod'], () => { + updatePow(); +}); + +onChange(['dex_total', 'ref_total', 'intPool_mod'], () => { + updateIntPool(); +}); + +onChange(['mobil_total', 'ref_total', 'tn2bStruck_mod'], () => { + updateTn2bStruck(); +}); + +onChange(['str_total', 'dmgFromStrike_mod'], () => { + updateDmgFromStrike(); +}); + +onChange(['ref_total', 'initiative_mod'], () => { + updateInitiative(); +}); + +onChange(['mobil_total', 'ref_total', 'speed_mod'], () => { + updateSpeed(); +}); + +onChange(['dcon_total', 'buf_total'], () => { + updateOsThreshold(); +}); + +onChange(['dur_total', 'size_total'], () => { + updateDmgThreshold(); +}); + +// Init +on('sheet:opened', () => { + setAttrs({ + character_sheet: 'EngineHeart v1.0.0' + }); + updateAllAttributes(); +}); diff --git a/EngineHeart/less/fields.less b/EngineHeart/less/fields.less new file mode 100644 index 0000000000..f64fa04650 --- /dev/null +++ b/EngineHeart/less/fields.less @@ -0,0 +1,255 @@ +input { + border: none; + box-shadow: none; + + &[type=number]::-webkit-inner-spin-button, &[type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; + } +} + +select { + box-shadow: none; + height: auto; + line-height: 18px; + margin-bottom: 0; + -moz-appearance: none; + -webkit-appearance: none; +} + +textarea { + background: linear-gradient(to bottom, transparent, transparent 17px, #000); + background-attachment: local; + background-size: 1px 18px; + border: none; + box-shadow: none; + padding: 0; + resize: none; +} + +.bubble { + display: inline-block; + height: 50px; + position: relative; + width: 48px; + + label { + bottom: -16px; + font-size: 10px; + left: 50%; + padding: 0; + position: absolute; + transform: translateX(-50%); + width: auto; + } + + .inner { + border: solid 3px black; + border-radius: 32px; + height: 32px; + left: 50%; + overflow: hidden; + position: absolute; + text-align: center; + transform: translateX(-50%); + width: 32px; + + input { + background: transparent; + line-height: 32px; + max-height: 32px; + max-width: 32px; + text-align: center; + vertical-align: middle; + } + + .readOnly { + background: #ccc; + display: inline-block; + height: 32px; + line-height: 32px; + width: 32px; + } + } +} + +.fieldBox { + background: #000; + border: solid 1px #000; + display: inline-block; + position: relative; + + label { + position: absolute; + font-size: 0.75em; + line-height: 0.75em; + top: 110%; + } + + .inner input { + border: none; + border-radius: 0 + display: inline; + text-align: center; + } +} + +.labelledAbove { + display: inline-block; + + label { + font-size: 0.8em; + margin-bottom: 0; + padding-top: 0.5em; + } +} + +.labelledBoxH { + background: #000; + border: solid 1px #000; + border-radius: 0.5em; + display: inline-block; + overflow: hidden; + + & > label { + background: #000; + color: #fff; + display: inline; + font-weight: bold; + padding: 0 0.25em; + vertical-align: middle; + } + + & > .inner { + background: #fff; + display: inline-block; + float: right; + vertical-align: middle; + + & > * { + vertical-align: middle; + } + + .fraction { + background: #fff; + display: inline-block; + + input { + border: none; + display: inline; + } + } + } +} + +.labelledBoxV { + background: #000; + border: solid 1px #000; + border-radius: 0.5em; + display: inline-block; + overflow: hidden; + + & > label { + background: #000; + color: #fff; + display: inline-block; + font-weight: bold; + margin: 0; + padding: 0; + text-align: center; + } + + & > .inner { + background: #fff; + text-align: center; + width: 100%; + + input { + text-align: center; + width: 100%; + } + + .fraction { + background: #fff; + display: inline-block; + + input { + border: none; + display: inline; + } + } + } +} + +.labelledLeft { + display: inline-block; + margin-bottom: 1em; + min-width: 0.45in; + position: relative; + + label { + display: inline-block; + margin-bottom: 0; + padding-right: 2px; + width: auto; + vertical-align: bottom + } + + .inner { + border-bottom: solid 2px #000; + display: inline-block; + vertical-align: bottom; + + input { + background: transparent; + padding: 0; + transform: translateY(2px); + } + } +} + +.labelledUnderlined { + display: inline-block; + margin-bottom: 1em; + min-width: 0.45in; + position: relative; + + label { + position: absolute; + font-size: 0.75em; + line-height: 0.75em; + top: 110%; + } + + .inner { + border-bottom: solid 1px #000; + width: 100%; + + input { + border: none; + border-radius: 0; + padding-bottom: 0; + width: 100%; + } + + select { + border: none; + border-radius: 0; + padding-bottom: 0; + width: 100%; + } + + .readOnlyBox { + padding: 0; + padding-top: initial; + width: 100%; + } + } +} + +.mathOperator { + display:inline-block; + margin-bottom: 0.5em; + padding-left: 0.25em; + padding-right: 0.25em; +} diff --git a/EngineHeart/less/index.less b/EngineHeart/less/index.less new file mode 100644 index 0000000000..3a3ec38053 --- /dev/null +++ b/EngineHeart/less/index.less @@ -0,0 +1,237 @@ +@import "rolltemplate.less"; + +.charsheet { + background: #fff; + height: 100%; + width: 9in; + + @import "fields.less"; + + .column { + display: inline-block; + } + + .inlineBlock { + display: inline-block; + } + + .attributes { + margin-bottom: 32px; + width: 100%; + + .attribute { + position: relative; + + button { + height: 100%; + opacity: 0; + position: absolute; + right: 0; + top: 0; + width: 40%; + z-index: 10; + } + + & > label { + position: absolute; + left: 55%; + top: 15%; + width: auto; + + &::before { + content: "0"; + font-family: dicefontd10; + font-size: 32px; + vertical-align: middle; + } + } + } + + .column { + vertical-align: top; + width: 33%; + } + } + + .attrsHeader { + margin-bottom: 10px; + + h2 { + display: inline-block; + line-height: 1em; + max-width: 2in; + vertical-align: middle; + } + + .boxedIcon { + display: inline-block; + height: 60px; + vertical-align: middle; + width: 60px; + + &.iconChassis { + background: url("https://raw.githubusercontent.com/Cazra/roll20-character-sheets/engineHeart/EngineHeart/img/iconChassis.png"); + } + + &.iconCrux { + background: url("https://raw.githubusercontent.com/Cazra/roll20-character-sheets/engineHeart/EngineHeart/img/iconCrux.png"); + } + + &.iconIntelligence { + background: url("https://raw.githubusercontent.com/Cazra/roll20-character-sheets/engineHeart/EngineHeart/img/iconIntelligence.png"); + } + + &.iconMovement { + background: url("https://raw.githubusercontent.com/Cazra/roll20-character-sheets/engineHeart/EngineHeart/img/iconMovement.png"); + } + + &.iconPhysicalInteraction { + background: url("https://raw.githubusercontent.com/Cazra/roll20-character-sheets/engineHeart/EngineHeart/img/iconPhysicalInteraction.png"); + } + + &.iconThresholds { + background: url("https://raw.githubusercontent.com/Cazra/roll20-character-sheets/engineHeart/EngineHeart/img/iconThresholds.png"); + } + } + } + + .featuresDefects { + margin-bottom: 32px; + + table { + font-size: 10px; + margin-left: 8px; + width: 100%; + + th:nth-child(1) { + width: 30%; + } + + th:nth-child(2) { + width: 10%; + } + } + + .feature, .defect { + input { + border-bottom: solid 1px black; + border-radius: 0; + padding: 0; + vertical-align: top; + } + + textarea { + height: 1.5em; + margin-top: 1px; + resize: vertical; + vertical-align: top; + } + + input:nth-child(1) { + width: 30%; + } + + input:nth-child(2) { + width: 10%; + } + + textarea:nth-child(3) { + width: 55%; + } + } + } + + .secondaryAttrs { + margin-bottom: 32px; + width: 100%; + + .attribute { + position: relative; + + & > label { + position: absolute; + left: 55%; + margin-left: 1.7em; + text-indent: -1.7em; + top: 15%; + width: auto; + } + + &.threshold { + & > label { + left: 37%; + } + } + } + + .column { + vertical-align: top; + width: 33%; + } + + .rollable { + position: relative; + + button { + height: 100%; + opacity: 0; + position: absolute; + right: 0; + top: 0; + width: 40%; + z-index: 10; + } + + .attribute { + & > label::before { + content: "0"; + font-family: dicefontd10; + font-size: 32px; + vertical-align: middle; + } + } + } + } + + .top { + width: 100%; + + .column.bio { + width: 80%; + + & > div { + width: 100%; + + .labelledLeft { + display: inline-table; + + label { + display: table-cell; + white-space: nowrap; + width: 1px; + } + + .inner { + display: table-cell; + + input { + width: 100%; + } + } + } + } + } + .column.points { + margin-left: 20px; + transform: scale(1.5); + width: 10%; + } + } + + .twoColumns { + .column { + vertical-align: top; + width: 49%; + } + } +} diff --git a/EngineHeart/less/rolltemplate.less b/EngineHeart/less/rolltemplate.less new file mode 100644 index 0000000000..d119b78e1a --- /dev/null +++ b/EngineHeart/less/rolltemplate.less @@ -0,0 +1,39 @@ +.rolltemplate-eh { + table { + background: #fff; + border: solid 2px #000; + border-collapse: separate; + border-radius: 0; + overflow: hidden; + width: 100%; + + thead th { + background: #000; + color: #fff; + padding: 0.5em 1em; + } + + tbody { + text-align: center; + + td { + padding: 0.5em 0; + + hr { + border-top: 1px solid #000; + margin: 2px; + } + } + + .crit { + font-weight: bold; + text-transform: uppercase; + } + + .notes { + font-size: 0.8em; + font-style: italic; + } + } + } +} diff --git a/EngineHeart/package.json b/EngineHeart/package.json new file mode 100644 index 0000000000..0485018a14 --- /dev/null +++ b/EngineHeart/package.json @@ -0,0 +1,9 @@ +{ + "name": "EngineHeart", + "devDependencies": { + "grunt": "^1.0.1", + "grunt-contrib-less": "^1.4.0", + "grunt-contrib-pug": "^1.0.0", + "grunt-string-replace": "^1.3.0" + } +} diff --git a/EngineHeart/pug/attributes.pug b/EngineHeart/pug/attributes.pug new file mode 100644 index 0000000000..8883838125 --- /dev/null +++ b/EngineHeart/pug/attributes.pug @@ -0,0 +1,40 @@ +include fields.pug + +mixin attribute(label, attr, title) + .attribute(title=title) + +rollButton(attr + '_calc') + +input('hidden', attr + '_calc') + label= label + +bubble('TOTAL'): +readOnly(attr + '_total') + +bubble('RATING'): +input('number', attr) + +bubble('MODIFIER'): +input('number', attr + '_mod') + +.attributes + .column + .attrsHeader + .boxedIcon.iconIntelligence + h2 INTELLIGENCE + .attrsInner + +attribute('RealityCom', 'rcom', 'Defines how well a robot understands cause and effect in the physical world.') + +attribute('HumanCom', 'hcom', 'Defines how well a robot understands human minds or organic actions.') + +attribute('DigiCon', 'dcon', 'Defines how adept a robot is at interacting with non-physical systems like computers.') + +attribute('MechaniCon', 'mcon', 'Defines how adept a robot is at interacting with mechanical systems.') + .column + .attrsHeader + .boxedIcon.iconChassis + h2 CHASSIS + .attrsInner + +attribute('Dexterity', 'dex', 'Measures the degree of fine motor control ncessary for interaction with the outside world.') + +attribute('Mobility', 'mobil', 'Dictates the robot\'s cability to propel itself about the environment.') + +attribute('Perception', 'per', 'Determines the variety and quality of sensors mounted, as well as information relayed back.') + +attribute('Reflexes', 'ref', 'Determines response lag and overall speed of animation.') + +attribute('Strength', 'str', 'Determines the robot\'s maximum load capacity and ability to inflict brute-force damage on other objects.') + .column + .attrsHeader + .boxedIcon.iconCrux + h2 CRUX + .attrsInner + +attribute('Durability', 'dur', 'Measures how much damage a robot can withstand before ceasing operation or being destroyed.') + +attribute('Buffer', 'buf', 'Rates the robot\'s ability to withstand information overload.') + +attribute('Size', 'size', 'Rates the robot\'s physical dimensions.') + +attribute('Power', 'pow', 'Rates how long the robot can operate on its own without recharging.') diff --git a/EngineHeart/pug/fields.pug b/EngineHeart/pug/fields.pug new file mode 100644 index 0000000000..1ff2b29f26 --- /dev/null +++ b/EngineHeart/pug/fields.pug @@ -0,0 +1,46 @@ +mixin bubble(label) + .bubble(style=attributes.style, title=attributes.title) + label= label + .inner: block + +mixin input(type, name) + input(type=type, name='attr_' + name, placeholder=attributes.placeholder, style=attributes.style, value=attributes.value) + +mixin labelledUnderlined(label) + .labelledUnderlined(style=attributes.style) + label= label + .inner: block + +mixin labelledLeft(label) + .labelledLeft(style=attributes.style) + label= label + .inner: block + +mixin option(view, value, isSelected) + - + if(!value) + value = view; + option(value=value, selected=isSelected)= view + +mixin readOnly(name) + span.readOnly(name='attr_' + name) + +input('hidden', name) + +mixin repeating(name) + fieldset(class='repeating_' + name) + block + +mixin rollButton(attr, notes, options) + - + var tpl = '&{template:eh} {{charName=@{character_name}}} ' + + '{{attr=' + attr + '}} {{result=[[@{' + attr + '}]]}}'; + if(notes) + tpl += '{{notes=@{' + notes + '}}}'; + button(type='roll', value=tpl) + +mixin select(name) + select(name='attr_' + name, style=attributes.style) + block + +mixin textarea(name) + textarea(name='attr_' + name, style=attributes.style, placeholder=attributes.placeholder) diff --git a/EngineHeart/pug/index.pug b/EngineHeart/pug/index.pug new file mode 100644 index 0000000000..89aca38785 --- /dev/null +++ b/EngineHeart/pug/index.pug @@ -0,0 +1,53 @@ +include fields.pug + ++input('text', 'debug')(value=' ', style='display: none;') ++input('text', 'character_sheet')(value='EngineHeart', style='display: none;') + +.top + .column.bio + div + +labelledLeft('UNIT NAME')(style='width: 50%;'): +input('text', 'character_name') + +labelledLeft('PLAYER')(style='width: 49%;'): +input('text', 'player_name') + div + +labelledLeft('ORIGINAL PURPOSE')(style='width: 100%;'): +input('text', 'originalPurpose') + .column.points + +bubble('POINTS'): +input('number', 'points') + +include attributes.pug +include secondaryAttributes.pug + +.twoColumns.featuresDefects + .column.features + h2 FEATURES + table: thead + th Feature + th Rating + th Notes + +repeating('features') + .feature + +input('text', 'name') + +input('number', 'rating') + +textarea('notes') + .column.defects + h2 DEFECTS + table: thead + th Feature + th Rating + th Notes + +repeating('defects') + .defect + +input('text', 'name') + +input('number', 'rating') + +textarea('notes') +.twoColumns + .column.equipment + h2 EQUIPMENT + +textarea('equipment') + .column.campaign + h2 CAMPAIGN NOTES + +textarea('campaignNotes') + +script(type='text/worker') + include ../js/worker.js + +include rolltemplate.pug diff --git a/EngineHeart/pug/rolltemplate.pug b/EngineHeart/pug/rolltemplate.pug new file mode 100644 index 0000000000..436e6d3f53 --- /dev/null +++ b/EngineHeart/pug/rolltemplate.pug @@ -0,0 +1,13 @@ +mixin notes() + | {{#notes}} + tr: td.notes + div Notes: + div {{notes}} + | {{/notes}} + +rolltemplate.sheet-rolltemplate-eh + table + thead: tr: th unit( "{{charName}}" ).exec( "{{attr}}" ); + tbody + tr: td Successes {{result}} + +notes() diff --git a/EngineHeart/pug/secondaryAttributes.pug b/EngineHeart/pug/secondaryAttributes.pug new file mode 100644 index 0000000000..7cf75e812a --- /dev/null +++ b/EngineHeart/pug/secondaryAttributes.pug @@ -0,0 +1,45 @@ +include fields.pug + +// A secondary attribute. +mixin secAttr(label, attr, title) + .attribute(title=title) + +input('hidden', attr + '_calc') + label= label + +bubble('TOTAL'): +readOnly(attr + '_total') + +bubble('NORMAL'): +readOnly(attr) + +bubble('MODIFIER'): +input('number', attr + '_mod') + +// Thresholds are like hit points. +mixin threshold(label, attr, title) + .attribute.threshold + label= label + +bubble('MAX')(title=title): +readOnly(attr + '_max') + +bubble('CURRENT')(title=title): +input('number', attr) + +.secondaryAttrs + .column + .attrsHeader + .boxedIcon.iconPhysicalInteraction + h2 Physical interaction + .attrsInner + .intPool.rollable + +secAttr('Interaction Pool', 'intPool', '(Dex + Ref) This is the dice pool a robot has to strike, grab, or otherwise manually interact with an unwilling robot or other mobile object.') + +rollButton('intPool_calc') + +secAttr('TN to be struck', 'tn2bStruck', '(Mobil + Ref) A robot\'s TN to be struck may not be higher than 10.') + +secAttr('Damage from Strike', 'dmgFromStrike', '(Str/2, round down) This is how much damage a robot can inflict by simply smashing its body or limbs into another object.') + .column + .attrsHeader + .boxedIcon.iconMovement + h2 Movement + .attrsInner + .initiative.rollable + +secAttr('Initiative', 'initiative', '(1d10 + Ref) This measures which robots will act first in a conflict or other event where multiple robots attempt to act before each other.') + +rollButton('initiative_calc') + +secAttr('Speed', 'speed', '(Mobil + Ref) This determines how fast a robot can move from one place to another. A robot\'s speed is equal to its speed in kilometers per hour during long journeys, or meters per round during conflict situations.') + .column + .attrsHeader + .boxedIcon.iconThresholds + h2 Thresholds + .attrsInner + +threshold('OS Threshold', 'osThreshold', '(DigiCon + Buffer) This is a measure of how resilient and self-sustaining the robot\'s "brain" is.') + +threshold('Damage Threshold', 'dmgThreshold', '(Durability + Size) This is a measure of how hardy and resilient the robot\'s physical body is.') diff --git a/EngineHeart/sheet.css b/EngineHeart/sheet.css new file mode 100644 index 0000000000..914aad87c2 --- /dev/null +++ b/EngineHeart/sheet.css @@ -0,0 +1,433 @@ +.sheet-rolltemplate-eh table { + background: #fff; + border: solid 2px #000; + border-collapse: separate; + border-radius: 0; + overflow: hidden; + width: 100%; +} +.sheet-rolltemplate-eh table thead th { + background: #000; + color: #fff; + padding: 0.5em 1em; +} +.sheet-rolltemplate-eh table tbody { + text-align: center; +} +.sheet-rolltemplate-eh table tbody td { + padding: 0.5em 0; +} +.sheet-rolltemplate-eh table tbody td hr { + border-top: 1px solid #000; + margin: 2px; +} +.sheet-rolltemplate-eh table tbody .sheet-crit { + font-weight: bold; + text-transform: uppercase; +} +.sheet-rolltemplate-eh table tbody .sheet-notes { + font-size: 0.8em; + font-style: italic; +} +.charsheet { + background: #fff; + height: 100%; + width: 9in; +} +.charsheet input { + border: none; + box-shadow: none; +} +.charsheet input[type=number]::-webkit-inner-spin-button, .charsheet input[type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} +.charsheet select { + box-shadow: none; + height: auto; + line-height: 18px; + margin-bottom: 0; + -moz-appearance: none; + -webkit-appearance: none; +} +.charsheet textarea { + background: linear-gradient(to bottom, transparent, transparent 17px, #000); + background-attachment: local; + background-size: 1px 18px; + border: none; + box-shadow: none; + padding: 0; + resize: none; +} +.charsheet .sheet-bubble { + display: inline-block; + height: 50px; + position: relative; + width: 48px; +} +.charsheet .sheet-bubble label { + bottom: -16px; + font-size: 10px; + left: 50%; + padding: 0; + position: absolute; + transform: translateX(-50%); + width: auto; +} +.charsheet .sheet-bubble .sheet-inner { + border: solid 3px black; + border-radius: 32px; + height: 32px; + left: 50%; + overflow: hidden; + position: absolute; + text-align: center; + transform: translateX(-50%); + width: 32px; +} +.charsheet .sheet-bubble .sheet-inner input { + background: transparent; + line-height: 32px; + max-height: 32px; + max-width: 32px; + text-align: center; + vertical-align: middle; +} +.charsheet .sheet-bubble .sheet-inner .sheet-readOnly { + background: #ccc; + display: inline-block; + height: 32px; + line-height: 32px; + width: 32px; +} +.charsheet .sheet-fieldBox { + background: #000; + border: solid 1px #000; + display: inline-block; + position: relative; +} +.charsheet .sheet-fieldBox label { + position: absolute; + font-size: 0.75em; + line-height: 0.75em; + top: 110%; +} +.charsheet .sheet-fieldBox .sheet-inner input { + border: none; + border-radius: 0 + display: inline; + text-align: center; +} +.charsheet .sheet-labelledAbove { + display: inline-block; +} +.charsheet .sheet-labelledAbove label { + font-size: 0.8em; + margin-bottom: 0; + padding-top: 0.5em; +} +.charsheet .sheet-labelledBoxH { + background: #000; + border: solid 1px #000; + border-radius: 0.5em; + display: inline-block; + overflow: hidden; +} +.charsheet .sheet-labelledBoxH > label { + background: #000; + color: #fff; + display: inline; + font-weight: bold; + padding: 0 0.25em; + vertical-align: middle; +} +.charsheet .sheet-labelledBoxH > .sheet-inner { + background: #fff; + display: inline-block; + float: right; + vertical-align: middle; +} +.charsheet .sheet-labelledBoxH > .sheet-inner > * { + vertical-align: middle; +} +.charsheet .sheet-labelledBoxH > .sheet-inner .sheet-fraction { + background: #fff; + display: inline-block; +} +.charsheet .sheet-labelledBoxH > .sheet-inner .sheet-fraction input { + border: none; + display: inline; +} +.charsheet .sheet-labelledBoxV { + background: #000; + border: solid 1px #000; + border-radius: 0.5em; + display: inline-block; + overflow: hidden; +} +.charsheet .sheet-labelledBoxV > label { + background: #000; + color: #fff; + display: inline-block; + font-weight: bold; + margin: 0; + padding: 0; + text-align: center; +} +.charsheet .sheet-labelledBoxV > .sheet-inner { + background: #fff; + text-align: center; + width: 100%; +} +.charsheet .sheet-labelledBoxV > .sheet-inner input { + text-align: center; + width: 100%; +} +.charsheet .sheet-labelledBoxV > .sheet-inner .sheet-fraction { + background: #fff; + display: inline-block; +} +.charsheet .sheet-labelledBoxV > .sheet-inner .sheet-fraction input { + border: none; + display: inline; +} +.charsheet .sheet-labelledLeft { + display: inline-block; + margin-bottom: 1em; + min-width: 0.45in; + position: relative; +} +.charsheet .sheet-labelledLeft label { + display: inline-block; + margin-bottom: 0; + padding-right: 2px; + width: auto; + vertical-align: bottom; +} +.charsheet .sheet-labelledLeft .sheet-inner { + border-bottom: solid 2px #000; + display: inline-block; + vertical-align: bottom; +} +.charsheet .sheet-labelledLeft .sheet-inner input { + background: transparent; + padding: 0; + transform: translateY(2px); +} +.charsheet .sheet-labelledUnderlined { + display: inline-block; + margin-bottom: 1em; + min-width: 0.45in; + position: relative; +} +.charsheet .sheet-labelledUnderlined label { + position: absolute; + font-size: 0.75em; + line-height: 0.75em; + top: 110%; +} +.charsheet .sheet-labelledUnderlined .sheet-inner { + border-bottom: solid 1px #000; + width: 100%; +} +.charsheet .sheet-labelledUnderlined .sheet-inner input { + border: none; + border-radius: 0; + padding-bottom: 0; + width: 100%; +} +.charsheet .sheet-labelledUnderlined .sheet-inner select { + border: none; + border-radius: 0; + padding-bottom: 0; + width: 100%; +} +.charsheet .sheet-labelledUnderlined .sheet-inner .sheet-readOnlyBox { + padding: 0; + padding-top: initial; + width: 100%; +} +.charsheet .sheet-mathOperator { + display: inline-block; + margin-bottom: 0.5em; + padding-left: 0.25em; + padding-right: 0.25em; +} +.charsheet .sheet-column { + display: inline-block; +} +.charsheet .sheet-inlineBlock { + display: inline-block; +} +.charsheet .sheet-attributes { + margin-bottom: 32px; + width: 100%; +} +.charsheet .sheet-attributes .sheet-attribute { + position: relative; +} +.charsheet .sheet-attributes .sheet-attribute button { + height: 100%; + opacity: 0; + position: absolute; + right: 0; + top: 0; + width: 40%; + z-index: 10; +} +.charsheet .sheet-attributes .sheet-attribute > label { + position: absolute; + left: 55%; + top: 15%; + width: auto; +} +.charsheet .sheet-attributes .sheet-attribute > label::before { + content: "0"; + font-family: dicefontd10; + font-size: 32px; + vertical-align: middle; +} +.charsheet .sheet-attributes .sheet-column { + vertical-align: top; + width: 33%; +} +.charsheet .sheet-attrsHeader { + margin-bottom: 10px; +} +.charsheet .sheet-attrsHeader h2 { + display: inline-block; + line-height: 1em; + max-width: 2in; + vertical-align: middle; +} +.charsheet .sheet-attrsHeader .sheet-boxedIcon { + display: inline-block; + height: 60px; + vertical-align: middle; + width: 60px; +} +.charsheet .sheet-attrsHeader .sheet-boxedIcon.sheet-iconChassis { + background: url("https://raw.githubusercontent.com/Cazra/roll20-character-sheets/engineHeart/EngineHeart/img/iconChassis.png"); +} +.charsheet .sheet-attrsHeader .sheet-boxedIcon.sheet-iconCrux { + background: url("https://raw.githubusercontent.com/Cazra/roll20-character-sheets/engineHeart/EngineHeart/img/iconCrux.png"); +} +.charsheet .sheet-attrsHeader .sheet-boxedIcon.sheet-iconIntelligence { + background: url("https://raw.githubusercontent.com/Cazra/roll20-character-sheets/engineHeart/EngineHeart/img/iconIntelligence.png"); +} +.charsheet .sheet-attrsHeader .sheet-boxedIcon.sheet-iconMovement { + background: url("https://raw.githubusercontent.com/Cazra/roll20-character-sheets/engineHeart/EngineHeart/img/iconMovement.png"); +} +.charsheet .sheet-attrsHeader .sheet-boxedIcon.sheet-iconPhysicalInteraction { + background: url("https://raw.githubusercontent.com/Cazra/roll20-character-sheets/engineHeart/EngineHeart/img/iconPhysicalInteraction.png"); +} +.charsheet .sheet-attrsHeader .sheet-boxedIcon.sheet-iconThresholds { + background: url("https://raw.githubusercontent.com/Cazra/roll20-character-sheets/engineHeart/EngineHeart/img/iconThresholds.png"); +} +.charsheet .sheet-featuresDefects { + margin-bottom: 32px; +} +.charsheet .sheet-featuresDefects table { + font-size: 10px; + margin-left: 8px; + width: 100%; +} +.charsheet .sheet-featuresDefects table th:nth-child(1) { + width: 30%; +} +.charsheet .sheet-featuresDefects table th:nth-child(2) { + width: 10%; +} +.charsheet .sheet-featuresDefects .sheet-feature input, .charsheet .sheet-featuresDefects .sheet-defect input { + border-bottom: solid 1px black; + border-radius: 0; + padding: 0; + vertical-align: top; +} +.charsheet .sheet-featuresDefects .sheet-feature textarea, .charsheet .sheet-featuresDefects .sheet-defect textarea { + height: 1.5em; + margin-top: 1px; + resize: vertical; + vertical-align: top; +} +.charsheet .sheet-featuresDefects .sheet-feature input:nth-child(1), .charsheet .sheet-featuresDefects .sheet-defect input:nth-child(1) { + width: 30%; +} +.charsheet .sheet-featuresDefects .sheet-feature input:nth-child(2), .charsheet .sheet-featuresDefects .sheet-defect input:nth-child(2) { + width: 10%; +} +.charsheet .sheet-featuresDefects .sheet-feature textarea:nth-child(3), .charsheet .sheet-featuresDefects .sheet-defect textarea:nth-child(3) { + width: 55%; +} +.charsheet .sheet-secondaryAttrs { + margin-bottom: 32px; + width: 100%; +} +.charsheet .sheet-secondaryAttrs .sheet-attribute { + position: relative; +} +.charsheet .sheet-secondaryAttrs .sheet-attribute > label { + position: absolute; + left: 55%; + margin-left: 1.7em; + text-indent: -1.7em; + top: 15%; + width: auto; +} +.charsheet .sheet-secondaryAttrs .sheet-attribute.sheet-threshold > label { + left: 37%; +} +.charsheet .sheet-secondaryAttrs .sheet-column { + vertical-align: top; + width: 33%; +} +.charsheet .sheet-secondaryAttrs .sheet-rollable { + position: relative; +} +.charsheet .sheet-secondaryAttrs .sheet-rollable button { + height: 100%; + opacity: 0; + position: absolute; + right: 0; + top: 0; + width: 40%; + z-index: 10; +} +.charsheet .sheet-secondaryAttrs .sheet-rollable .sheet-attribute > label::before { + content: "0"; + font-family: dicefontd10; + font-size: 32px; + vertical-align: middle; +} +.charsheet .sheet-top { + width: 100%; +} +.charsheet .sheet-top .sheet-column.sheet-bio { + width: 80%; +} +.charsheet .sheet-top .sheet-column.sheet-bio > div { + width: 100%; +} +.charsheet .sheet-top .sheet-column.sheet-bio > div .sheet-labelledLeft { + display: inline-table; +} +.charsheet .sheet-top .sheet-column.sheet-bio > div .sheet-labelledLeft label { + display: table-cell; + white-space: nowrap; + width: 1px; +} +.charsheet .sheet-top .sheet-column.sheet-bio > div .sheet-labelledLeft .sheet-inner { + display: table-cell; +} +.charsheet .sheet-top .sheet-column.sheet-bio > div .sheet-labelledLeft .sheet-inner input { + width: 100%; +} +.charsheet .sheet-top .sheet-column.sheet-points { + margin-left: 20px; + transform: scale(1.5); + width: 10%; +} +.charsheet .sheet-twoColumns .sheet-column { + vertical-align: top; + width: 49%; +} diff --git a/EngineHeart/sheet.html b/EngineHeart/sheet.html new file mode 100644 index 0000000000..1a6060dee8 --- /dev/null +++ b/EngineHeart/sheet.html @@ -0,0 +1,895 @@ + + + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+

INTELLIGENCE

+
+
+
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+
+

CHASSIS

+
+
+
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+
+

CRUX

+
+
+
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+ + +
+
+
+
+

Physical interaction

+
+
+
+
+ + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+
+

Movement

+
+
+
+
+ + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+
+

Thresholds

+
+
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+
+

FEATURES

+ + + + + + +
FeatureRatingNotes
+
+
+ + + +
+
+
+
+

DEFECTS

+ + + + + + +
FeatureRatingNotes
+
+
+ + + +
+
+
+
+
+
+

EQUIPMENT

+ +
+
+

CAMPAIGN NOTES

+ +
+
+ + + + + + + + + + + + {{#notes}} + + + {{/notes}} + +
unit( "{{charName}}" ).exec( "{{attr}}" );
Successes {{result}}
+
Notes:
+
{{notes}}
+
+
\ No newline at end of file diff --git a/EngineHeart/sheet.json b/EngineHeart/sheet.json new file mode 100644 index 0000000000..cdc6adb732 --- /dev/null +++ b/EngineHeart/sheet.json @@ -0,0 +1,8 @@ +{ + "html": "sheet.html", + "css": "sheet.css", + "authors": "Stephen Lindberg", + "preview": "sheet.png", + "roll20userid": "46544", + "instructions": "# Engine Heart\r\rThis is a character sheet for the Kickstarter-funded system Engine Heart, a\rpost-apocalyptic game where humans left Earth. Now the little appliance robots\rthat were left behind fend for themselves, doing the best they can.\r\rEngine Heart official web site: http://www.viralgamespublishing.com/2.html\r\rIcon graphics used with permission from Viral Games.\r\rPlease enjoy!\r" +} diff --git a/EngineHeart/sheet.png b/EngineHeart/sheet.png new file mode 100644 index 0000000000..6c60da8eff Binary files /dev/null and b/EngineHeart/sheet.png differ diff --git a/Fellowship/fellowship.css b/Fellowship/fellowship.css index a36191db2a..175f664d9c 100644 --- a/Fellowship/fellowship.css +++ b/Fellowship/fellowship.css @@ -302,6 +302,7 @@ input.sheet-minusCheck:checked ~ span.sheet-addBox::before { .sheet-spider, .sheet-remnant, .sheet-pair, +.sheet-ship, .sheet-default-harbinger, .sheet-powerful-harbinger { display: none; @@ -320,6 +321,7 @@ input.sheet-minusCheck:checked ~ span.sheet-addBox::before { .sheet-isSpider:checked ~ .sheet-spider, .sheet-isRemnant:checked ~ .sheet-remnant, .sheet-isPair:checked ~ .sheet-pair, +.sheet-isShip:checked ~ .sheet-ship, .sheet-isPowerfulHarbinger:not(:checked) ~ .sheet-default-harbinger, .sheet-isPowerfulHarbinger:checked ~ .sheet-powerful-harbinger{ display: block; @@ -387,6 +389,7 @@ input.sheet-showhide:checked ~ .sheet-subbox {display: none;} .sheet-isConstructed:not(:checked) ~ .sheet-madeof, .sheet-isRemnant:not(:checked) ~ .sheet-curse, .sheet-isPair:not(:checked) ~ .sheet-whopair, +.sheet-isShip:not(:checked) ~ .sheet-whatship, .sheet-isNPC:not(:checked) ~ .sheet-npcStats, .sheet-isNPC:not(:checked) ~ .sheet-threats, .sheet-isOverlord:not(:checked) ~ .sheet-npcStats, @@ -417,8 +420,11 @@ input.sheet-showhide:checked ~ .sheet-subbox {display: none;} .sheet-isNPC:checked ~ .sheet-pcStats, .sheet-isNPC:checked ~ .sheet-pcBox, .sheet-isNPC:checked ~ .sheet-people, +.sheet-isShip:checked ~ .sheet-people, +.sheet-isShip:checked ~ .sheet-pcBox:not(.sheet-pcShip), .sheet-isOverlord:checked ~ .sheet-pcStats, -.sheet-isPair:checked ~ .sheet-pcStats +.sheet-isPair:checked ~ .sheet-pcStats, +.sheet-isShip:checked ~ .sheet-pcStats { display: none; } diff --git a/Fellowship/fellowship.html b/Fellowship/fellowship.html index 40412ec4f7..2e896ee8a6 100644 --- a/Fellowship/fellowship.html +++ b/Fellowship/fellowship.html @@ -226,6 +226,7 @@ on("sheet:opened", function(eventInfo){ +
@@ -921,6 +992,17 @@ on("sheet:opened", function(eventInfo){
  • +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    @@ -954,6 +1036,8 @@ on("sheet:opened", function(eventInfo){ + +
    @@ -961,17 +1045,19 @@ on("sheet:opened", function(eventInfo){ + +
    -
    +
    @@ -994,6 +1080,7 @@ on("sheet:opened", function(eventInfo){
    +
    @@ -1001,10 +1088,15 @@ on("sheet:opened", function(eventInfo){ Tell Us Of Your People Improve The World Around You
    -
    +
    + +
    + + +
    @@ -1030,26 +1122,32 @@ Improve The World Around You
    -
    +
    + + - -
    - - -
    +
    + +
    + + +
    +
    - -
    - - -
    - - +
    + +
    + + +
    +
    + +
    diff --git a/Fellowship/translation.json b/Fellowship/translation.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translation.json +++ b/Fellowship/translation.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/af.json b/Fellowship/translations/af.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/af.json +++ b/Fellowship/translations/af.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/cs.json b/Fellowship/translations/cs.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/cs.json +++ b/Fellowship/translations/cs.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/da.json b/Fellowship/translations/da.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/da.json +++ b/Fellowship/translations/da.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/de.json b/Fellowship/translations/de.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/de.json +++ b/Fellowship/translations/de.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/el.json b/Fellowship/translations/el.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/el.json +++ b/Fellowship/translations/el.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/en.json b/Fellowship/translations/en.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/en.json +++ b/Fellowship/translations/en.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/es.json b/Fellowship/translations/es.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/es.json +++ b/Fellowship/translations/es.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/fr.json b/Fellowship/translations/fr.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/fr.json +++ b/Fellowship/translations/fr.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/he.json b/Fellowship/translations/he.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/he.json +++ b/Fellowship/translations/he.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/it.json b/Fellowship/translations/it.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/it.json +++ b/Fellowship/translations/it.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/ja.json b/Fellowship/translations/ja.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/ja.json +++ b/Fellowship/translations/ja.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/ko.json b/Fellowship/translations/ko.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/ko.json +++ b/Fellowship/translations/ko.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/nl.json b/Fellowship/translations/nl.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/nl.json +++ b/Fellowship/translations/nl.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/pt.json b/Fellowship/translations/pt.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/pt.json +++ b/Fellowship/translations/pt.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/ru.json b/Fellowship/translations/ru.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/ru.json +++ b/Fellowship/translations/ru.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/sv.json b/Fellowship/translations/sv.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/sv.json +++ b/Fellowship/translations/sv.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/tr.json b/Fellowship/translations/tr.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/tr.json +++ b/Fellowship/translations/tr.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/zh.json b/Fellowship/translations/zh.json index 6cb274fa52..7d3cd9b3bd 100644 --- a/Fellowship/translations/zh.json +++ b/Fellowship/translations/zh.json @@ -27,6 +27,7 @@ "remnant": "The Remnant", "pair": "The Pair", "overlord": "The Overlord", + "ship": "The Ship", "npc": "NPC", "stats": "Stats", "for-dwarf": "For The Dwarf and those that have shared a Dwarf move", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "Necr", "for-trio": "For playing The Pair as a Trio", "Trio": "Trio", + "crew": "Crew", + "cannon": "Cannon", + "engine": "Engine", + "Captain": "Captain", + "Pilot": "Pilot", + "Gunner": "Gunner", + "Comms": "Comms", + "Engineer": "Engineer", "npc-despair-description": "NPCs in despair cannot help or harm you", "in-despair": "In Despair", "improvements": "Improvements", @@ -122,6 +131,13 @@ "get-shared-move-together": "Choose a player. They Share a Move with you. The Pair can only use that move while Working Together.", "share-move-min5": "Choose a player. You Share a Move with them. You must be level 5 or higher to take this Advancement.", "become-paired-threat-to-world": "While Working Together, you are now a Threat to the World. You must be level 5 or higher to take this Advancement. When facing another Threat to the World, you do not need to pay a price simply to act against them.", + "increase-ship-stat-max2": "Increase one of the ship's stats by +1 (to a maximum of +2).", + "take-captain-gear-or-increase-ship-stat-max2": "The Captain chooses another piece of Gear, or increases one of the ship's stats by +1 (to a maximum of +2).", + "take-pilot-gear": "The Pilot chooses another piece of Gear.", + "take-gunner-gear": "The Gunner chooses another piece of Gear.", + "take-comms-gear": "The Comms chooses another piece of Gear.", + "take-engineer-gear": "The Engineer chooses another piece of Gear.", + "take-additional-ship": "You get another Ship. The Ship must be level 5 or higher to takethis Advancement. The new Ship starts at level 1.", "ascended": "The Ascended", "chosen-one": "The Chosen One", "cyborg": "The Cyborg", @@ -147,6 +163,7 @@ "what-are-you-made-of": "What Are You Made of?", "what-is-curse": "What Is Your Curse?", "who-are-pair": "Who are the Pair?", + "what-is-ship": "What is the Ship?", "threats": "Threats", "core-moves": "Core Moves", "move": "Move", @@ -155,6 +172,7 @@ "agendas": "Agendas", "starting-agendas": "Be Brave, Take Risks\nTell Us Of Your People\nImprove The World Around You", "bonds": "Bonds", + "personality": "Personality", "companions": "Companions", "companion-name": "Companion Name", "companion-stat-desc": "Companion Stat", diff --git a/Fellowship/translations/zu.json b/Fellowship/translations/zu.json index a7a82eb619..acbcab2c51 100644 --- a/Fellowship/translations/zu.json +++ b/Fellowship/translations/zu.json @@ -27,6 +27,7 @@ "remnant": "crwdns71862:0crwdne71862:0", "pair": "crwdns71863:0crwdne71863:0", "overlord": "crwdns71864:0crwdne71864:0", + "ship": "crwdns74763:0crwdne74763:0", "npc": "crwdns71865:0crwdne71865:0", "stats": "crwdns71866:0crwdne71866:0", "for-dwarf": "crwdns71867:0crwdne71867:0", @@ -51,6 +52,14 @@ "necrotic-abbreviated": "crwdns71886:0crwdne71886:0", "for-trio": "crwdns71887:0crwdne71887:0", "Trio": "crwdns71888:0crwdne71888:0", + "crew": "crwdns74764:0crwdne74764:0", + "cannon": "crwdns74765:0crwdne74765:0", + "engine": "crwdns74766:0crwdne74766:0", + "Captain": "crwdns74767:0crwdne74767:0", + "Pilot": "crwdns74768:0crwdne74768:0", + "Gunner": "crwdns74769:0crwdne74769:0", + "Comms": "crwdns74770:0crwdne74770:0", + "Engineer": "crwdns74771:0crwdne74771:0", "npc-despair-description": "crwdns71889:0crwdne71889:0", "in-despair": "crwdns71890:0crwdne71890:0", "improvements": "crwdns71891:0crwdne71891:0", @@ -122,6 +131,13 @@ "get-shared-move-together": "crwdns71957:0crwdne71957:0", "share-move-min5": "crwdns71958:0crwdne71958:0", "become-paired-threat-to-world": "crwdns71959:0crwdne71959:0", + "increase-ship-stat-max2": "crwdns74772:0crwdne74772:0", + "take-captain-gear-or-increase-ship-stat-max2": "crwdns74773:0crwdne74773:0", + "take-pilot-gear": "crwdns74774:0crwdne74774:0", + "take-gunner-gear": "crwdns74775:0crwdne74775:0", + "take-comms-gear": "crwdns74776:0crwdne74776:0", + "take-engineer-gear": "crwdns74777:0crwdne74777:0", + "take-additional-ship": "crwdns74778:0crwdne74778:0", "ascended": "crwdns71960:0crwdne71960:0", "chosen-one": "crwdns71961:0crwdne71961:0", "cyborg": "crwdns71962:0crwdne71962:0", @@ -147,6 +163,7 @@ "what-are-you-made-of": "crwdns71982:0crwdne71982:0", "what-is-curse": "crwdns71983:0crwdne71983:0", "who-are-pair": "crwdns71984:0crwdne71984:0", + "what-is-ship": "crwdns74779:0crwdne74779:0", "threats": "crwdns71985:0crwdne71985:0", "core-moves": "crwdns71986:0crwdne71986:0", "move": "crwdns71987:0crwdne71987:0", @@ -155,6 +172,7 @@ "agendas": "crwdns71990:0crwdne71990:0", "starting-agendas": "crwdns71991:0crwdne71991:0", "bonds": "crwdns71992:0crwdne71992:0", + "personality": "crwdns74780:0crwdne74780:0", "companions": "crwdns71993:0crwdne71993:0", "companion-name": "crwdns71994:0crwdne71994:0", "companion-stat-desc": "crwdns71995:0crwdne71995:0", diff --git a/Fragged-Empire/translations/de.json b/Fragged-Empire/translations/de.json index a74eb5b771..4e7ee5b847 100644 --- a/Fragged-Empire/translations/de.json +++ b/Fragged-Empire/translations/de.json @@ -8,7 +8,7 @@ "char_race": "Rasse", "char_language": "Sprachen", "char_traits": "Eigenschaften", - "char_level": "Level", + "char_level": "Stufe", "char_max_ressources": "Max Ressourcen", "char_max_influence": "Max Einfluss", "char_current": "Aktuell", diff --git a/Fragged-Empire/translations/fr.json b/Fragged-Empire/translations/fr.json index fcdacd2217..255e76cd39 100644 --- a/Fragged-Empire/translations/fr.json +++ b/Fragged-Empire/translations/fr.json @@ -1,16 +1,16 @@ { - "style": "Style:", - "style_character": "Character", + "style": "Type :", + "style_character": "Personnage", "style_combat": "Combat", - "style_spacecraft": "Spacecraft Sheet", + "style_spacecraft": "Feuille de Vaisseau", "style_notes": "Notes", - "char_name": "Character Name", + "char_name": "Nom du Personnage", "char_race": "Races", - "char_language": "Languages", + "char_language": "Langues", "char_traits": "Traits", - "char_level": "Level", - "char_max_ressources": "Max Resources", - "char_max_influence": "Max Influence", + "char_level": "Niveau", + "char_max_ressources": "Ressources Max", + "char_max_influence": "Influence Max", "char_current": "Current", "char_allocated": "Allocated", "char_ressources": "Resources", diff --git a/Free Spacer/FreeSpacer.html b/Free Spacer/FreeSpacer.html index 3465abbb7d..68b41521e9 100644 --- a/Free Spacer/FreeSpacer.html +++ b/Free Spacer/FreeSpacer.html @@ -46,7 +46,7 @@
    Gender Identity:Pronouns:
    - Sex Strategy: + Differentiation: - +
    Multi-field: - + @@ -2009,6 +1987,7 @@

    Laboratories

    Projects / Vignettes

    +

     

    @@ -2067,6 +2046,7 @@

    Hydroponics

    Life Support / Foodstuff (6)

    +

     

    Fittings

    @@ -2074,7 +2054,7 @@ 1
    - Passanger/Day + Passenger/Day
    @@ -2178,6 +2158,7 @@

    Brig

    Holding Cells

    +

     

    Fittings

    @@ -2194,7 +2175,7 @@ 2 @@ -2212,6 +2193,7 @@

    Compartments

    Concealed Hold [10 tonne]

    +

     

    Fittings

    - Life Support / Day + Prisoner/Day
    @@ -2219,7 +2201,7 @@ 2 @@ -2818,7 +2800,7 @@
    - Support Passenger / Day + Passenger/Day  
    Multi-field: - + diff --git a/GURPS/Images/Speed_Range_Table.PNG b/GURPS/Images/Speed_Range_Table.PNG index 789b30ce17..3dffd3d503 100644 Binary files a/GURPS/Images/Speed_Range_Table.PNG and b/GURPS/Images/Speed_Range_Table.PNG differ diff --git a/GURPS/gurps.css b/GURPS/gurps.css index bd52b96cba..f0105ea81f 100644 --- a/GURPS/gurps.css +++ b/GURPS/gurps.css @@ -88,6 +88,17 @@ input { background: #FAFAFA; } +.sheet-box .sheet-row-details2 { + background: #FAFAFA; +} + +.sheet-speed-range-table { + float: right; +} + +.sheet-speed-range-table img { + width: 140 px; +} /* ===== CUSTOM TABS ===== */ input.sheet-tab1:not(:checked) ~ .sheet-tab1, @@ -172,6 +183,13 @@ input.sheet-tab0 + span { .sheet-box .sheet-row-details { display: none; } */ +.sheet-toggle:checked ~ .sheet-row-details2 { display: inline-block; } +.sheet-toggle ~ .sheet-row-details2 { display: none; } +/* +.sheet-box .sheet-row-details2:hover, +.sheet-box .sheet-row:hover + .sheet-row-details2 { display: block; } +.sheet-box .sheet-row-details2 { display: none; } +*/ /* ===== BUTTONS ===== */ .sheet-box button { @@ -434,12 +452,21 @@ input.sheet-module-roll:checked ~ .sheet-wrapper .sheet-module-off-roll, display: none; } - -/* ===== LAYOUT ===== */ +/* ===== LAYOUT Subsection for Notes===== */ .sheet-box .sheet-row-details .sheet-col0 { width: 40px; text-align: center; } .sheet-box .sheet-row-details .sheet-col1 { width: calc(100% - 40px); } .sheet-box .sheet-row-details .sheet-col1 input { text-align: left; } + +/* ===== ATTACK LAYOUT Subscentino for Weapon Notes and Damage Notes ===== */ +.sheet-box .sheet-row-details2 .sheet-col0 { width: 100px; text-align: center; } +.sheet-box .sheet-row-details2 .sheet-col1 { width: calc(100% - 450px); } +.sheet-box .sheet-row-details2 .sheet-col1 input { text-align: left; } +.sheet-box .sheet-row-details2 .sheet-col2 { width: 100px; text-align: center; } +.sheet-box .sheet-row-details2 .sheet-col3 { width: 250px; } +.sheet-box .sheet-row-details2 .sheet-col3 input { text-align: left; } + + /* -- TOOLTIPS -- */ .sheet-tooltip input { } .sheet-lift .sheet-tooltip { margin-left: -170px; } diff --git a/GURPS/gurps.html b/GURPS/gurps.html index b237f6fdcc..b46a5c5631 100644 --- a/GURPS/gurps.html +++ b/GURPS/gurps.html @@ -1088,7 +1088,7 @@ Light (1)
    - +
    @@ -1102,7 +1102,7 @@ Medium (2)
    - +
    @@ -1116,7 +1116,7 @@ Heavy (3)
    - +
    @@ -1130,7 +1130,7 @@ X-Heavy (4)
    - +
    @@ -1503,7 +1503,7 @@
    - + ---
    @@ -1711,6 +1711,11 @@
    + +
    + GURPS Speed\Range Tabke +
    + @@ -1799,9 +1804,10 @@
    Damage
    - Armour Divisor: A number in parenthesis after
    - the damage - eg. (2) - is an armour divisor.
    - Divide the target"s DR by this number. + Armor Divisor: A number in parenthesis after
    + the damage - eg. (2) - is an armor divisor.
    + Enter this number as AD(#) or as
    + Armor Divisor(#) in the Damage Notes.
    ex: indicates the attack causes an explosion.
    See page 269. @@ -1868,7 +1874,7 @@
    -
    @@ -1877,13 +1883,19 @@
    -
    +
    - Notes + Weapon Notes
    +
    + Damage Notes +
    +
    + +
    @@ -1945,7 +1957,20 @@ to total shots fired. See page 373. -
    DAM
    +
    +
    Damage
    + + Armor Divisor: A number in parenthesis after
    + the damage - eg. (2) - is an armor divisor.
    + Enter this number as AD(#) or as
    + Armor Divisor(#) in the Damage Notes. +
    + ex: indicates the attack causes an explosion.
    + [#d]: indicates the attack causes fragmentation.
    + See page 269. +
    +
    +
    Type
    @@ -2022,7 +2047,7 @@
    -
    @@ -2031,13 +2056,19 @@
    -
    +
    - Notes + Weapon Notes
    +
    + Damage Notes +
    +
    + +
    @@ -2236,21 +2267,45 @@

    Known Issues

      -
    • Unable to delete a Technique
    • +
    • Unable to delete a Technique - UPDATE
    • +
    • The issue is the ‘Max’ value for the Technique. If any value was placed in there, the row will not delete. So in this PULL I have blocked values from being placed there so that new Techniques can be deleted if need be. Existing Techniques that you are unable to delete – the Devs are looking into that issue and will advise me.
    • +
    • NOTE: Techniques, as it is now on the character sheet, does not really work well – that section will most likely be completely rewritten (I plan on doing it when I get some time and my skills at HTML improve).

    Revision History

    To report an Issues or a Suggestion, please use the Roll20 forum under Character Sheets & Compendium. I have created a thread named: [GURPS] - Sheet #1 - Thread 1 (that seems to be similar to the naming - convention used by other sheets). In your post, please specify if it is an Issue or Suggestion with as much - detail information as possible. Screen shots help a lot! - I am just learning to work with HTML and CSS so I may not be able to do everything requested. I make no - promises on how fast I may be able to implement a Fix or a Suggestion - so please be patient. -Thanks, Mike W.

    + convention used by other sheets).

    + +

    https://app.roll20.net/forum/post/6616836/gurps-sheet-number-1-thread-1/?pageforid=6644122#post-6644122

    + +

    In your post, please specify if it is an Issue or Suggestion with as much detail information as possible. + Screen shots help a lot! I am just learning to work with HTML and CSS so I may not be able to do everything + requested. I make no promises on how fast I may be able to implement a Fix or a Suggestion - so please be + patient. -Thanks, Mike W.

    If there are others that are working on or wish to work on this sheet, lets coordinate using the Roll20 Forum for now (Like Tom and I are doing) - perhaps later we can use GitHub.

    +

    Version: 1.3.8

    + +

    Pull Request: 08/08/2018

    + +
      +
    • Changes, Fixes, and Adds made by Mike W (UserID: 1414610
    • +
    • Added the Speed-Range table image to the Combat Tab - Requested by CaptainJoy (UserID: GitHub)
    • +
    • Set the character sheet to always open to the Updates Tab
    • +
    • Fixed BUG where Basic Lift calculations for ST 7 or less was incorrectly rounding for Light, Medium, and Heavy Encumbrances
    • +
    • Renamed Notes to Weapon Notes under Melee Attacks and Ranged Attacks – Cosmetic Only
    • +
    • Added Damage Notes with an attribute under Melee Attacks and Ranged Attacks
    • +
    • Changed Tool Tip for Damage, for Melee attacks and Ranged Attacks, to indicate using the Damage Notes field – Cosmetic Only
    • +
    • Changed Armour Divisor to Armor Divisor – Cosmetic Only
    • +
    • Changed the output of the Attack Macros for Melee and Ranged attacks to include the Weapons Notes attribute – Cosmetic Only
    • +
    • Changed the output of the Damage Macros for Melee and Ranged attacks to include the Damage Notes attribute – Cosmetic Only
    • +
    + +

    Version: 1.3.7

    Pull Request: 08/01/2018

    @@ -2432,6 +2487,8 @@ */ on('sheet:opened', function() { console.log('********* Sheet Opened *********'); + /* When the sheet is opened, it opens to the Update tab */ + setAttrs({tab:7}); getAttrs(['sheet_version', 'mod_cascade', 'modCascade', 'modCascadeAll'], function(v) { if (v.modCascade && v.modCascadeAll) { modCascade = v.modCascade; diff --git a/Infected!/translations/de.json b/Infected!/translations/de.json index 5fd8e97b3e..da95bc4b31 100644 --- a/Infected!/translations/de.json +++ b/Infected!/translations/de.json @@ -16,7 +16,7 @@ "PresenceRoll": "Probe auf Erscheinung", "Tact": "Taktgefühl", "TactRoll": "Probe auf Taktgefühl", - "mental": "mental", + "mental": "Mental", "Awareness": "Aufmerksamkeit", "AwarenessRoll": "Probe auf Aufmerksamkeit", "Intelligence": "Intelligenz", @@ -117,11 +117,11 @@ "Success": "Erfolg", "Failure": "Fehlschlag", "Bonus": "Bonus", - "Effect": "Effect", - "current": "current", + "Effect": "Effekt", + "current": "aktuell", "max": "max", - "strike": "strike", - "initiative": "initiative", - "InitiativeRoll": "Roll for initiative", - "BaseValue": "Base Value" + "strike": "Schlag", + "initiative": "Initiative", + "InitiativeRoll": "Wurf für Initiative", + "BaseValue": "Basiswert" } \ No newline at end of file diff --git a/Metallic Guardian/Metallic Guardian.css b/Metallic Guardian/Metallic Guardian.css index 4ceaadb8ba..ae854c2b31 100644 --- a/Metallic Guardian/Metallic Guardian.css +++ b/Metallic Guardian/Metallic Guardian.css @@ -28,10 +28,10 @@ button[type=roll]{ margin-right: 10px; } -.sheet-5colrow .sheet-col { - /*width: calc(20% - 20px);*/ - /*margin-right: 30px;*/ -} +/*.sheet-5colrow .sheet-col { + width: calc(20% - 20px); + margin-right: 30px; +}*/ button.sheet-table-button, button.sheet-table-button table, @@ -568,4 +568,8 @@ table.sheet-blessings-table-display textarea { .sheet-rolltemplate-metalric_abillity .inlinerollresult.importantroll { color: white; background-color: #4A57ED; +} + +input[name="attr_items_number"], input[name="attr_blessings_use"] { + margin-left : 10px; } \ No newline at end of file diff --git a/Mutants and Masterminds 3E/mutants-and-masterminds-preview.jpg b/Mutants and Masterminds 3E/mutants-and-masterminds-preview.jpg index 1070702382..6c2fddfdce 100644 Binary files a/Mutants and Masterminds 3E/mutants-and-masterminds-preview.jpg and b/Mutants and Masterminds 3E/mutants-and-masterminds-preview.jpg differ diff --git a/Mutants and Masterminds 3E/mutants-and-masterminds.css b/Mutants and Masterminds 3E/mutants-and-masterminds.css index 0c268cd4a3..17a928aff1 100644 --- a/Mutants and Masterminds 3E/mutants-and-masterminds.css +++ b/Mutants and Masterminds 3E/mutants-and-masterminds.css @@ -62,6 +62,7 @@ div.sheet-tab-content { display: none; } input.sheet-tab1:checked ~ div.sheet-tab1, input.sheet-tab2:checked ~ div.sheet-tab2, +input.sheet-tab3:checked ~ div.sheet-tab3, input.sheet-tab11:checked ~ div.sheet-tab11, input.sheet-tab12:checked ~ div.sheet-tab12, input.sheet-tab13:checked ~ div.sheet-tab13, @@ -71,6 +72,7 @@ input.sheet-tab99:checked ~ div.sheet-tab99 { input.sheet-tab1:checked + span.sheet-tab1, input.sheet-tab2:checked + span.sheet-tab2, +input.sheet-tab3:checked + span.sheet-tab3, input.sheet-tab11:checked ~ span.sheet-tab11, input.sheet-tab12:checked ~ span.sheet-tab12, input.sheet-tab13:checked ~ span.sheet-tab13, diff --git a/Mutants and Masterminds 3E/mutants-and-masterminds.html b/Mutants and Masterminds 3E/mutants-and-masterminds.html index 3738e84411..8f27e7e8f5 100644 --- a/Mutants and Masterminds 3E/mutants-and-masterminds.html +++ b/Mutants and Masterminds 3E/mutants-and-masterminds.html @@ -80,6 +80,8 @@ Stats & Skills Powers, Advantages & Equipment + + Import Data
    @@ -196,7 +198,7 @@   AGL   - + = + @@ -210,7 +212,7 @@   FGT   - + = + @@ -267,7 +269,7 @@
    Offense
    - + Initiative: = @@ -277,21 +279,70 @@
    - - - + + + + + + Show Macro Text?   - +

    -
    - Notes & Conditions -
    -
    +
    +
    +
    + Name + Attack + Defense + Effect +
    +
    + + Accurate Attack + + + +
    +
    + All-out Attack + + + +
    +
    + Defensive Attack + + + +
    +
    + Power Attack + + + +
    +
    + Conditions + + + +
    +
    + Totals + + + +
    +
    +
    -
    @@ -545,77 +596,14 @@
    +
    + Notes & Conditions +
    +
    -
    -
    - Roll Target - Stats: - - - -
    -
    - Roll Target - Combat: - - - -
    -
    - Roll Target - Initiative: - - - -
    -
    - Roll Target - Skill: - - - -
    -
    -
    - Dice Roll Type: - - - -
    -
    -
    +
    +
    -
    Motivations & Complications @@ -625,6 +613,7 @@
    +
    @@ -680,3 +669,79 @@
    +
    + +
    + Import XML +
    +
    +
    +
    +
    + Roll Target - Stats: + + + +
    +
    + Roll Target - Combat: + + + +
    +
    + Roll Target - Initiative: + + + +
    +
    + Roll Target - Skill: + + + +
    +
    +
    + Dice Roll Type: + + + +
    +
    +
    + +
    diff --git a/Numenera/translations.json b/Numenera/translations.json new file mode 100644 index 0000000000..44c78e2c64 --- /dev/null +++ b/Numenera/translations.json @@ -0,0 +1,65 @@ +{ + "tier-u": "TIER", + "effort-u": "EFFORT", + "xp-u": "XP", + "armor-u": "ARMOR", + "name-u": "NAME", + "is-a-u": " IS A ", + "descriptor-u": "DESCRIPTOR", + "type-u": "TYPE", + "who-u": " WHO", + "focus-u": "FOCUS", + "on-u": " ON ", + "recursion-u": "RECURSION", + "success": "Success", + "rvd-u": "ROLL VS DIFFICULTY", + "simple": "Simple", + "intimidating": "Initmidating", + "standard": "Standard", + "formidable": "Formidable", + "demanding": "Demanding", + "heroic": "Heroic", + "difficult": "Difficult", + "immortal": "Immortal", + "challenging": "Challenging", + "impossible": "Impossible", + "might-u": "MIGHT", + "speed-u": "SPEED", + "intellect-u": "INTELLECT", + "pool-u": "POOL", + "edge-u": "EDGE", + "skills": "SKILLS", + "skill-u": "SKILL", + "attacks-u": "ATTACKS", + "attack-u": "ATTACK", + "mod-u": "MOD", + "dmg-u": "DMG", + "special_abilities-u": "SPECIAL ABILITIES", + "equipmentartifactsandoddities-u": "EQUIPMENT, ARTIFACTS & ODDITIES", + "money-u": "MONEY", + "shins-u": "SHINS", + "cyphers-u": "CYPHERS", + "limit-u": "LIMIT", + "recovery_roll-u": "RECOVERY ROLL", + "action-u": "1 ACTION", + "minutes-u": "10 MINS", + "hour-u": "1 HOUR", + "hours-u": "10 HOURS", + "damage_track-u": "DAMAGE TRACK", + "dmgtrk-text-u": "+1 EFFORT PER LEVEL
    IGNORE MINOR & MAJOR EFFECT RESULTS
    COMBAT ROLLS OF 17-20 ONLY DEAL +1 DAMAGE", + "impaired-u": "IMPAIRED", + "debilitated_text-u": "CAN ONLY MOVE AN IMMEDIATE DISTANCE
    IF SPEED POOL IS ZERO YOU CANNOT MOVE", + "debilitated-u": "DEBILITATED", + "advancement-u": "ADVANCEMENT", + "advancement-text": "(You must have four of these to advance in Tier. Cost = 4XP each.)", + "increase_capabilities-u": "INCREASE CAPABILITIES", + "move_towards_perfections-u": "MOVE TOWARDS PERFECTION", + "extra_effort-u": "EXTRA EFFORT", + "skill_training-u": "SKILL TRAINING", + "other-u": "OTHER", + "points_in_stat_pool": "+4 points into stat Pools", + "point_in_edge_choice": "+1 point into the Edge of your choice", + "point_into_effort": "+1 point into Effort", + "skill_or_specialize": "Train in a skill or Specialize", + "refer_to_corebook": "Refer to corebook" +} \ No newline at end of file diff --git a/Pathfinder Official/translations/de.json b/Pathfinder Official/translations/de.json index 23db106323..56faae620c 100644 --- a/Pathfinder Official/translations/de.json +++ b/Pathfinder Official/translations/de.json @@ -133,7 +133,7 @@ "constitution-roll": "Konstitutionswurf", "cowering": "Kauernd", "cp-u": "KM", - "cr-u": "CR", + "cr-u": "HG", "craft": "Handwerk", "crit-confirm": "Krit bestätigen", "critical": "Kritisch", @@ -187,7 +187,7 @@ "dodge-from-acitems": "Ausweichbonus von RK Gegenständen", "dodge-modifier": "Ausweichmodifikator", "domaine-spell": "Domänenzauber", - "dr-u": "DR", + "dr-u": "SR", "drag-or-push": "Schieben/ Ziehen", "duration:": "Dauer:", "dying": "Sterbend", @@ -231,11 +231,11 @@ "gargantuan": "Gigantisch", "gear": "Ausrüstung", "gender": "Geschlecht", - "general": "General", + "general": "Allgemein", "gp-u": "GM", "grappled": "Ringend", "grappled-cmb": "Ringend: –2 Abzug auf alle Kampfmanöverwürfe, außer auf solche, um selbst jemanden in den Ringkampf zu verwickeln oder dem ringenden Zustand zu entkommen.", - "grit": "Grit", + "grit": "Mut", "group": "Gruppe", "hair": "Haar", "handle_animal": "Mit Tieren umgehen*", @@ -279,7 +279,7 @@ "k_religion": "W. (Religion)*", "knowledge": "Wissen", "knowledge_arcana": "Wissen (Arkanes)*", - "knowledge_custom": "Knowledge (Custom)*", + "knowledge_custom": "Wissen (spezif.)*", "knowledge_dungeoneering": "Wissen (Gewölbekunde)*", "knowledge_engineering": "Wissen (Baukunst)*", "knowledge_geography": "Wissen (Geographie)*", @@ -415,7 +415,7 @@ "save-dc-temp-adjustment": "Speichere temp. SG Einstellungen", "saving-throw:": "Rettungswurf:", "saving-throws": "Rettungswürfe", - "sc-u": "SC", + "sc-u": "ZK", "school:": "Schule:", "score": "Wert", "secondary-ability-monk-rule": "Sek. Attr.-Mod.: erlaubt RK-Bonus-Regel für Mönche", @@ -430,7 +430,7 @@ "shield-bonus-added-to-touch-ac": "Schildbonus auf Berührungs RK addieren", "short description:": "Kurzbeschreibung", "short-desc:": "Kurzbeschr.:", - "show": "Show", + "show": "Anzeigen", "show-ability": "Attribute anzeigen", "show-character-name": "Charakternamen anzeigen", "show-ecology": "Ökologie anzeigen", @@ -486,7 +486,7 @@ "spellsave-ph": "Reflex halbiert", "spellschool-ph": "Schule/Domäne/Elementarschule...", "spelltargets-ph": "bis zu fünf Kreaturen", - "spl": "Spl", + "spl": "SpS", "sq-u": "SQ", "sr-notes": "ZR Notizen", "sr-u": "ZR", @@ -512,7 +512,7 @@ "tab-spells": "Zauber", "tactics": "Taktik", "targets:": "Ziele:", - "teamwork": "Teamwork", + "teamwork": "Zusammenarbeit", "temp": "Temp", "temp-adjustment": "Temp Anpassung", "temporaray-hp": "Temporäre TP", diff --git a/Pathfinder Official/translations/zh.json b/Pathfinder Official/translations/zh.json index d8f641af9d..b9d44c5526 100644 --- a/Pathfinder Official/translations/zh.json +++ b/Pathfinder Official/translations/zh.json @@ -418,8 +418,8 @@ "sc-u": "施法", "school:": "學派:", "score": "屬性值", - "secondary-ability-monk-rule": "Sec. ab. mod: apply Monk's AC Bonus rules", - "secondary-ability-monk-rule-t": "If checked, secondary ability modifier is added to Flat-Footed AC, and is still used in AC calculation, even when some conditions deny Ability mod to AC.", + "secondary-ability-monk-rule": "次要屬性調整值:適用於武僧的AC加值規則", + "secondary-ability-monk-rule-t": "如果使用,則次要屬性調整值會被添加到措手不及AC上,並且在某些會損失敏捷AC的負面狀態時,仍然用於AC計算。", "secondary-ability-modifier": "次要屬性調整值", "sense_motive": "察言觀色", "senses": "感官", diff --git a/Pathfinder Playtest/PFPlaytest.css b/Pathfinder Playtest/PFPlaytest.css index 1c40f903f1..dbac385d77 100644 --- a/Pathfinder Playtest/PFPlaytest.css +++ b/Pathfinder Playtest/PFPlaytest.css @@ -1,5 +1,5 @@ * { - font-family:"Patrick Hand"; + font-family:"Arial"; color:black; } .sheet-pictos{/*elements that should be using the pictos font*/ @@ -33,7 +33,7 @@ .sheet-label, .sheet-character-sheet button[type=roll] { font-weight:400 !important; - font-size:10pt; + font-size:9pt; } [hidden='true'] { display:none !important; @@ -47,7 +47,7 @@ textarea, background-color:transparent; border:0px solid black; border-bottom:1px solid black; - font-size:10pt; + font-size:9pt; box-shadow:none; -webkit-appearance: none; -moz-appearance: none; @@ -181,7 +181,7 @@ label:hover, min-height:100%; } .sheet-character-sheet h1 { - font-size:10pt; + font-size:9pt; line-height:inherit; z-index:2; text-align:center; @@ -197,7 +197,8 @@ label:hover, /**/ } .sheet-character-sheet .sheet-section, -.sheet-button-description{ +.sheet-button-description, +.sheet-prof-gutter{ --circlebore:9.5px; --ringsize:10px; background: @@ -207,7 +208,7 @@ label:hover, radial-gradient(circle at 0% 100%,transparent var(--circlebore),var(--circlecolor) var(--circlebore),var(--circlecolor) var(--ringsize),var(--circlecolor) 0) bottom left/52% 52% no-repeat; text-transform: uppercase; font-weight: 700; - font-size: 10pt; + font-size: 9pt; padding: 0px calc(var(--ringsize) + 5px); text-align: center; letter-spacing: 0px; @@ -563,12 +564,15 @@ div.sheet-tactical-condition > .sheet-encumbrance:in-range + span{ .sheet-class-info{ padding:5px; place-content:start; - grid-template-columns:repeat(4,1fr) repeat(3,1fr) 1fr; + grid-template-columns:repeat(8,1fr); grid-template-rows:repeat(6,auto); grid-gap:5px; overflow-y:scroll; } .sheet-class-info .sheet-name{ + grid-column-end:span 3; +} +.sheet-class-info .sheet-level-details{ grid-column-end:span 4; } .sheet-class-info .sheet-ancestry-details{ @@ -614,7 +618,7 @@ input[type=radio].sheet-char-tab.sheet-class-details-tab:checked ~ .sheet-class- height: 18px; } .sheet-show-options{ - opacity: 0; + opacity: 0; position: absolute; top: -5px; right: 0px; @@ -634,19 +638,13 @@ input[type=radio].sheet-char-tab.sheet-class-details-tab:checked ~ .sheet-class- color: #A0A0A0; cursor: pointer; margin-top: 0px; - display: none; + opacity: 0; z-index:5; } .sheet-filter-container:hover .sheet-show-options +span, -.sheet-filter-container:hover .sheet-show-options, .sheet-skill-container:hover .sheet-show-options +span, -.sheet-skill-container:hover .sheet-show-options, -.sheet-statblock .sheet-spell:hover .sheet-show-options +span, -.sheet-statblock .sheet-spell:hover .sheet-show-options{ - display: block; -} -.sheet-show-options{ - display:none; +.sheet-statblock .sheet-spell:hover .sheet-show-options +span{ + opacity: 100; } .sheet-character-sheet .sheet-filter-container .sheet-show-options:not(:checked) ~ .sheet-row-options, .sheet-character-sheet .sheet-skill-container .sheet-show-options:not(:checked) ~ .sheet-row-options, @@ -684,6 +682,9 @@ input[type=radio].sheet-char-tab.sheet-class-details-tab:checked ~ .sheet-class- width:auto; z-index:10; } +.repcontainer[data-groupname="repeating_ability"] .sheet-display .sheet-button-description{ + grid-column:button-start; +} .sheet-display .sheet-button-description:not(:hover) > label{ display:none; } @@ -725,19 +726,28 @@ input[type=radio].sheet-char-tab.sheet-class-details-tab:checked ~ .sheet-class- grid-template-columns:3fr repeat(4,1fr) repeat(3,0.5fr); } /*buff styling*/ -.repcontainer[data-groupname='repeating_buff'] { +.sheet-character-sheet .sheet-in-play .repcontainer[data-groupname='repeating_buff'] { width:100%; max-height:100%; overflow-y:scroll!important; overflow-x:hidden; + display:block; + grid-area:container; } .sheet-buffs .sheet-filter-container{ width:100%; } -.repcontainer[data-groupname='repeating_buff'] .repitem{ - width:50%; +.sheet-character-sheet .sheet-in-play .repcontainer[data-groupname='repeating_buff'] .repitem{ + display:inline-block; + width:49%; margin:5px 0px 0px; +} +.sheet-character-sheet .sheet-in-play .repcontainer[data-groupname='repeating_buff'] .repitem:nth-child(odd){ float:left; + margin-right:5px; +} +.sheet-character-sheet .sheet-in-play .repcontainer[data-groupname='repeating_buff'] .repitem:nth-child(even){ + float:right; } .sheet-row-options .sheet-buff-name{ width:100% !important; @@ -760,13 +770,19 @@ textarea.sheet-item-mods{ overflow-y:hidden; overflow-x:hidden; } +.sheet-encumbered:checked ~ .sheet-encumber *{ + color:#e1bb78; + text-shadow:0px 0px 10px #d4162f, 0px 0px 5px #d4162f, 0px 0px 2.5px #d4162f; +} .sheet-encumbered:checked ~ .sheet-encumber { - color:white !important; - background-color:#333398; + background-color:var(--circlecolor); +} +.sheet-overburdened:checked ~ .sheet-overburden *{ + color:#e1bb78; + text-shadow:0px 0px 10px #d4162f, 0px 0px 5px #d4162f, 0px 0px 2.5px #d4162f; } .sheet-overburdened:checked ~ .sheet-overburden { - color:white !important; - background-color:#333398; + background-color:var(--circlecolor); } .sheet-mod-buff[value*="1"] ~ .sheet-modified-attr { color:#f7b238; @@ -812,7 +828,7 @@ textarea.sheet-item-mods{ text-indent:37px !important; } /*Repeating styling*/ -.repcontainer:not([data-groupname='repeating_profession']):not([data-groupname='repeating_condition']){ +.repcontainer:not([data-groupname='repeating_profession']):not([data-groupname='repeating_condition']):not([data-groupname='repeating_buff']){ grid-area:container; max-width:100%; display:grid; @@ -824,7 +840,7 @@ textarea.sheet-item-mods{ margin-right:30px; } .repcontrol{ - --squaredim:10pt; + --squaredim:9pt; place-self:stretch; display:grid; grid-template-columns:1fr; @@ -939,73 +955,85 @@ input[type=radio].sheet-tab-button.sheet-options:checked ~ .sheet-page.sheet-opt } .sheet-proficiency-section .sheet-section-container{ display:grid; - grid-template-columns:repeat(25,1fr); - grid-template-rows:5px 20px 20px 5px 20px 20px 5px; + grid-template-columns:repeat(5,1fr); + grid-template-rows:5px 20px 20px 20px 20px 20px 20px 20px 20px 20px; text-align:center; grid-column-gap:5px; place-items:center stretch; }, .sheet-proficiency-container{ display:grid; - grid-template-columns:repeat(5,1fr); + grid-template-columns:1fr; grid-template-rows:20px; text-align:center; grid-gap:5px; place-items:center stretch; } -.sheet-proficiency-section .sheet-section-container > span, -.sheet-proficiency-container > span{ - grid-column:span 5; - grid-row:2; - display:block; - border-bottom:1px solid black; -} -.sheet-proficiency-section .sheet-section-container label, -.sheet-proficiency-container label{ - grid-row:3; - border:1px solid black; - overflow:hidden; - display:grid; - grid-template-columns:1fr; - grid-template-rows:1fr; - place-items:center; - place-content:center; - border-radius:50%; - position:relative; -} -.sheet-proficiency-section .sheet-section-container label div, -.sheet-proficiency-container label div{ - width:100%; - height:100%; - position:absolute; -} -.sheet-proficiency-section .sheet-section-container label input:checked + div, -.sheet-proficiency-container label input:checked + div{ - background-color:#470000; -} -.sheet-proficiency-section .sheet-section-container label input:checked + div + span, -.sheet-proficiency-container label input:checked + div + span{ +.sheet-proficiency-section .sheet-section-container > span{ + background-color:black; color:#e1bb78; - text-align:center; - z-index:2; + grid-row:3; + border-bottom:1px solid black; + text-shadow:0px 0px 10px #d4162f, 0px 0px 5px #d4162f, 0px 0px 2.5px #d4162f; +} +.sheet-proficiency-section .sheet-section-container select{ + grid-row:4; + border:1px solid black; +} +.sheet-proficiency-container select{ + grid-row:4; + overflow:hidden; } .sheet-proficiency-section .sheet-prof-gutter{ - background-color:black; - grid-row:4; grid-column:1 / -1; - height:5px; + height:100%; } -.sheet-proficiency-section .sheet-section-container .sheet-prof-gutter ~ span{ +.sheet-proficiency-section .sheet-prof-gutter.sheet-armor{ + grid-row:2; +} +.sheet-proficiency-section .sheet-prof-gutter.sheet-weapon{ grid-row:5; } -.sheet-proficiency-section .sheet-section-container .sheet-prof-gutter ~ label{ +.sheet-proficiency-section .sheet-prof-gutter.sheet-tradition{ + grid-row:8; +} +.sheet-proficiency-section .sheet-prof-gutter *{ + display:grid; + color:#e1bb78; + place-items:center; + place-content:center; +} +.sheet-proficiency-section .sheet-section-container .sheet-prof-gutter.sheet-weapon ~ span{ grid-row:6; } +.sheet-proficiency-section .sheet-section-container .sheet-prof-gutter.sheet-weapon ~ textarea{ + grid-row:6 / 8; + grid-column:3 /-1; + height:100%; + resize:none; + margin:0px; +} +.sheet-proficiency-section .sheet-section-container .sheet-prof-gutter.sheet-weapon ~ select{ + grid-row:7; +} +.sheet-proficiency-section .sheet-section-container .sheet-prof-gutter.sheet-tradition ~ span{ + grid-row:9; +} +.sheet-proficiency-section .sheet-section-container .sheet-prof-gutter.sheet-tradition ~ select{ + grid-row:10; +} .sheet-page.sheet-core { - grid-template-columns:[skills-start attribute-start]1fr[skills-end attribute-end initiative-start health-start armor-start repeating-start proficiency-start] 1fr [initiative-end armor-end health-end senses-start saves-start xp-start] 1fr [xp-end senses-end saves-end proficiency-end repeating-end]; - grid-template-rows:[attribute-start initiative-start xp-start] 20px [initiative-end xp-end health-start senses-start] 104px [health-end senses-end armor-start saves-start] 30px [attribute-end skills-start] 132px [armor-end saves-end repeating-start] auto [repeating-end skills-end]; + grid-template-columns:[skills-start attribute-start]1fr[skills-end attribute-end initiative-start health-start armor-start repeating-start proficiency-start resource-start] 1fr [initiative-end armor-end health-end senses-start saves-start xp-start] 1fr [resource-end xp-end senses-end saves-end proficiency-end repeating-end]; + grid-template-rows:[attribute-start initiative-start xp-start] 20px [initiative-end xp-end resource-start] 20px [resource-end health-start senses-start] 104px [attribute-end skills-start health-end senses-end armor-start saves-start ] 150px [armor-end saves-end repeating-start] auto [repeating-end skills-end]; grid-gap:20px; } +.sheet-page.sheet-core .sheet-resource-container{ + grid-area:resource; + display:grid; + grid-template-columns:repeat(11,auto); + place-items:center; + place-content:center; +} .sheet-page.sheet-core .sheet-combat{/*calc(var(--circlebore)/2)calc(150px - var(--circlebore)*2)*/ grid-area:repeating; display:grid; @@ -1067,16 +1095,21 @@ input[type=radio].sheet-tab-button.sheet-options:checked ~ .sheet-page.sheet-opt .sheet-xp-container{ grid-area:xp; display:grid; - grid-template-columns:0px [label-start] 30px [label-end current-start] 1fr [current-end slash-start] 20px [slash-end max-start] 1fr [max-end] 0px; + grid-template-columns:20px 20px 10px 20px 50px 0.5fr [label-start] 20px [label-end current-start] 2fr [current-end] 0px; grid-template-rows:[label-start current-start slash-start max-start] 1fr [label-end current-end slash-end max-end]; + grid-gap:5px; +} +.sheet-character-sheet .sheet-page .sheet-xp-container input{ + width:100%; } .sheet-xp-container .sheet-label{ - grid-area:label; font-weight:700!important; } +.sheet-xp-container .sheet-label ~ .sheet-label{ + grid-area:label; +} .sheet-character-sheet .sheet-xp-container .sheet-currxp{ grid-area:current; - width:calc(100% - 2px); border-radius:5px; } .sheet-xp-container .sheet-slash{ @@ -1104,7 +1137,7 @@ input[type=radio].sheet-tab-button.sheet-options:checked ~ .sheet-page.sheet-opt grid-area:char-tab; } .sheet-initiative-container > .sheet-section *{ - font-size:10pt !important; + font-size:9pt !important; padding:0px !important; } .sheet-initiative-container > .sheet-section-container{ @@ -1116,11 +1149,11 @@ input[type=radio].sheet-tab-button.sheet-options:checked ~ .sheet-page.sheet-opt } .sheet-initiative-container > .sheet-section-container .sheet-tot{ grid-area:tot; - font-size:10pt; + font-size:9pt; } .sheet-initiative-container > .sheet-section-container .sheet-arith{ grid-area:arith; - font-size:10pt; + font-size:9pt; } .sheet-initiative-container > .sheet-section-container select{ grid-area:select; @@ -1199,7 +1232,7 @@ input[type=radio].sheet-tab-button.sheet-options:checked ~ .sheet-page.sheet-opt } .sheet-character-sheet .sheet-attr-base-mod-container *{ grid-area:acontent; - font-size:10pt; + font-size:9pt; text-align:center; display:block; width:100%; @@ -1265,6 +1298,14 @@ input[type=radio].sheet-tab-button.sheet-options:checked ~ .sheet-page.sheet-opt grid-gap:8px; place-content:start; } +.sheet-span-five{ + grid-column:span 5; + width:100%; +} +.sheet-span-six{ + grid-column:span 6; + width:100%; +} .sheet-health-resolve-container, .sheet-ac-container, .sheet-saving-container{ @@ -1307,12 +1348,12 @@ input[type=radio].sheet-tab-button.sheet-options:checked ~ .sheet-page.sheet-opt width:100% !important; } .sheet-health-label { - font-size:10pt !important; + font-size:9pt !important; font-color:black; } .sheet-current, .sheet-max{ - font-size:10pt !important; + font-size:9pt !important; } .sheet-health-label { margin:auto 0px; @@ -1355,11 +1396,16 @@ input[type=radio].sheet-tab-button.sheet-options:checked ~ .sheet-page.sheet-opt } .sheet-ac-container{ display:grid; - grid-template-columns:0px [type-start] 30px [type-end] 0px [tot-start] 20px [tot-end equal-start] 10px [equal-end base-ten-start] 20px [base-ten-end ten-plus-start] 10px [ten-plus-end arm-start] 20px [arm-end arm-plus-start] 10px [arm-plus-end abi-start] 1fr [abi-end] 0px; - grid-column-gap:5px; - grid-row-gap:5px; + grid-template-columns:0px [type-start notes-start] 30px [type-end] 0px [tot-start] 20px [tot-end equal-start] 10px [equal-end base-ten-start] 20px [base-ten-end ten-plus-start] 10px [ten-plus-end arm-start] 10px [arm-end arm-plus-start] 10px [arm-plus-end prof-start] 10px [prof-end abi-start] 1fr [abi-end notes-end] 0px; + grid-template-rows: repeat(5,auto) [notes-start] 1fr [notes-end]; + grid-gap:5px; align-content:start; justify-content:start; + padding:5px 0px; +} +.sheet-ac-container .sheet-prof{ + grid-column:prof-start / prof-end; + place-self:center; } .sheet-ac-container .sheet-equal{ grid-column:equal-start / equal-end; @@ -1389,17 +1435,17 @@ input[type=radio].sheet-tab-button.sheet-options:checked ~ .sheet-page.sheet-opt grid-column:abi-start / abi-end } .sheet-dr-span{ - grid-column: type-start / tot-end; + grid-column: type-start / equal-end; justify-self:start; margin-left:0px; } input.sheet-dr{ - grid-column: tot-end / abi-end; + grid-column: equal-end / abi-end; width:100%; } .sheet-ac-notes{ - grid-column: type-start / abi-end; - height:65px; + grid-area: notes; + height:100%; resize:none; text-align:left !important; } @@ -1454,6 +1500,14 @@ input.sheet-dr{ grid-gap:5px; align-content:start; } +.sheet-skill-container .sheet-signature-skill[value*="on"] + .sheet-display{ + border-radius:5px; + background-color:var(--circlecolor); +} +.sheet-skill-container .sheet-signature-skill[value*="on"] + .sheet-display *{ + color:#e1bb78 !important; + text-shadow:0px 0px 10px #d4162f, 0px 0px 5px #d4162f, 0px 0px 2.5px #d4162f; +} .sheet-skill-container, .sheet-skill-fieldset{ grid-column:container-start / container-end; @@ -1462,7 +1516,7 @@ input.sheet-dr{ .sheet-skill-container:nth-child(1), .sheet-skill-container .sheet-display{ display:grid; - grid-template-columns:[button-start] 80px [button-end tot-start] 20px [tot-end] 10px [arith-equal-end ranks-start] 10px [ranks-end arith-plus-start] 10px [arith-plus-end cs-start] 10px 10px; + grid-template-columns:[button-start] 90px [button-end tot-start] 20px [tot-end] 10px [arith-equal-end ranks-start] 10px [ranks-end arith-plus-start] 10px [arith-plus-end cs-start] 10px 10px; grid-gap:8px; align-items:center; } @@ -1479,6 +1533,9 @@ input.sheet-dr{ position:relative; top:3px; } +.sheet-skill-container button{ + overflow:hidden; +} .sheet-acp:checked + button:before { content:'b'!important; font-family:Pictos Three; @@ -1540,10 +1597,10 @@ input.sheet-dr{ background-color:#333398 !important; color:white; } -.sheet-type-filter[value*="feat"] ~ .sheet-filter-container.sheet-ability,, +.sheet-type-filter[value*="feat"] ~ .sheet-filter-container.sheet-ability, .sheet-type-filter[value*="power"] ~ .sheet-filter-container.sheet-power, .sheet-type-filter[value*="spell"] + .sheet-level-filter:not([value*="1"]):not([value*="2"]):not([value*="3"]):not([value*="4"]):not([value*="5"]):not([value*="6"]):not([value*="7"]):not([value*="8"]):not([value*="9"]):not([value*="10"]) ~ .sheet-filter-container.sheet-cantrip, -.sheet-type-filter[value*="spell"] + .sheet-level-filter[value*="1"] ~ .sheet-filter-container.sheet-level1, +.sheet-type-filter[value*="spell"] + .sheet-level-filter[value*="1"]:not([value*="0"]) ~ .sheet-filter-container.sheet-level1, .sheet-type-filter[value*="spell"] + .sheet-level-filter[value*="2"] ~ .sheet-filter-container.sheet-level2, .sheet-type-filter[value*="spell"] + .sheet-level-filter[value*="3"] ~ .sheet-filter-container.sheet-level3, .sheet-type-filter[value*="spell"] + .sheet-level-filter[value*="4"] ~ .sheet-filter-container.sheet-level4, @@ -1787,7 +1844,10 @@ span.sheet-field{ width:20px; margin-right:20px; } -.sheet-character-sheet .repcontainer .sheet-bab { +.sheet-character-sheet input.sheet-bab, +.sheet-character-sheet span.sheet-bab, +.sheet-character-sheet select.sheet-bab, +.sheet-character-sheet div.sheet-bab{ width:20px; text-align:center; } @@ -1812,13 +1872,17 @@ span.sheet-field{ } .sheet-bulk-container, .sheet-credits-container{ - margin-bottom:5px; padding:0px 2px; border: 1px solid black; border-radius:3px; position:relative; text-align:center; } +.sheet-credits-container.sheet-credits{ + display:grid; + grid-template-columns:repeat(4,1fr); + grid-gap:5px; +} .sheet-bulk-container .sheet-number, .sheet-bulk-container .sheet-label, .sheet-credits-container .sheet-number, @@ -1860,7 +1924,7 @@ span.sheet-field{ grid-column:1 / 3; } .sheet-filter-container.sheet-item .sheet-row.sheet-equip-state{ - grid-column:1 / 2; + grid-column:span 2; } .sheet-filter-container.sheet-item .sheet-row.sheet-bulk-cost{ grid-column:3 / 5; @@ -1883,11 +1947,15 @@ span.sheet-field{ display:none; } .sheet-filter-container.sheet-item .sheet-purpose-filter[value=armor] + .sheet-equip-state{ - grid-column-end:4; + grid-column:span 3; } -.sheet-filter-container.sheet-item .sheet-purpose-filter[value=armor] ~ .sheet-armor-purpose{ +.sheet-filter-container.sheet-item .sheet-purpose-filter[value=armor] ~ select.sheet-armor-purpose{ display:block; } +.sheet-filter-container.sheet-item .sheet-purpose-filter[value=armor] ~ .sheet-row.sheet-armor-purpose, +.sheet-filter-container.sheet-item .sheet-purpose-filter[value=shield] ~ .sheet-row.sheet-armor-purpose{ + display:flex; +} /*Spell Styling*/ .sheet-spell-containers{ grid-template-columns:1fr 1fr; @@ -2288,7 +2356,8 @@ input[type=checkbox].sheet-class-spells:checked + .sheet-spellclass-container, .sheet-item-container{ grid-area:items; } -.sheet-section-container > .sheet-button-description{ +.sheet-section-container > .sheet-button-description, +.sheet-item-container > .sheet-button-description{ grid-area:header; } .sheet-abilities-container > .sheet-button-description > *, @@ -2314,7 +2383,7 @@ input[type=checkbox].sheet-class-spells:checked + .sheet-spellclass-container, } .sheet-spell-column .sheet-section-container .repcontrol, .sheet-abilities-container .sheet-section-container .repcontrol{ - --squaredim:10pt; + --squaredim:9pt; justify-self:end; width:auto; font-size:var(--squaredim); @@ -2325,8 +2394,9 @@ input[type=checkbox].sheet-class-spells:checked + .sheet-spellclass-container, left:0px; } .sheet-character-sheet .sheet-pseudo-repcontrol{ - --squaredim:10pt; + --squaredim:9pt; place-self:start; + z-index:10; } /*settings style*/ .sheet-settings .sheet-row{ @@ -2531,7 +2601,7 @@ input[type=checkbox].sheet-class-spells:checked + .sheet-spellclass-container, width:100%; border-bottom:1px solid black; line-height:14px; - font-size:10pt; + font-size:9pt; text-align:center; } .sheet-statblock .sheet-field-container .sheet-attr-total-container .sheet-base-attr{ @@ -2642,7 +2712,7 @@ input.sheet-cr{ --repeat:no-repeat; var(--repeat); --box-shadow:0px 0px 10px 2px #64BAC9; display:grid; - grid-template-rows:[header-start] auto [body-start]17px [left-start] 4px [header-end] 12px [right-start] auto [left-end] 5px [footer-start] 1px [right-end] 21px [body-end] auto [footer-end]; + grid-template-rows:[header-start] auto [body-start]8px [left-start] 4px [header-end] 12px [right-start] auto [left-end] 5px [footer-start] 1px [right-end] 11px [body-end] auto [footer-end]; grid-template-columns:[left-start] 14px [body-start footer-start] 5px [header-start] 3px [left-end] 1fr [header-end] 11px [right-start] 3px [footer-end] 5px [body-end] 14px [right-end]; margin:0px 0px 0px -40px; padding:5px 0px 5px 0px; @@ -2717,13 +2787,13 @@ input.sheet-cr{ radial-gradient(circle at 0% 100%,transparent var(--circlebore),var(--circlecolor) var(--circlebore),var(--circlecolor) var(--ringsize),var(--circlecolor) 0) bottom left/52% 52% no-repeat; text-transform: uppercase; font-weight: normal; - font-size: 10pt; + font-size: 9pt; padding: 0px; text-align: center; letter-spacing: 0px; display: inline-block; margin-bottom: 0px; - font-family:Patrick Hand; + font-family:Arial; } .sheet-rolltemplate-generic .sheet-generic-header *, .sheet-rolltemplate-generic .sheet-generic-footer *, @@ -2766,7 +2836,7 @@ input.sheet-cr{ display: inline-block; margin-bottom: 0px; color:white; - font-family:Patrick Hand; + font-family:Arial; } .sheet-rolltemplate-generic .sheet-side-banner > div:first-child, .sheet-rolltemplate-attack .sheet-side-banner > div:first-child, @@ -2799,7 +2869,7 @@ input.sheet-cr{ font-weight:700; font-size:13pt; line-height:1.4em; - font-family:Patrick Hand; + font-family:Arial; } .sheet-rolltemplate-generic .sheet-content-container a, .sheet-rolltemplate-attack .sheet-content-container a, @@ -2815,9 +2885,9 @@ input.sheet-cr{ .sheet-rolltemplate-spell .sheet-generic-body, .sheet-rolltemplate-ship .sheet-generic-body{ color:black; - font-family:Patrick Hand; - border: 70px solid transparent; - border-image: url('https://s3.amazonaws.com/files.d20.io/images/59311754/w0IK4ij9J8KG2EnGfAcisw/max.png') 222 222 fill repeat; + font-family:Arial; + border: 15px solid transparent; + border-image: url('https://s3.amazonaws.com/files.d20.io/images/60744680/NI-D50_jXZY_Kl9epRclfw/max.png') 44 43 fill repeat; background-color:transparent; grid-area:body; } @@ -2875,7 +2945,7 @@ input.sheet-cr{ border:0px transparent; position:relative; height:100%; - margin:-49px -38px -42px -36px; + margin:0px 0px 0px 0px; } .sheet-rolltemplate-generic .sheet-generic-body > .sheet-content-container:empty, .sheet-rolltemplate-attack .sheet-generic-body > .sheet-content-container:empty, diff --git a/Pathfinder Playtest/PFPlaytest.html b/Pathfinder Playtest/PFPlaytest.html index aa0b682b0e..c363e4719f 100644 --- a/Pathfinder Playtest/PFPlaytest.html +++ b/Pathfinder Playtest/PFPlaytest.html @@ -4,9 +4,9 @@ Look for: \n\s* Replace with: This pattern can be found at https://regexr.com/3mi9v --->

    COMMS

    ROLLS ARE

    DISPLAY MODE

    HOUSE RULES

    RESOLVE
    BUFF STACKING
    HALF SPECIALIZATION WEAPONS

    BUFFS

    y
    MODS

    CHARACTER

    CREATION

    CHARACTER NAME
    CLASS
    LEVEL
    ANCESTRY
    BACKGROUND
    SIZE
    SPEED
    GENDER
    ALIGNMENT
    DEITY
    PLAYER
    LANGUAGES
    ANCESTRY NAME
    BOOST
    BOOST
    FLAW
    HP
    BACKGROUND NAME
    BOOST
    BOOST
    CLASS NAME
    BOOST
    HP
    SKILLS
    LEVEL
    LEVEL 1 BOOSTS
    LEVEL 5 BOOSTS
    LEVEL 10 BOOSTS
    LEVEL 15 BOOSTS
    LEVEL 20 BOOSTS

    XP/

    ABILITY SCORES

    MODTOTPENDRN0
    10
    0
    10
    0
    10
    0
    10
    0
    10
    0
    10

    HEALTH

    HIT POINTSTEMPORARY HIT POINTSTotalCurrent
    0
    0

    SENSES

    TotUTEML0

    ARMOR CLASS

    TOTbABI
    TAC
    =10+
    0
    +DEXAC=10+
    0
    +DEXDR/RESIST

    SAVING THROWS

    TOTUTEML
    ABI
    0
    CON
    0
    DEX
    0
    WIS

    SKILLS

    TotUTEML
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP

    WEAPON & ARMOR PROFICIENCIES

    ATTACKS

    FEATS

    SPELLS & POWERS

    UNARMOREDLIGHT ARMORMEDIUM ARMORHEAVY ARMORSHIELDS
    SIMPLEMARTIAL
    NAMEATTACKDAMAGETYPEATK1ATK2ATK3+
    y
    NAME
    LVLPOTENCY RUNEPROPERTY RUNE
    ATTACK ROLL
    DAMAGE ROLLd++
    DAMAGE TYPECRITICAL EFFECT
    RANGE/
    USAGESPECIAL
    ADDITIONAL ATTACK PENALTY:
    0
    0
    NAMEFEAT TYPEUSAGE
    y
    NAME
    DURATIONLEVEL
    TARGETRANGE
    USAGE
    /
    10
    Daily Uses

    POWERS

    NAMESCHOOL
    y
    NAME
    DURATIONLEVEL
    TARGETRANGE
    USAGE
    /
    10
    Daily Uses

    SPELLS

    CANTRIPS/
    1st LEVEL/
    LEVEL 2/
    LEVEL 3/
    LEVEL 4/
    LEVEL 5/
    LEVEL 6/
    LEVEL 7/
    LEVEL 8/
    LEVEL 9/
    LEVEL 10/

    CANTRIPS

    NAMESCHOOL
    y
    NAMELEVEL
    DURATION
    TARGETRANGE
    USAGE
    /
    10
    Daily Uses

    2nd LEVEL

    NAMESCHOOL
    y
    NAMELEVEL
    DURATION
    TARGETRANGE
    USAGE
    /
    10
    Daily Uses

    4th LEVEL

    -
    NAMESCHOOL
    y
    NAMELEVEL
    DURATION
    TARGETRANGE
    USAGE
    /
    10
    Daily Uses

    6th LEVEL

    NAMESCHOOL
    y
    NAMELEVEL
    DURATION
    TARGETRANGE
    USAGE
    /
    10
    Daily Uses

    8th LEVEL

    NAMESCHOOL
    y
    NAMELEVEL
    DURATION
    TARGETRANGE
    USAGE
    /
    10
    Daily Uses

    10th LEVEL

    NAMESCHOOL
    y
    NAMELEVEL
    DURATION
    TARGETRANGE
    USAGE
    /
    10
    Daily Uses

    1st LEVEL

    NAMESCHOOL
    y
    NAMELEVEL
    DURATION
    TARGETRANGE
    USAGE
    /
    10
    Daily Uses

    3rd LEVEL

    NAMESCHOOL
    y
    NAMELEVEL
    DURATION
    TARGETRANGE
    USAGE
    /
    10
    Daily Uses

    5th LEVEL

    NAMESCHOOL
    y
    NAMELEVEL
    DURATION
    TARGETRANGE
    USAGE
    /
    10
    Daily Uses

    7th LEVEL

    NAMESCHOOL
    y
    NAMELEVEL
    DURATION
    TARGETRANGE
    USAGE
    /
    10
    Daily Uses

    9th LEVEL

    NAMESCHOOL
    y
    NAMELEVEL
    DURATION
    TARGETRANGE
    USAGE
    /
    10
    Daily Uses
    CR
    XP
    0
    SENSES
    PERCEPTION
    0
    AURA
    DEFENSE
    HP/RP/
    EAC
    10
    KAC
    10
    CMD
    10
    0
    0
    0
    DEFENSIVE ABILITIES
    DRIMMUNITIESSR
    RESISTANCESWEAKNESSES
    OFFENSE
    SPEED
    MELEE
    y
    NAMELVL
    ATTACK ROLL
    DAMAGE ROLL
    ATTACK ROLL AFFECTED BY BUFFS TO
    DAMAGE AFFECTED BY BUFFS TO
    RANGE
    DAMAGE TYPECRITICAL EFFECT
    /
    USAGESPECIAL
    0
    0
    RANGED
    y
    NAMELVL
    ATTACK ROLL
    DAMAGE ROLL
    ATTACK ROLL AFFECTED BY BUFFS TO
    DAMAGE AFFECTED BY BUFFS TO
    RANGE
    DAMAGE TYPECRITICAL EFFECT
    /
    USAGESPECIAL
    0
    0
    SPACEREACH
    SPELLS KNOWN(CL)
    y
    NAMELVL
    SOURCE
    SCHOOL
    TARGETRNG
    DURATION
    USAGE
    STATISTICS
    STR
    0
    DEX
    0
    CON
    0
    INT
    0
    WIS
    0
    CHA
    0
    SKILLS
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    y
    0
    ACP
    FEATS
    LANGUAGES
    OTHER ABILITIES
    GEAR
    ECOLOGY
    ENVIRONMENT
    ORGANIZATION
    TACTICS
    SPECIAL ABILITIES
    y
    NAME
    SOURCE
    TARGETRANGE
    DURATION
    USAGE
    /
    10
    Daily Uses
    © 2018. Pathfinder Playtest, the Pathfinder Playtest logo, the Paizo golem, all Paizo titles, the Pathfinder Playtest Roleplaying Game rules, and Paizo’s character names and distinctive likenesses are property and copyright of Paizo, Inc. in the United States and other countries.
    @@ -1019,22 +1019,7 @@
    - - - - - - - -
    - - -
    裝備:木蓮
    -
    - - -
    裝備:魔界工學
    -
    +
    diff --git a/Shinobi_Gami_Chinese_Traditional/translation.json b/Shinobi_Gami_Chinese_Traditional/translation.json index 06ba3c725a..a104218eab 100644 --- a/Shinobi_Gami_Chinese_Traditional/translation.json +++ b/Shinobi_Gami_Chinese_Traditional/translation.json @@ -46,8 +46,9 @@ "Stealth(lost)": "Stealth(lost)", "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", -"Strategy": "Strategy", -"Strategy(lost)": "Strategy(lost)", + "Strategy": "Strategy", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/af.json b/Shinobi_Gami_Chinese_Traditional/translations/af.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/af.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/af.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/cs.json b/Shinobi_Gami_Chinese_Traditional/translations/cs.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/cs.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/cs.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/da.json b/Shinobi_Gami_Chinese_Traditional/translations/da.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/da.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/da.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/de.json b/Shinobi_Gami_Chinese_Traditional/translations/de.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/de.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/de.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/el.json b/Shinobi_Gami_Chinese_Traditional/translations/el.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/el.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/el.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/en.json b/Shinobi_Gami_Chinese_Traditional/translations/en.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/en.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/en.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/es.json b/Shinobi_Gami_Chinese_Traditional/translations/es.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/es.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/es.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/fr.json b/Shinobi_Gami_Chinese_Traditional/translations/fr.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/fr.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/fr.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/he.json b/Shinobi_Gami_Chinese_Traditional/translations/he.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/he.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/he.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/it.json b/Shinobi_Gami_Chinese_Traditional/translations/it.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/it.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/it.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/ja.json b/Shinobi_Gami_Chinese_Traditional/translations/ja.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/ja.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/ja.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/ko.json b/Shinobi_Gami_Chinese_Traditional/translations/ko.json index b6e5bf3935..906fd0cff8 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/ko.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/ko.json @@ -46,7 +46,8 @@ "Scheme": "모술", "Scheme(lost)": "모술(상실)", "Strategy": "전술", - "Strategy(lost)": "전술(상실)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "요술", "Sorcery(lost)": "요술(상실)", "Engineering": "장치술", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/nl.json b/Shinobi_Gami_Chinese_Traditional/translations/nl.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/nl.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/nl.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/pt.json b/Shinobi_Gami_Chinese_Traditional/translations/pt.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/pt.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/pt.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/ru.json b/Shinobi_Gami_Chinese_Traditional/translations/ru.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/ru.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/ru.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/sv.json b/Shinobi_Gami_Chinese_Traditional/translations/sv.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/sv.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/sv.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/tr.json b/Shinobi_Gami_Chinese_Traditional/translations/tr.json index 53541345f1..62216ee9f4 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/tr.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/tr.json @@ -46,7 +46,8 @@ "Scheme": "Scheme", "Scheme(lost)": "Scheme(lost)", "Strategy": "Strategy", - "Strategy(lost)": "Strategy(lost)", + "Strategy_Field": "Strategy", + "Strategy_Field(lost)": "Strategy(lost)", "Sorcery": "Sorcery", "Sorcery(lost)": "Sorcery(lost)", "Engineering": "Engineering", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/zh.json b/Shinobi_Gami_Chinese_Traditional/translations/zh.json index 88f086c036..a36e424322 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/zh.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/zh.json @@ -45,8 +45,9 @@ "Stealth(lost)": "忍術(損)", "Scheme": "謀術", "Scheme(lost)": "謀術(損)", - "Strategy": "戦術", - "Strategy(lost)": "戦術(損)", + "Strategy": "用兵術", + "Strategy_Field": "戦術", + "Strategy_Field(lost)": "戦術(損)", "Sorcery": "妖術", "Sorcery(lost)": "妖術(損)", "Engineering": "絡繰術", @@ -67,18 +68,18 @@ "Sleep": "罠術", "Nature": "野戦術", "Necromancy": "死霊術", - "Acupuncture": "登術", + "Acupuncture": "針術", "Sleight_of_Hand": "手練", "Interception": "盗聴術", "Investigation": "調査術", "Guerrilla": "地の利", "Abjuration": "結界術", - "Weapon_Concealment": "隠蔽術", + "Weapon_Concealment": "暗算術", "Contortionism": "身体操術", "Ventriloquism": "腹話術", "Bluff": "詐術", "Willpower": "意気", - "Binding": "水術", + "Binding": "封術", "Clothing": "衣装術", "Walking": "歩法", "Invisibility": "隠形術", @@ -94,9 +95,9 @@ "Jumping": "飛術", "Olfaction": "香術", "Seduction": "色誘術", - "Analysis": "医術", + "Analysis": "見敵術", "Visual_Control": "瞳術", - "Torture": "火術", + "Torture": "拷問術", "Brawling": "骨法術", "Multiplicity": "分身の術", "Manipulation": "傀儡の術", diff --git a/Shinobi_Gami_Chinese_Traditional/translations/zu.json b/Shinobi_Gami_Chinese_Traditional/translations/zu.json index 49367e86e1..eb4b572a54 100644 --- a/Shinobi_Gami_Chinese_Traditional/translations/zu.json +++ b/Shinobi_Gami_Chinese_Traditional/translations/zu.json @@ -46,7 +46,8 @@ "Scheme": "crwdns71621:0crwdne71621:0", "Scheme(lost)": "crwdns71622:0crwdne71622:0", "Strategy": "crwdns71623:0crwdne71623:0", - "Strategy(lost)": "crwdns71624:0crwdne71624:0", + "Strategy_Field": "crwdns74781:0crwdne74781:0", + "Strategy_Field(lost)": "crwdns74782:0crwdne74782:0", "Sorcery": "crwdns71625:0crwdne71625:0", "Sorcery(lost)": "crwdns71626:0crwdne71626:0", "Engineering": "crwdns71627:0crwdne71627:0", diff --git a/Starfinder (simple)/Starfinder (simple).html b/Starfinder (simple)/Starfinder (simple).html index 215a136bfa..2c8facefd3 100644 --- a/Starfinder (simple)/Starfinder (simple).html +++ b/Starfinder (simple)/Starfinder (simple).html @@ -53,7 +53,7 @@
    - Show Ability Scores and Class Information? + Show Ability Scores and Health?
    @@ -61,15 +61,16 @@
    Ability Scores
    - Key Ability - Ability - Total - Mod - Race - Theme - Augments - Point Buy - Ability Increase + Key Ability + Ability + Total + Mod + Race + Theme + Augments + Point Buy + Ability Increase + Misc
    @@ -81,6 +82,7 @@ +
    @@ -92,6 +94,7 @@ +
    @@ -103,6 +106,7 @@ +
    @@ -114,6 +118,7 @@ +
    @@ -125,6 +130,7 @@ +
    @@ -136,95 +142,14 @@ +
     
    -
    -
    - Class Information -
    - HP and SP - Class Name - BAB - Skill Ranks - Fortitude - Reflex - Will - Levels -
    -
    - - - - - - - - -
    -
    - - - - - - - - -
    -
    - - - - - - - - -
    -
    - - - - - - - - -
    -
    - - - - - - - - -
    -
    - - - - - - - - -
    -
    -
    -
    - -
    - Show Health and Armor Class? - -
    -
    -
    +
    Health and Resolve
    @@ -253,7 +178,7 @@ / - +
    Temp HP @@ -263,19 +188,101 @@
    +
    +
    +
    + Show Class Information and Armor Class? + +
    +
    +
    +
    + Class Information +
    + HP and SP + Class Name + BAB + Skill Ranks + Fortitude + Reflex + Will + Levels +
    +
    + + + + + + + + +
    +
    + + + + + + + + +
    +
    + + + + + + + + +
    +
    + + + + + + + + +
    +
    + + + + + + + + +
    +
    + + + + + + + + +
    +
    +
     
    -
    +
    Armor Class
    - Armor Class - Total - - Armor - Dex - Misc + Armor Class + Total + + Armor + Dex + Misc
    EAC @@ -459,11 +466,11 @@ Type
    - + - +

    COMMS

    ROLLS ARE

    DISPLAY MODE

    HOUSE RULES

    RESOLVE
    BUFF STACKING
    HALF SPECIALIZATION WEAPONS

    CHARACTER INFO

    CLASS DETAILS

    CHARACTER NAME
    CLASS/LEVEL
    RACE
    HP
    THEME
    SIZE
    SPEED
    GENDER
    HOME WORLD
    ALIGNMENT
    DEITY
    PLAYER
    LANGUAGES
    CLASSLVLSPHPBABFORTREFWILLSKILLSABISPELL

    BUFFS

    y
    MODS
    0=
    XP/

    ABILITY SCORES

    MODTOTPENDRN
    10
    10
    10
    10
    10
    10

    HEALTH

    SPHPRPTMP/
    0
    /
    0
    /
    0
    /
    0

    ARMOR CLASS

    TOTbABIEAC
    10
    0
    KAC
    10
    0
    CMD
    18
    DR/RESIST

    SAVING THROWS

    TOTBASE
    ABI
    0
    0
    0
    0
    0
    0

    SKILLS | 0 /0

    TOTRNKCSABI
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    $X
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP
    y
    0
    =
    +
    3
    +
    ACP

    ATTACKS

    y
    NAMELVL
    CATEGORY
    ATK+
    RNG
    DMG+
    TYPECRIT EFFECT
    /
    USAGESPECIAL
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    $X

    EQUIPMENT

    CARRIED
    5ENCUMBER
    10OVER
    CREDITS
    WEALTH
    UPBs
    y
    NAME
    NUMBULKCOST
    $X

    ABILITIES

    y
    NAME
    SOURCE
    TARGETRNG
    DURATION
    /
    10
    Daily Uses
    USAGE
    +
    +
    TYPECRIT EFFECT
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    Based DC 10
    A Sucessful Save:
    $X

    SPELLCLASSES

    CASTER LEVEL 0
    1st Class5ABILITYPROGRESSSPELLS PER DAY0/1/2/3/4/5/6/7/8/9/
    ABILITYPROGRESSSPELLS PER DAY0/1/2/3/4/5/6/7/8/9/
    ABILITYPROGRESSSPELLS PER DAY0/1/2/3/4/5/6/7/8/9/
    ABILITYPROGRESSSPELLS PER DAY0/1/2/3/4/5/6/7/8/9/
    ABILITYPROGRESSSPELLS PER DAY0/1/2/3/4/5/6/7/8/9/

    1st LEVEL

    y
    NAMELVL
    SOURCE
    SCHOOL
    TARGETRNG
    DURATION
    USAGE
    +
    RNG
    +
    TYPECRIT EFFECT
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    Based DC 10
    A Sucessful Save:
    $X

    4th LEVEL

    y
    NAMELVL
    SOURCE
    SCHOOL
    TARGETRNG
    DURATION
    USAGE
    +
    RNG
    +
    TYPECRIT EFFECT
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    Based DC 10
    A Sucessful Save:
    $X

    7th LEVEL

    y
    NAMELVL
    SOURCE
    SCHOOL
    TARGETRNG
    DURATION
    USAGE
    +
    RNG
    +
    TYPECRIT EFFECT
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    Based DC 10
    A Sucessful Save:
    $X

    2nd LEVEL

    y
    NAMELVL
    SOURCE
    SCHOOL
    TARGETRNG
    DURATION
    USAGE
    +
    RNG
    +
    TYPECRIT EFFECT
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    Based DC 10
    A Sucessful Save:
    $X

    5th LEVEL

    y
    NAMELVL
    SOURCE
    SCHOOL
    TARGETRNG
    DURATION
    USAGE
    +
    RNG
    +
    TYPECRIT EFFECT
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    Based DC 10
    A Sucessful Save:
    $X

    8th LEVEL

    y
    NAMELVL
    SOURCE
    SCHOOL
    TARGETRNG
    DURATION
    USAGE
    +
    RNG
    +
    TYPECRIT EFFECT
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    Based DC 10
    A Sucessful Save:
    $X

    CANTRIPS

    y
    NAMELVL
    SOURCE
    SCHOOL
    TARGETRNG
    DURATION
    USAGE
    +
    RNG
    +
    TYPECRIT EFFECT
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    Based DC 10
    A Sucessful Save:
    $X

    3rd LEVEL

    y
    NAMELVL
    SOURCE
    SCHOOL
    TARGETRNG
    DURATION
    USAGE
    +
    RNG
    +
    TYPECRIT EFFECT
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    Based DC 10
    A Sucessful Save:
    $X

    6th LEVEL

    y
    NAMELVL
    SOURCE
    SCHOOL
    TARGETRNG
    DURATION
    USAGE
    +
    RNG
    +
    TYPECRIT EFFECT
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    Based DC 10
    A Sucessful Save:
    $X

    9th LEVEL

    y
    NAMELVL
    SOURCE
    SCHOOL
    TARGETRNG
    DURATION
    USAGE
    +
    RNG
    +
    TYPECRIT EFFECT
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    Based DC 10
    A Sucessful Save:
    $X
    CR
    XP
    SENSES
    PERCEPTION
    AURA
    DEFENSE
    HP/RP/
    EACKACCMD
    DEFENSIVE ABILITIES
    DRIMMUNITIESSR
    RESISTANCESWEAKNESSES
    OFFENSE
    SPEED
    MELEE
    y
    NAMELVL
    CATEGORY
    ATK+
    RNG
    DMG+
    TYPECRIT EFFECT
    /
    USAGESPECIAL
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    $X
    RANGED
    y
    NAMELVL
    CATEGORY
    ATK+
    RNG
    DMG+
    TYPECRIT EFFECT
    /
    USAGESPECIAL
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    $X
    SPACEREACH
    SPELLS KNOWN(CL)
    y
    NAMELVL
    SOURCE
    SCHOOL
    TARGETRNG
    DURATION
    USAGE
    +
    RNG
    +
    TYPECRIT EFFECT
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    DC
    10
    A Sucessful Save:
    $X
    STATISTICS
    STRDEXCONINTWISCHA
    SKILLS
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    y
    ACP
    FEATS
    LANGUAGES
    OTHER ABILITIES
    GEAR
    ECOLOGY
    ENVIRONMENT
    ORGANIZATION
    TACTICS
    SPECIAL ABILITIES
    y
    NAME
    PURPOSE
    TARGETRNG
    DURATION
    /
    10
    Daily Uses
    USAGE
    +
    +
    TYPECRIT EFFECT
    ROLL FULL ATTACK:
    NUMBER OF ATTACKS:
    ATTACK PENALTY:
    DC
    10
    A Sucessful Save:
    $X

    MENUS

    IMPORT

    --WARNING-- EXPERIMENTAL FEATURE --WARNING--
    T

    STARSHIP INFO

    STARSHIP NAME
    TIER
    MAKE AND MODEL
    SIZE
    FRAME
    SPEED
    MANEUVERABILITY
    DRIFT RATING

    CREW

    GUNNER
    FORWARD
    PORT
    AFT
    STARBOARD

    DEFENSES

    TOTAL PILOTING bAC 0= + 0TL 0= + 0
    CURRENTTOTALHP /
    THRESHOLDSDAMAGECRITICAL
    SHIELD TOTAL/

    POWER & COMPUTERS

    POWER/COMPUTER

    FORWARD

    y
    NAME
    TYPE
    CLASS
    RNG
    DMG
    ARC
    PCUBP
    /
    SPECIAL
    $X

    PORT

    y
    NAME
    TYPE
    CLASS
    RNG
    DMG
    ARC
    PCUBP
    /
    SPECIAL

    AFT

    y
    NAME
    TYPE
    CLASS
    RNG
    DMG
    ARC
    PCUBP
    /
    SPECIAL

    STARBOARD

    y
    NAME
    TYPE
    CLASS
    RNG
    DMG
    ARC
    PCUBP
    /
    SPECIAL

    TURRET

    y
    NAME
    TYPE
    CLASS
    RNG
    DMG
    ARC
    PCUBP
    /
    SPECIAL

    SYSTEMS

    y
    NAME
    PURPOSE
    PCUBP
    COMPUTER BONUS
    SHIELDSbTL

    EXPANSION BAYS

    y
    NAME
    PURPOSE
    PCUBP
    COMPUTER BONUS
    SHIELDSbTL
    $X

    CARGO/PASSENGERS

    SYSTEM STATUS

    LIFE SUPPORT (1-10)
    SENSORS (11-30)
    WEAPONS ARRAY (31-60)
    ENGINES (61-80)
    POWER CORE (81-100)
    NOMINALGLITCHINGMALFUNCTIONINGWRECKED
    This character sheet uses trademarks and/or copyrights owned by Paizo Inc., which are used under Paizo's Community Use Policy. We are expressly prohibited from charging you to use or access this content. This character sheet is not published, endorsed, or specifically approved by Paizo Inc. For more information about Paizo's Community Use Policy, please visit paizo.com/communityuse. For more information about Paizo Inc. and Paizo products, please visit paizo.com.