From 7d20a358eae2f64e24f32d2ddffe3900d3cc2bce Mon Sep 17 00:00:00 2001 From: Nic Bradley Date: Sat, 20 Feb 2021 12:54:28 -0800 Subject: [PATCH] WFRPv1.04 --- .../.gitignore | 3 + .../README.md | 10 + .../package.json | 30 + .../src/js/dragndrop.js | 6 - .../src/js/helperfunctions.js | 2 + .../src/js/sheetworkers.js | 156 ++-- .../src/pug/abstracts.pug | 4 +- .../src/pug/components/_component-index.pug | 3 +- .../src/pug/components/control.pug | 4 +- .../repeating/npc-additional-skill.pug | 13 + .../pug/components/repeating/spell-row.pug | 6 +- .../src/pug/components/skill-grouped.pug | 18 +- .../src/pug/layout/npc.pug | 21 +- .../src/pug/layout/pc.pug | 6 + .../src/pug/layout/settings.pug | 10 +- .../src/pug/rolls.pug | 33 +- .../src/pug/rolltemplates.pug | 26 +- .../src/pug/wfrp4.pug | 8 +- .../src/scss/_abstracts.scss | 4 +- .../src/scss/_rolltemplates.scss | 4 + .../src/scss/control/_hide.scss | 12 + .../src/scss/layout/_npc.scss | 31 +- .../src/scss/layout/pc/_pc.scss | 4 +- .../src/scss/styling/_form_fields.scss | 17 + .../src/scss/styling/_panel.scss | 2 +- .../translation.json | 14 + .../wfrp4.css | 50 +- .../wfrp4.html | 682 ++++++++++++------ 28 files changed, 864 insertions(+), 315 deletions(-) create mode 100644 Warhammer Fantasy Roleplay 4e Official/.gitignore create mode 100644 Warhammer Fantasy Roleplay 4e Official/README.md create mode 100644 Warhammer Fantasy Roleplay 4e Official/package.json create mode 100644 Warhammer Fantasy Roleplay 4e Official/src/pug/components/repeating/npc-additional-skill.pug diff --git a/Warhammer Fantasy Roleplay 4e Official/.gitignore b/Warhammer Fantasy Roleplay 4e Official/.gitignore new file mode 100644 index 0000000000..d3f9e9e331 --- /dev/null +++ b/Warhammer Fantasy Roleplay 4e Official/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +node_modules +package-lock.json \ No newline at end of file diff --git a/Warhammer Fantasy Roleplay 4e Official/README.md b/Warhammer Fantasy Roleplay 4e Official/README.md new file mode 100644 index 0000000000..c1753c1d7f --- /dev/null +++ b/Warhammer Fantasy Roleplay 4e Official/README.md @@ -0,0 +1,10 @@ +# wfrp4e-official +The Working Repository for the official Warhammer Fantasy Roleplay 4th Edition Character Sheet + +## File Structure + +This sheet is developed using NPM and compiled languages (Pug and SCSS); understanding of these technologies is required. + +Dependencies are outlined in the package.json. Just use `npm install` to download them. + +Start the compiles for SCSS & PUG with `npm start`. \ No newline at end of file diff --git a/Warhammer Fantasy Roleplay 4e Official/package.json b/Warhammer Fantasy Roleplay 4e Official/package.json new file mode 100644 index 0000000000..0207a333ad --- /dev/null +++ b/Warhammer Fantasy Roleplay 4e Official/package.json @@ -0,0 +1,30 @@ +{ + "name": "wfrp4e-official", + "version": "1.0.4", + "description": "The Official sheet development for Warhammer Fantasy Roleplay 4th Edititon", + "main": "index.js", + "dependencies": { + "npm-run-all": "^4.1.5", + "pug": "^3.0.0", + "sass": "^1.32.7" + }, + "devDependencies": {}, + "scripts": { + "start": "npm-run-all --parallel compile:sass compile:pug", + "compile:sass": "sass src/scss/wfrp4.scss wfrp4.css --no-source-map --watch", + "compile:pug": "pug src/pug/wfrp4.pug --out . -P -w" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/nmbradley/wfrp4e-official.git" + }, + "keywords": [ + "Roll20" + ], + "author": "Nic Bradley", + "license": "ISC", + "bugs": { + "url": "https://github.com/nmbradley/wfrp4e-official/issues" + }, + "homepage": "https://github.com/nmbradley/wfrp4e-official#readme" +} diff --git a/Warhammer Fantasy Roleplay 4e Official/src/js/dragndrop.js b/Warhammer Fantasy Roleplay 4e Official/src/js/dragndrop.js index 2f2995df73..bcbad9ca49 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/js/dragndrop.js +++ b/Warhammer Fantasy Roleplay 4e Official/src/js/dragndrop.js @@ -182,8 +182,6 @@ const wfrpDragAndDrop = ( () => { updateAttrs[`${characteristic.replace(/ /g,"_")}_bonus`] = Math.floor(characteristics[characteristic]/10); } - console.log(updateAttrs); - const trait_map = new Map(); for (const trait of traits) { @@ -495,8 +493,6 @@ const wfrpDragAndDrop = ( () => { } getAttrs(token_values, settings => { - - console.log(settings) const default_attr = { width: 70, @@ -511,8 +507,6 @@ const wfrpDragAndDrop = ( () => { getAttrs(attrs, values => { - console.log(values) - for (const item in settings) { if (settings[item] !== "") { default_attr[item] = settings[item]; diff --git a/Warhammer Fantasy Roleplay 4e Official/src/js/helperfunctions.js b/Warhammer Fantasy Roleplay 4e Official/src/js/helperfunctions.js index b64733c066..11db4bb034 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/js/helperfunctions.js +++ b/Warhammer Fantasy Roleplay 4e Official/src/js/helperfunctions.js @@ -1,3 +1,5 @@ + + const helperFunctions = (() => { const extractRepeatingId = (attribute, section) => { diff --git a/Warhammer Fantasy Roleplay 4e Official/src/js/sheetworkers.js b/Warhammer Fantasy Roleplay 4e Official/src/js/sheetworkers.js index eebae94bf6..294a78997e 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/js/sheetworkers.js +++ b/Warhammer Fantasy Roleplay 4e Official/src/js/sheetworkers.js @@ -3,7 +3,7 @@ const wfrpModule = ( () => { // Global Variables const wfrp = { - sheet_version: "1.0.3", + sheet_version: "1.0.4", characteristics: [ "weapon_skill", @@ -96,6 +96,7 @@ const wfrpModule = ( () => { "explosives", "sling", "throwing", + "azyr", "aqshy", "chamon", "dhar", @@ -104,7 +105,8 @@ const wfrpModule = ( () => { "hysh", "shyish", "ulgu", - "magick" + "magick", + "custom" ], repeating_skills: [ @@ -137,7 +139,10 @@ const wfrpModule = ( () => { const initSheet = () => { - wfrp.characteristics.forEach(char => calculateCharacteristic(char)); + wfrp.characteristics.forEach(char => { + calculateCharacteristic(char) + recalculateAttribute(`${char}_modifier`, char); + }); wfrp.skills.forEach(skill => calculateSkill(skill)); @@ -188,7 +193,7 @@ const wfrpModule = ( () => { let slbonus = ""; if (new_value === "1") { - query = "?{Bonus|0}"; + query = "?{Target Bonus|0}"; slbonus = "{{sl_bonus=?{SL Bonus|0}}}" } @@ -217,10 +222,10 @@ const wfrpModule = ( () => { } const toggleInitOption = (new_value) => { - const init = (new_value === "1") ? `{{init=[[@{initiative} &{tracker}]]}}` : - (new_value === "2") ? `{{init=[[@{initiative}+1d10 &{tracker}]]}}` : - (new_value === "3") ? `{{init=[[@{agility_bonus}+@{initiative_bonus}+1d10 &{tracker}]]}}` : - `{{init=[[@{initiative}]]}}`; + const init = (new_value === "1") ? `{{init=[[@{initiative}+@{init_bonus} &{tracker}]]}}` : + (new_value === "2") ? `{{init=[[@{initiative}+1d10+@{init_bonus} &{tracker}]]}}` : + (new_value === "3") ? `{{init=[[@{agility_bonus}+@{initiatve_bonus}+1d10+@{init_bonus} &{tracker}]]}}` : + `{{init=[[@{initiative}+@{init_bonus}]]}}`; setAttrs({roll_init:init}); } @@ -266,7 +271,7 @@ const wfrpModule = ( () => { } const recalculateAttribute = (attribute, query) => { - const attrs = [...wfrp.characteristics, ...wfrp.characteristics.map(item => `${item}_bonus`)]; + const attrs = [...wfrp.characteristics, ...wfrp.characteristics.map(item => `${item}_bonus`), ...wfrp.characteristics.map(item => `${item}_custom_mod`)]; let match_array = [query]; const parsed_query = query.replace(/ /g, "_"); @@ -346,6 +351,8 @@ const wfrpModule = ( () => { } }); + if (wfrp.characteristics.includes(query)) mod_array.push(+values[`${parsed_query}_custom_mod`]); + const new_value = mod_array.reduce((a,b) => a+b, 0); setAttrs({[attribute]:new_value}); @@ -367,6 +374,9 @@ const wfrpModule = ( () => { size: 0 } + if (new_value === "") { + return; + } if (new_value === "human") { update["fate"] = 2; update["resilience"] = 1; @@ -397,6 +407,12 @@ const wfrpModule = ( () => { update["movement"] = 5; update["size"] = "average"; } + if (new_value === "gnome") { + update["fate"] = 2; + update["resilience"] = 0; + update["movement"] = 3; + update["size"] = "small"; + } if (new_value !== "custom") { @@ -404,15 +420,14 @@ const wfrpModule = ( () => { const skills = helperFunctions.parseJSON(page.data.Skills); const talents = helperFunctions.parseJSON(page.data.Talents); - let skills_fixed = []; - let talents_fixed = []; + const skills_fixed = skills.Fixed.split(",").map(item=>item.trim()) || []; + const talents_fixed = talents.Fixed.split(",").map(item=>item.trim()) || []; + let talents_choices = []; let skill_index = 1; let talent_index = 1; - if (skills.Fixed) skills_fixed = skills.Fixed.split(",").map(item=>item.trim()); - if (talents.Fixed) talents_fixed = talents.Fixed.split(",").map(item=>item.trim()); if (talents.Choices) talents.Choices.forEach(choice => talents_choices = [...talents_choices, ...choice]); for (let index = 1; index <= 12; index++) { @@ -442,8 +457,10 @@ const wfrpModule = ( () => { update[`species_talent_${talent_index}_advances`] = "0"; talent_index++; } + + update["advances_changed"] = 1; - setAttrs(update, {silent:true}, callback => calculateTalentAdvances()); + setAttrs(update, {silent:true}); }); } else { @@ -497,7 +514,7 @@ const wfrpModule = ( () => { const initial = parseInt(values[`${characteristic}_initial`]) || 0; const advances = parseInt(values[`${characteristic}_advances`]) || 0; const modifier = parseInt(values[`${characteristic}_modifier`]) || 0; - const custom_mod = parseInt(values[`${characteristic}_custom_mod`]) || 0; + // const custom_mod = parseInt(values[`${characteristic}_custom_mod`]) || 0; const bonusmod = parseInt(values[`${characteristic}_bonusmod`]) || 0; if (values["npc"] === "on") { @@ -513,7 +530,7 @@ const wfrpModule = ( () => { return; } else { - const current = initial + advances + modifier + custom_mod; + const current = initial + advances + modifier; const bonus = Math.floor(current / 10) + bonusmod; @@ -1167,7 +1184,7 @@ const wfrpModule = ( () => { }); } - const calculateSkillAdvances = (skill) => { + const calculateSkillAdvances = () => { getSectionIDs("careers", id_array => { getSectionIDs("noncareer-skills", id_array_2 => { @@ -1346,7 +1363,7 @@ const wfrpModule = ( () => { const key_array = Object.keys(values).filter(item => item !== ""); - let page_name = key.split("(")[0].trim() || key; + let page_name = key.trim() || key; if (value_array_test.includes(page_name.toLowerCase())) { const index = value_array_test.indexOf(page_name.toLowerCase()); @@ -1389,7 +1406,7 @@ const wfrpModule = ( () => { const calculateInitColumns = (source_attribute, new_value) => { const attrs = []; const source_type = (source_attribute.match(/talent/g)) ? "talent" : - (source_attribute.match(/skill/g)) ? "skill" : + (source_attribute.match(/career_skill/g)) ? "skill" : false; const source_id = helperFunctions.extractRepeatingId(source_attribute, "careers"); const is_init = source_attribute.match(/init/); @@ -1410,6 +1427,7 @@ const wfrpModule = ( () => { getAttrs(attrs, values => { const spent = Object.values(values).filter(item => item !== "").map(item => parseInt(item)); + if (spent.length === 0) return; const total = spent.reduce((a,b) => a+b) || 0; const maximum_allowed = (source_type === "skill") ? 40 : 1; @@ -1423,6 +1441,14 @@ const wfrpModule = ( () => { } + const updateAdvances = () => { + wfrp.characteristics.forEach(characteristic => calculateCharacteristicAdvances(characteristic)); + calculateSkillAdvances(); + calculateTalentAdvances(); + + setAttrs({advances_changed:0}); + } + // Trappings, Weapons & Armor Functions const calculateArmour = () => { @@ -1548,9 +1574,9 @@ const wfrpModule = ( () => { armour_array.forEach(id => { const worn = values[`repeating_armour_${id}_armour_worn`] || false; const enc = parseInt(values[`repeating_armour_${id}_armour_enc`]) - const total = (worn === "on") ? enc - 1 : enc || 0 + const total = (enc > 0 && worn === "on") ? enc - 1 : enc || 0 - total_enc += total >= 0 ? total : 0; + total_enc += total; }); weapons_array.forEach(id => { @@ -1565,9 +1591,9 @@ const wfrpModule = ( () => { const worn = values[`repeating_trappings_${id}_trappings_worn`] || false; const inenc = values[`repeating_trappings_${id}_trappings_inenc`] || "0"; - const total = (worn === "on") ? (enc - 1) * amount : enc * amount; + const total = (enc > 0 && worn === "on") ? (enc - 1) * amount : enc * amount; - if (inenc === "on") total_enc += total >= 0 ? total : 0; + if (inenc === "on") total_enc += total; }); setAttrs({encumbrance:total_enc}) @@ -1845,6 +1871,11 @@ const wfrpModule = ( () => { "intuition", "perception", "cool", + "npc_dodge", + "npc_endurance", + "npc_intuition", + "npc_perception", + "npc_cool", ...wfrp.characteristics ]; @@ -1852,11 +1883,31 @@ const wfrpModule = ( () => { if (values[`NPC`] === "0") return; const update = {}; - if (!values[`dodge`]) update[`dodge`] = values[`agility`]; - if (!values[`endurance`]) update[`endurance`] = values[`toughness`]; - if (!values[`intuition`]) update[`intuition`] = values[`initiative`]; - if (!values[`perception`]) update[`perception`] = values[`initiative`]; - if (!values[`cool`]) update[`cool`] = values[`willpower`]; + const dodge = (values["dodge"]) ? values["dodge"] : + (values["npc_dodge"]) ? values["npc_dodge"] : + values["agility"]; + + const endurance = (values["endurance"]) ? values["endurance"] : + (values["npc_endurance"]) ? values["npc_endurance"] : + values["toughness"]; + + const intuition = (values["intuition"]) ? values["intuition"] : + (values["npc_intuition"]) ? values["npc_intuition"] : + values["initiative"]; + + const perception = (values["perception"]) ? values["perception"] : + (values["npc_perception"]) ? values["npc_perception"] : + values["initiative"]; + + const cool = (values["cool"]) ? values["cool"] : + (values["npc_cool"]) ? values["npc_cool"] : + values["willpower"]; + + update[`npc_dodge`] = dodge; + update[`npc_endurance`] = endurance; + update[`npc_intuition`] = intuition; + update[`npc_perception`] = perception; + update[`npc_cool`] = cool; setAttrs(update); @@ -1877,6 +1928,7 @@ const wfrpModule = ( () => { toggleRollCrits:toggleRollCrits, toggleInitOption:toggleInitOption, toggleWhisper:toggleWhisper, + recalculateAttribute:recalculateAttribute, parseModField:parseModField, // Class and Species Controls @@ -1891,7 +1943,6 @@ const wfrpModule = ( () => { // Skill Functions calculateSkill: calculateSkill, calculateSpecialisation: calculateSpecialisation, - //updateRepeatingSkillBase: updateRepeatingSkillBase, recalculateRepeatingSkill: recalculateRepeatingSkill, cascadeSkillChanges:cascadeSkillChanges, @@ -1900,18 +1951,19 @@ const wfrpModule = ( () => { updateCurrentCareer: updateCurrentCareer, updateCurrentCareerLevel: updateCurrentCareerLevel, updateCareerNames: updateCareerNames, - updateFirstCareer:updateFirstCareer, + updateFirstCareer: updateFirstCareer, // Experience Functions - calculateTotalAdvances:calculateTotalAdvances, - recalculateEarnedXP:recalculateEarnedXP, - recalculateCurrentXP:recalculateCurrentXP, - recalculateSpentXP:recalculateSpentXP, calculateCharacteristicAdvances:calculateCharacteristicAdvances, calculateSkillAdvances:calculateSkillAdvances, calculateTalentAdvances:calculateTalentAdvances, + calculateTotalAdvances:calculateTotalAdvances, calculateInitColumns:calculateInitColumns, consolidateXP:consolidateXP, + recalculateEarnedXP:recalculateEarnedXP, + recalculateCurrentXP:recalculateCurrentXP, + recalculateSpentXP:recalculateSpentXP, + updateAdvances: updateAdvances, // Trappings, Weapons & Armor Functions calculateArmour:calculateArmour, @@ -1960,7 +2012,11 @@ on(`change:setting_whisper`, eventInfo => wfrpModule.toggleWhisper(eventInfo.new "repeating_weapon:weapon_mods", "repeating_armour:armour_mods", ].forEach(modifier => { - on(`change:${modifier}`, eventInfo => wfrpModule.parseModField(eventInfo.newValue, eventInfo.previousValue)) + on(`change:${modifier}`, eventInfo => wfrpModule.parseModField(eventInfo.newValue, eventInfo.previousValue)); +}); + +wfrpModule.wfrp.characteristics.forEach(characteristic => { + on(`change:${characteristic}_custom_mod`, eventInfo => wfrpModule.recalculateAttribute(`${characteristic}_modifier`, characteristic)); }); // CLASS AND SPECIES CONTROLS @@ -2012,6 +2068,8 @@ wfrpModule.wfrp.repeating_skills.forEach(section => { // CAREERS CHANGES +on(`clicked:update_advances`, eventInfo => wfrpModule.updateAdvances()); + on(`change:repeating_careers change:_reporder:careers`, eventInfo => { if (eventInfo.sourceType === "player" && !eventInfo.sourceAttribute.match(/reporder/g)) wfrpModule.calculateTotalAdvances(eventInfo.sourceAttribute); wfrpModule.updateCareerPath(); @@ -2044,36 +2102,34 @@ on(`change:current_xp change:spent_xp change:total_xp remove:repeating_experienc on(`change:repeating_experience change:repeating_experiencespent change:experience_mod remove:repeating_experiencespent remove:repeating_experience`, eventInfo => wfrpModule.recalculateSpentXP()); +const advance_triggers = [] + wfrpModule.wfrp.characteristics.forEach(characteristic => { - on(`change:repeating_careers:career_${characteristic}_advances change:repeating_careers:career_${characteristic}_init`, eventInfo => wfrpModule.calculateCharacteristicAdvances(characteristic)) + advance_triggers.push(`change:repeating_careers:career_${characteristic}_advances change:repeating_careers:career_${characteristic}_init`) }); [1,2,3,4].forEach(level => { [1,2,3,4,5].forEach(talent => { - on(`change:repeating_careers:career_talent_${level}_${talent}_name - change:repeating_careers:career_talent_${level}_${talent}_init - change:repeating_careers:career_talent_${level}_${talent}_advances`, - eventInfo => wfrpModule.calculateTalentAdvances()); + advance_triggers.push(`change:repeating_careers:career_talent_${level}_${talent}_name change:repeating_careers:career_talent_${level}_${talent}_init change:repeating_careers:career_talent_${level}_${talent}_advances`) }); [1,2,3,4,5,6,7,8,9,10].forEach(skill => { - on(`change:repeating_careers:career_skill_${level}_${skill}_name - change:repeating_careers:career_skill_${level}_${skill}_init - change:repeating_careers:career_skill_${level}_${skill}_advances`, - eventInfo => wfrpModule.calculateSkillAdvances()); + advance_triggers.push(`change:repeating_careers:career_skill_${level}_${skill}_name change:repeating_careers:career_skill_${level}_${skill}_init change:repeating_careers:career_skill_${level}_${skill}_advances`); }); }); for (let index = 1; index <= 12; index++) { - on(`clicked:remove_skill_${index}`, eventInfo => setAttrs({[`species_skill_${index}_advances`]:"0"})); + advance_triggers.push(`clicked:remove_skill_${index}`); - on(`change:species_skill_${index}_advances`, eventInfo => wfrpModule.calculateSkillAdvances()); + advance_triggers.push(`change:species_skill_${index}_advances`); } for (let index = 1; index <= 10; index++) { - on(`change:species_talent_${index}_advances`, eventInfo => wfrpModule.calculateTalentAdvances()) + advance_triggers.push(`change:species_talent_${index}_advances`); }; +on(advance_triggers.join(" "), eventInfo => setAttrs({advances_changed:"1"})); + on(`clicked:combinexp`, eventInfo => wfrpModule.consolidateXP()); on(`clicked:advance`, eventInfo => wfrpModule.advanceXP()); @@ -2090,7 +2146,7 @@ on(`change:repeating_careers`, eventInfo => wfrpModule.calculateInitColumns(even on(`change:repeating_armour remove:repeating_armour`, eventInfo => wfrpModule.calculateArmour()); -on(`change:repeating_trappings change:repeating_armour:armour_enc change:repeating_weapons:weapon_enc`, eventInfo => wfrpModule.calculateCurrentEncumbrance()); +on(`change:repeating_trappings change:repeating_armour:armour_enc change:repeating_armour:armour_worn change:repeating_weapons:weapon_enc`, eventInfo => wfrpModule.calculateCurrentEncumbrance()); on(`change:repeating_weapons:weapon_damage_flat change:repeating_weapons:weapon_damage_bonus`, eventInfo => wfrpModule.updateWeaponDamage(eventInfo.sourceAttribute)); @@ -2122,11 +2178,9 @@ on(`change:repeating_attacks:attack_name change:repeating_attacks:attack_type`, on(`change:weapon_skill change:ballistic_skill`, eventInfo => wfrpModule.cascadeNPCAttacks()); -wfrpModule.wfrp.characteristics.forEach(characteristic => { +[...wfrpModule.wfrp.characteristics, "initiative", "dodge", "endurance", "intuition", "perception", "cool"].forEach(characteristic => { on(`change:${characteristic} change:${characteristic}_bonus`, eventInfo => wfrpModule.updateNPCButtons()) }); on(`change:npc sheet:opened`, eventInfo => wfrpModule.updateNPCButtons()); -//# sourceURL=sheetworkers.js - diff --git a/Warhammer Fantasy Roleplay 4e Official/src/pug/abstracts.pug b/Warhammer Fantasy Roleplay 4e Official/src/pug/abstracts.pug index c8ec02ea5f..566922fda8 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/pug/abstracts.pug +++ b/Warhammer Fantasy Roleplay 4e Official/src/pug/abstracts.pug @@ -8,11 +8,13 @@ "name":"Species", "field":"select", "options":[ + "", "Human", "Halfling", "Dwarf", "High Elf", "Wood Elf", + "Gnome", ] }, { @@ -202,7 +204,7 @@ "characteristic":"willpower", "type":"advanced", "grouped":true, - "specialisations":["Aqshy","Chamon","Dhar","Ghur","Ghyran","Hysh","Shyish","Ulgu"], + "specialisations":["Azyr","Aqshy","Chamon","Dhar","Ghur","Ghyran","Hysh","Shyish","Ulgu","Custom"], }, { "name":"Evaluate", diff --git a/Warhammer Fantasy Roleplay 4e Official/src/pug/components/_component-index.pug b/Warhammer Fantasy Roleplay 4e Official/src/pug/components/_component-index.pug index 7b4aef3d76..dbfaa88d74 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/pug/components/_component-index.pug +++ b/Warhammer Fantasy Roleplay 4e Official/src/pug/components/_component-index.pug @@ -31,4 +31,5 @@ include npc-skill.pug include repeating/npc-attack-row.pug include repeating/npc-talent-row.pug include repeating/npc-trait-row.pug -include repeating/npc-opttrait-row.pug \ No newline at end of file +include repeating/npc-opttrait-row.pug +include repeating/npc-additional-skill.pug \ No newline at end of file diff --git a/Warhammer Fantasy Roleplay 4e Official/src/pug/components/control.pug b/Warhammer Fantasy Roleplay 4e Official/src/pug/components/control.pug index 664dc56b56..75dc6e9ebd 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/pug/components/control.pug +++ b/Warhammer Fantasy Roleplay 4e Official/src/pug/components/control.pug @@ -1,7 +1,7 @@ -mixin display-toggle(attr, checked=false) +mixin display-toggle(attr, checked=false, icon="y") label.wfrp-displaytoggle input.wfrp-displaytoggle__hide(checked=checked, name=`attr_${attr}`, type="checkbox", value="1") - span.wfrp-displaytoggle__span y + span.wfrp-displaytoggle__span=icon mixin trait-toggle(attr, display, checked=false) label.wfrp-traittoggle diff --git a/Warhammer Fantasy Roleplay 4e Official/src/pug/components/repeating/npc-additional-skill.pug b/Warhammer Fantasy Roleplay 4e Official/src/pug/components/repeating/npc-additional-skill.pug new file mode 100644 index 0000000000..c9a61eb1e1 --- /dev/null +++ b/Warhammer Fantasy Roleplay 4e Official/src/pug/components/repeating/npc-additional-skill.pug @@ -0,0 +1,13 @@ +mixin npc-additional-skill() + .wfrp-npcsettings__skill + input.wfrp-npcsettings__input(data-i18n-placeholder="Skill Name (Specialisation)", name=`attr_npc_skillname`, type="text") + input.wfrp-npcsettings__input(name=`attr_npc_skill`, type="number") + +mixin npc-additional-skill-display() + button.wfrp-npcskill(type="roll", value=rolls.npc_repeating_skill) + input(name=`attr_npc_skill`, type="hidden") + input(name=`attr_npc_skillname`, type="hidden") + .wfrp-npcskill__title + span(name=`attr_npc_skillname`) + .wfrp-npcskill__value + span(name=`attr_npc_skill`) \ No newline at end of file diff --git a/Warhammer Fantasy Roleplay 4e Official/src/pug/components/repeating/spell-row.pug b/Warhammer Fantasy Roleplay 4e Official/src/pug/components/repeating/spell-row.pug index 085beea23e..fa7bd4c6ea 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/pug/components/repeating/spell-row.pug +++ b/Warhammer Fantasy Roleplay 4e Official/src/pug/components/repeating/spell-row.pug @@ -36,12 +36,12 @@ mixin spell-row .wfrp-settings__label(data-i18n=`Name`) input.wfrp-settings__input(name=`attr_spell_name`, type="text") - input(name=`attr_spell_type`, type="hidden") + input(name=`attr_spell_type`, type="hidden", value="Spell") .wfrp-settings__row .wfrp-settings__label(data-i18n=`Type`) select.wfrp-settings__input(name=`attr_spell_type`) - option(value="Spell",data-i18n="Spell") - option(value="Prayer",data-i18n="Prayer") + option(value="Spell", data-i18n="Spell") + option(value="Prayer", data-i18n="Prayer") .wfrp-settings__row.control__hide--Spell .wfrp-settings__label(data-i18n=`Lore`) diff --git a/Warhammer Fantasy Roleplay 4e Official/src/pug/components/skill-grouped.pug b/Warhammer Fantasy Roleplay 4e Official/src/pug/components/skill-grouped.pug index a48810cf7c..4004f83c4e 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/pug/components/skill-grouped.pug +++ b/Warhammer Fantasy Roleplay 4e Official/src/pug/components/skill-grouped.pug @@ -32,14 +32,23 @@ mixin skill-grouped(skill) -const attr = specialisation.toLowerCase().replace(/ /g,"_"); input(name=`attr_${attr}_settings`, type="hidden") input(name=`attr_${attr}_control`, type="hidden") + .wfrp-skilltable__row--specialisation(class=`control__hide--${attr}`) input(name=`attr_${attr}_characteristic`, type="hidden", value=char_attr) .wfrp-skilltable__cell--settingstoggle +display-toggle(`${attr}_settings`) - .wfrp-skilltable__cell - button(data-i18n=specialisation, name=`roll_${attr}`, type="roll", value=rolls.skills[attr]) + if (specialisation === "Custom") + + .wfrp-skilltable__cell + button(name=`roll_${attr}`, type="roll", value=rolls.skills[attr]) + span(name=`attr_${attr}_name`) + + else + + .wfrp-skilltable__cell + button(data-i18n=specialisation, name=`roll_${attr}`, type="roll", value=rolls.skills[attr]) .wfrp-skilltable__cell +characteristic-select(characteristic,`${attr}_characteristic`, true) @@ -58,6 +67,11 @@ mixin skill-grouped(skill) span.display(name=`attr_${attr}`) .wfrp-skilltable_row.wfrp-settings(class=`control__hide--${attr}_settings`) + + if (specialisation === "Custom") + .wfrp-settings__row--span + .wfrp-settings__label(data-i18n=`Name`) + input.wfrp-settings__input(name=`attr_${attr}_name`, type="text") .wfrp-settings__row .wfrp-settings__label(data-i18n=`Modifier`) diff --git a/Warhammer Fantasy Roleplay 4e Official/src/pug/layout/npc.pug b/Warhammer Fantasy Roleplay 4e Official/src/pug/layout/npc.pug index d6aad0df2c..ce31952bb4 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/pug/layout/npc.pug +++ b/Warhammer Fantasy Roleplay 4e Official/src/pug/layout/npc.pug @@ -54,6 +54,9 @@ .wfrp-npcsettings__label(data-i18n=`${skill.name} (${specialism})`) input.wfrp-npcsettings__input(name=`attr_${specialism}`, type="number") + h2(data-i18n="Additional Skills") + .wfrp-npcsettings__skills--additional + +repeating-section("npc-skills","npc-additional-skill") h2(data-i18n="Settings") .wfrp-npcsettings__settings @@ -105,6 +108,10 @@ option(value="2") 1d10+I option(value="3") 1d10+IB+AgB + .wfrp-npcsettings__row + .wfrp-npcsettings__label(data-i18n="Initiative Roll Bonus") + input.wfrp-npcsettings__input(name=`attr_init_bonus`, type="number", value="0") + .wfrp-npcsettings__row .wfrp-npcsettings__label(data-i18n="Maximum Advantage") input.wfrp-npcsettings__input(name="attr_setting_max_advantage", type="number") @@ -151,6 +158,10 @@ each skill in [...skills.basic, ...skills.advanced] +npc-skill(skill) + .wfrp-npcskill__wrapper + +repeating-section("npc-skills","npc-additional-skill-display") + + .wfrp-npccombat h2.wfrp-npc__subtitle(data-i18n="Combat") .wfrp-npcadvantage @@ -160,15 +171,15 @@ .wfrp-npccontrols__button button(data-i18n="Initiative", type="roll", value=`&{template:wfrp} {{name=@{character_name}}} {{roll_name=Initiative}} @{roll_init}`) .wfrp-npccontrols__button - button(data-i18n="Dodge", type="roll", value=rolls.combat.dodge) + button(data-i18n="Dodge", type="roll", value=rolls.combat.npc_dodge) .wfrp-npccontrols__button - button(data-i18n="Endurance", type="roll", value=rolls.combat.endurance) + button(data-i18n="Endurance", type="roll", value=rolls.combat.npc_endurance) .wfrp-npccontrols__button - button(data-i18n="Intuition", type="roll", value=rolls.combat.intuition) + button(data-i18n="Intuition", type="roll", value=rolls.combat.npc_intuition) .wfrp-npccontrols__button - button(data-i18n="Perception", type="roll", value=rolls.combat.perception) + button(data-i18n="Perception", type="roll", value=rolls.combat.npc_perception) .wfrp-npccontrols__button - button(data-i18n="Cool", type="roll", value=rolls.combat.cool) + button(data-i18n="Cool", type="roll", value=rolls.combat.npc_cool) .wfrp-npcattack h2.wfrp-npc__subtitle(data-i18n="Attacks") diff --git a/Warhammer Fantasy Roleplay 4e Official/src/pug/layout/pc.pug b/Warhammer Fantasy Roleplay 4e Official/src/pug/layout/pc.pug index 4616448fdd..8e0463287c 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/pug/layout/pc.pug +++ b/Warhammer Fantasy Roleplay 4e Official/src/pug/layout/pc.pug @@ -316,6 +316,12 @@ input(name="attr_setting_button_hide", type="hidden") +species("spells","spell-row") .wfrp-experience--alt.page__advances--flex + + input(name="attr_advances_changed", type="hidden") + .wfrp-panel.wfrp-advancenotify + span.wfrp-advancenotify__message(data-i18n="This sheet has pending advance changes. Click below to save these changes.") + button.wfrp-advancenotify__button(data-i18n="Update", name="act_update_advances", type="action") + .wfrp-panel h1.wfrp-panel__header(data-i18n="Experience") each field in experience diff --git a/Warhammer Fantasy Roleplay 4e Official/src/pug/layout/settings.pug b/Warhammer Fantasy Roleplay 4e Official/src/pug/layout/settings.pug index 41a9753b61..38b3f2773b 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/pug/layout/settings.pug +++ b/Warhammer Fantasy Roleplay 4e Official/src/pug/layout/settings.pug @@ -32,10 +32,10 @@ input.wfrp-settingstable__select(name=`attr_encumbrance_mod`, type="number", value="0") .wfrp-settingstable__row - .wfrp-settingstable__label(data-i18n="Hide Control Buttons") + .wfrp-settingstable__label(data-i18n="Control Buttons") select.wfrp-settingstable__select(name="attr_setting_button_hide") - option(data-i18n="Off", value="1") - option(data-i18n="On", value="2") + option(data-i18n="Show", value="1") + option(data-i18n="Hide", value="2") .wfrp-settingspanel.wfrp-panel.page__settings h1.wfrp-panel__header(data-i18n="Roll Options") @@ -68,6 +68,10 @@ option(value="2") 1d10+I option(value="3") 1d10+IB+AgB + .wfrp-settingstable__row + .wfrp-settingstable__label(data-i18n="Initiative Roll Bonus") + input.wfrp-settingstable__select(name=`attr_init_bonus`, type="number", value="0") + .wfrp-settingstable__row .wfrp-settingstable__label(data-i18n="Whisper to GM") select.wfrp-settingstable__select(name="attr_setting_whisper") diff --git a/Warhammer Fantasy Roleplay 4e Official/src/pug/rolls.pug b/Warhammer Fantasy Roleplay 4e Official/src/pug/rolls.pug index c7344653af..8ca6ef3010 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/pug/rolls.pug +++ b/Warhammer Fantasy Roleplay 4e Official/src/pug/rolls.pug @@ -34,8 +34,6 @@ } Object.entries(roll).forEach(([key,val]) => roll_array.push(`{{${key}=${val}}}`)); - - roll_array.push(`{{name=@{character_name}}}`); return roll_array.join(" "); } @@ -77,10 +75,13 @@ [skills.basic[18], skills.advanced[2], skills.advanced[5], skills.advanced[11]].forEach(skill => { skill.specialisations.forEach(specialisation => { + const attr = specialisation.toLowerCase().replace(/ /g,"_"); + const rollName = (specialisation === "Custom") ? "@{custom_name}" : specialisation; + const roll_values = { - roll_name: `${skill.name} - ${specialisation}`, + roll_name: `${skill.name} - ${rollName}`, roll_type: `Specialisation`, roll_notes: `@{${attr}_notes}` } @@ -100,6 +101,16 @@ } rolls.repeating_skill = makeRoll(roll_values, attr); } + + { + const attr = "npc_skill"; + + const roll_values = { + roll_name: `@{npc_skillname}`, + roll_type: `Skill` + } + rolls.npc_repeating_skill = makeRoll(roll_values, attr); + } rolls.repeating = {}; @@ -220,4 +231,20 @@ rolls.combat[attr] = makeRoll(roll_values, attr, true, "combat") + }); + + rolls.npc_combat = {}; + + ["Dodge","Endurance","Intuition","Perception","Cool"].forEach(button => { + + const attr = button.toLowerCase(); + + const roll_values = { + roll_name: button, + roll_type: `Skill`, + roll_notes: `@{${attr}_notes}` + } + + rolls.combat[`npc_${attr}`] = makeRoll(roll_values, `npc_${attr}`, true, "combat"); + }); \ No newline at end of file diff --git a/Warhammer Fantasy Roleplay 4e Official/src/pug/rolltemplates.pug b/Warhammer Fantasy Roleplay 4e Official/src/pug/rolltemplates.pug index 86f3472340..aa52603c6c 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/pug/rolltemplates.pug +++ b/Warhammer Fantasy Roleplay 4e Official/src/pug/rolltemplates.pug @@ -18,34 +18,38 @@ { label: "Bonus", value: "bonus", + type: "number", }, { label: "Advantage", - value: "advantage", + value: "roll_advantage", + type: "number", }, { label: "SL Bonus", - value: "slbonus", + value: "sl_bonus", + type: "number", }, { label: "CN", - value: "cn", + value: "roll_cn", + type: "number", }, { label: "Range", - value: "range", + value: "roll_range", }, { label: "Damage", - value: "damage", + value: "roll_damage", }, { label: "Target", - value: "target", + value: "roll_target", }, { label: "Duration", - value: "duration", + value: "roll_duration", } ]; @@ -265,10 +269,12 @@ rolltemplate.sheet-rolltemplate-wfrp +success-fail() each field in roll_fields - +tags([`roll_${field.value}`]) - .wfrp-roll__row + - const className = (field.type) ? `sheet-wfrp-roll__row--${field.type}` : ``; + + +tags([field.value]) + .wfrp-roll__row(class=className) .wfrp-roll__label(data-i18n=field.label) - .wfrp-roll__value {{roll_#{field.value}}} + .wfrp-roll__value {{#{field.value}}} +tags(["roll_hit_location"]) .wfrp-roll__row diff --git a/Warhammer Fantasy Roleplay 4e Official/src/pug/wfrp4.pug b/Warhammer Fantasy Roleplay 4e Official/src/pug/wfrp4.pug index 32899480df..bc056a9a44 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/pug/wfrp4.pug +++ b/Warhammer Fantasy Roleplay 4e Official/src/pug/wfrp4.pug @@ -3,7 +3,7 @@ include rolls.pug include components/_component-index.pug -input(name="attr_sheet_version", type="hidden", value="1.0.3") +input(name="attr_sheet_version", type="hidden", value="1.0.4") input(name="attr_npc", type="hidden", value="0") input(name="attr_nav", type="hidden", value="main") input(name="attr_difficulty_query", type="hidden", value="?{Difficulty|Average (+20), 20|Very Easy (+60), 60|Easy (+40), 40|Average (+20), 20|Challenging (0), 0|Difficult (-10), -10|Hard (-20), -20|Very Hard (-30), -30}") @@ -12,7 +12,7 @@ input(name="attr_roll_query", type="hidden", value="?{Bonus|0}") input(name="attr_roll_slbonus", type="hidden", value="{{roll_slbonus=?{SL Bonus|0}}}") input(name="attr_roll_cf", type="hidden", value="96") input(name="attr_roll_cs", type="hidden", value="5") -input(name="attr_roll_init", type="hidden", value="{{init=[[@{initiative} &{tracker}]]}}") +input(name="attr_roll_init", type="hidden", value="{{init=[[@{initiative}+@{initiative_bonus} &{tracker}]]}}") input(name="attr_roll_cs", type="hidden", value="5") input(name="attr_roll_whisper", type="hidden", value="") @@ -51,4 +51,6 @@ script(type="text/worker") | include ../js/dragndrop.js | - include ../js/helperfunctions.js \ No newline at end of file + include ../js/helperfunctions.js + | + | //# sourceURL=sheetworkers.js \ No newline at end of file diff --git a/Warhammer Fantasy Roleplay 4e Official/src/scss/_abstracts.scss b/Warhammer Fantasy Roleplay 4e Official/src/scss/_abstracts.scss index 18522630ed..95be79aa02 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/scss/_abstracts.scss +++ b/Warhammer Fantasy Roleplay 4e Official/src/scss/_abstracts.scss @@ -93,6 +93,7 @@ $specialisations: "explosives", "sling", "throwing", + "azyr", "aqshy", "chamon", "dhar", @@ -101,4 +102,5 @@ $specialisations: "hysh", "shyish", "ulgu", - "magick"; \ No newline at end of file + "magick", + "custom"; \ No newline at end of file diff --git a/Warhammer Fantasy Roleplay 4e Official/src/scss/_rolltemplates.scss b/Warhammer Fantasy Roleplay 4e Official/src/scss/_rolltemplates.scss index 2516874071..06c391e365 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/scss/_rolltemplates.scss +++ b/Warhammer Fantasy Roleplay 4e Official/src/scss/_rolltemplates.scss @@ -121,6 +121,10 @@ grid-template-columns: .75fr 1fr; gap: .25rem; + &--number { + grid-template-columns: 1fr 3rem; + } + &--full { @extend .sheet-wfrp-roll__row; grid-template-columns: 1fr; diff --git a/Warhammer Fantasy Roleplay 4e Official/src/scss/control/_hide.scss b/Warhammer Fantasy Roleplay 4e Official/src/scss/control/_hide.scss index cf93ea381c..a798b5b4b9 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/scss/control/_hide.scss +++ b/Warhammer Fantasy Roleplay 4e Official/src/scss/control/_hide.scss @@ -264,6 +264,18 @@ input[name*="settings"] { } } +// Update Advances Control + +.sheet-wfrp-advancenotify { + display: none; +} + +input[name*="advances_changed"] { + &[value="1"] + .sheet-wfrp-advancenotify { + display: block; + } +} + // NPC Settings Control .sheet-wfrp-npcsettings__wrapper { diff --git a/Warhammer Fantasy Roleplay 4e Official/src/scss/layout/_npc.scss b/Warhammer Fantasy Roleplay 4e Official/src/scss/layout/_npc.scss index 9266d91f8e..ca4fae24ed 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/scss/layout/_npc.scss +++ b/Warhammer Fantasy Roleplay 4e Official/src/scss/layout/_npc.scss @@ -102,11 +102,26 @@ grid-template-columns: 1fr 1fr 1fr; gap: $margin-large $margin-large * 2; margin: 0 $margin-large * 3; + + &--additional { + .repcontainer { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: $margin-large $margin-large * 2; + margin: 0 $margin-large * 3; + + } + + .repcontrol { + margin-top: $margin-general; + } + } } &__skill { display: grid; - grid-template-columns: 1fr 1.5em; + grid-template-columns: 1fr 3rem; + grid-gap: $margin-small; } &__settings { @@ -177,8 +192,14 @@ &__skills { - input[type="hidden"][value="0"] + button.sheet-wfrp-npcskill { - display: none; + input[type="hidden"] { + &[value="0"], + &[value=""], + &:not([value]) { + & + button.sheet-wfrp-npcskill { + display: none; + } + } } } @@ -197,6 +218,10 @@ display: flex; flex-wrap: wrap; margin: auto; + + .repcontrol { + display: none; + } } &__title { diff --git a/Warhammer Fantasy Roleplay 4e Official/src/scss/layout/pc/_pc.scss b/Warhammer Fantasy Roleplay 4e Official/src/scss/layout/pc/_pc.scss index 530525042a..89eb91c89e 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/scss/layout/pc/_pc.scss +++ b/Warhammer Fantasy Roleplay 4e Official/src/scss/layout/pc/_pc.scss @@ -69,7 +69,7 @@ &-trappings { grid-column: 1 / span 2; - grid-row: span 6; + grid-row: span 5; display: flex; flex-direction: column; @@ -197,7 +197,7 @@ } &-weapons { - grid-column: 3 / span 4; + grid-column: 1 / span 6; } &-spells { diff --git a/Warhammer Fantasy Roleplay 4e Official/src/scss/styling/_form_fields.scss b/Warhammer Fantasy Roleplay 4e Official/src/scss/styling/_form_fields.scss index 3b8744e938..14143b50b8 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/scss/styling/_form_fields.scss +++ b/Warhammer Fantasy Roleplay 4e Official/src/scss/styling/_form_fields.scss @@ -53,4 +53,21 @@ text-shadow: none; } + button.sheet-wfrp-advancenotify__button { + display: block; + margin: 2px; + padding: $margin-general; + + border-radius: 5px; + + background-color: #28a745; + color: #fff; + + font-family: "Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif; + font-size: 8pt; + font-weight: bold; + text-align: center; + + } + } \ No newline at end of file diff --git a/Warhammer Fantasy Roleplay 4e Official/src/scss/styling/_panel.scss b/Warhammer Fantasy Roleplay 4e Official/src/scss/styling/_panel.scss index 1419d2121a..a7a96525a2 100644 --- a/Warhammer Fantasy Roleplay 4e Official/src/scss/styling/_panel.scss +++ b/Warhammer Fantasy Roleplay 4e Official/src/scss/styling/_panel.scss @@ -3,7 +3,7 @@ border: 3px solid transparent; - border-image: url('https://s3.amazonaws.com/files.d20.io/images/144604966/Zs6TlxfYvUa6o0tD1DmW2Q/max.png?1592590034') 4 round; + border-image: url("https://s3.amazonaws.com/files.d20.io/images/144604966/Zs6TlxfYvUa6o0tD1DmW2Q/max.png?1592590034") 8 / 2 / 0 repeat; h1 { border-bottom: $grid-border; diff --git a/Warhammer Fantasy Roleplay 4e Official/translation.json b/Warhammer Fantasy Roleplay 4e Official/translation.json index cedab16ff5..e3b48e7f61 100644 --- a/Warhammer Fantasy Roleplay 4e Official/translation.json +++ b/Warhammer Fantasy Roleplay 4e Official/translation.json @@ -1,9 +1,11 @@ { + "":"", "Name":"Name", "Species":"Species", "Human":"Human", "Halfling":"Halfling", "Dwarf":"Dwarf", + "Gnome":"Gnome", "Class":"Class", "Academic":"Academic", "Burgher":"Burgher", @@ -55,6 +57,7 @@ "Athletics":"Athletics", "Bribery":"Bribery", "Channelling":"Channelling", + "Azyr":"Azyr", "Aqshy":"Aqshy", "Chamon":"Chamon", "Dhar":"Dhar", @@ -171,6 +174,7 @@ "Adv.":"Adv.", "Total":"Total", "Custom":"Custom", + "Custom Name":"Custom Name", "Char.":"Char.", "Basic Skills":"Basic Skills", "Advanced Skills":"Advanced Skills", @@ -286,6 +290,7 @@ "Source":"Source", "XP":"XP", "Controls":"Controls", + "Control Buttons":"Control Buttons", "Critical Hit":"Critical Hit", "Advantage":"Advantage", "General":"General", @@ -350,7 +355,9 @@ "TB":"TB", "Combat":"Combat", "Channelling (Aqshy)":"Channelling (Aqshy)", + "Channelling (Azyr)":"Channelling (Azyr)", "Channelling (Chamon)":"Channelling (Chamon)", + "Channelling (Custom)":"Channelling (Custom)", "Channelling (Dhar)":"Channelling (Dhar)", "Channelling (Ghur)":"Channelling (Ghur)", "Channelling (Ghyran)":"Channelling (Ghyran)", @@ -384,6 +391,13 @@ "Advance Career Tier":"Advance Career Tier", "Change Career (Incomplete)":"Change Career (Incomplete)", "Change Career (Complete)":"Change Career (Complete)", + "Skill Name (Specialisation)":"Skill Name (Specialisation)", + "Additional Skills":"Additional Skills", + "This sheet has pending advance changes. Click below to save these changes.":"This sheet has pending advance changes. Click below to save these changes.", + "Update":"Update", + "Show":"Show", + "Hide":"Hide", + "Initiative Roll Bonus":"Initiative Roll Bonus", "settings_npc":"NPC", "settings_npc_desc":"The NPC option sets new characters to default to the NPC card style sheet. Useful if the player characters have already been created and all new character sheets added to the game will likely represent non player characters.", "setting_whisper":"Whisper Rolls to GM", diff --git a/Warhammer Fantasy Roleplay 4e Official/wfrp4.css b/Warhammer Fantasy Roleplay 4e Official/wfrp4.css index 01024530a8..150bf37831 100644 --- a/Warhammer Fantasy Roleplay 4e Official/wfrp4.css +++ b/Warhammer Fantasy Roleplay 4e Official/wfrp4.css @@ -170,7 +170,7 @@ input[type=number]::-webkit-outer-spin-button, input[type=number]::-webkit-inner } .sheet-wfrp-pc .sheet-wfrp-trappings { grid-column: 1/span 2; - grid-row: span 6; + grid-row: span 5; display: flex; flex-direction: column; } @@ -254,7 +254,7 @@ input[type=number]::-webkit-outer-spin-button, input[type=number]::-webkit-inner margin: 0.5rem auto; } .sheet-wfrp-pc .sheet-wfrp-weapons { - grid-column: 3/span 4; + grid-column: 1/span 6; } .sheet-wfrp-pc .sheet-wfrp-spells { grid-column: 1/-1; @@ -1055,6 +1055,18 @@ button.sheet-pictos[type=action]:hover { .sheet-wfrp-wrapper button { text-shadow: none; } +.sheet-wfrp-wrapper button.sheet-wfrp-advancenotify__button { + display: block; + margin: 2px; + padding: 0.5rem; + border-radius: 5px; + background-color: #28a745; + color: #fff; + font-family: "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 8pt; + font-weight: bold; + text-align: center; +} .charsheet .sheet-wfrp-wrapper button[type=roll] { margin: 0; @@ -1212,7 +1224,7 @@ button.sheet-pictos[type=action]:hover { .sheet-wfrp-panel { background: url("https://s3.amazonaws.com/files.d20.io/images/144589463/lqxlbyKEgMXnVw8VajQTCQ/max.png?1592586044") #eff2f1 center/cover; border: 3px solid transparent; - border-image: url("https://s3.amazonaws.com/files.d20.io/images/144604966/Zs6TlxfYvUa6o0tD1DmW2Q/max.png?1592590034") 4 round; + border-image: url("https://s3.amazonaws.com/files.d20.io/images/144604966/Zs6TlxfYvUa6o0tD1DmW2Q/max.png?1592590034") 8/2/0 repeat; } .sheet-wfrp-panel h1 { border-bottom: 1px solid black; @@ -1343,7 +1355,7 @@ button.sheet-pictos[type=action]:hover { display: block; } -.sheet-wfrp-npcsettings__wrapper, .sheet-control__hide--npctalent_settings, .sheet-control__hide--npctrait_settings, .sheet-control__hide--npcattack_settings, .sheet-control__hide--Custom, .sheet-control__hide--Prayer, .sheet-control__hide--Spell, .sheet-control__hide--skill, .sheet-control__hide--characteristic, .sheet-wfrp-criticaltable__row .sheet-wfrp-criticaltable__cell--description, .sheet-wfrp-corruptiontable__row .sheet-wfrp-corruptiontable__cell--description, .sheet-wfrp-psychologytable__row .sheet-wfrp-psychologytable__cell--description, .sheet-wfrp-conditiontable__row .sheet-wfrp-conditiontable__cell--description, .sheet-wfrp-talenttable__row .sheet-wfrp-talenttable__cell--description, .sheet-control__hide--spell_settings, .sheet-control__hide--weapon_settings, .sheet-control__hide--armour_settings, .sheet-control__hide--trappings_settings, .sheet-control__hide--species_settings, .sheet-control__hide--career_settings, .sheet-control__hide--critical_settings, .sheet-control__hide--corruption_settings, .sheet-control__hide--psychology_settings, .sheet-control__hide--condition_settings, .sheet-control__hide--talent_settings, .sheet-control__hide--magick, .sheet-control__hide--ulgu, .sheet-control__hide--shyish, .sheet-control__hide--hysh, .sheet-control__hide--ghyran, .sheet-control__hide--ghur, .sheet-control__hide--dhar, .sheet-control__hide--chamon, .sheet-control__hide--aqshy, .sheet-control__hide--throwing, .sheet-control__hide--sling, .sheet-control__hide--explosives, .sheet-control__hide--entangling, .sheet-control__hide--engineering, .sheet-control__hide--crossbow, .sheet-control__hide--bow, .sheet-control__hide--blackpowder, .sheet-control__hide--two-handed, .sheet-control__hide--polearm, .sheet-control__hide--parry, .sheet-control__hide--flail, .sheet-control__hide--fencing, .sheet-control__hide--cavalry, .sheet-control__hide--brawling, .sheet-control__hide--basic, .sheet-control__hide--magick_settings, .sheet-control__hide--ulgu_settings, .sheet-control__hide--shyish_settings, .sheet-control__hide--hysh_settings, .sheet-control__hide--ghyran_settings, .sheet-control__hide--ghur_settings, .sheet-control__hide--dhar_settings, .sheet-control__hide--chamon_settings, .sheet-control__hide--aqshy_settings, .sheet-control__hide--throwing_settings, .sheet-control__hide--sling_settings, .sheet-control__hide--explosives_settings, .sheet-control__hide--entangling_settings, .sheet-control__hide--engineering_settings, .sheet-control__hide--crossbow_settings, .sheet-control__hide--bow_settings, .sheet-control__hide--blackpowder_settings, .sheet-control__hide--two-handed_settings, .sheet-control__hide--polearm_settings, .sheet-control__hide--parry_settings, .sheet-control__hide--flail_settings, .sheet-control__hide--fencing_settings, .sheet-control__hide--cavalry_settings, .sheet-control__hide--brawling_settings, .sheet-control__hide--basic_settings, .sheet-control__hide--stealth_settings, .sheet-control__hide--row_settings, .sheet-control__hide--ride_settings, .sheet-control__hide--perception_settings, .sheet-control__hide--outdoor-survival_settings, .sheet-control__hide--navigation_settings, .sheet-control__hide--melee_settings, .sheet-control__hide--leadership_settings, .sheet-control__hide--intuition_settings, .sheet-control__hide--intimidate_settings, .sheet-control__hide--haggle_settings, .sheet-control__hide--gossip_settings, .sheet-control__hide--gamble_settings, .sheet-control__hide--entertain_settings, .sheet-control__hide--endurance_settings, .sheet-control__hide--drive_settings, .sheet-control__hide--dodge_settings, .sheet-control__hide--cool_settings, .sheet-control__hide--consume-alcohol_settings, .sheet-control__hide--climb_settings, .sheet-control__hide--charm-animal_settings, .sheet-control__hide--charm_settings, .sheet-control__hide--bribery_settings, .sheet-control__hide--athletics_settings, .sheet-control__hide--art_settings, .sheet-control__hide--trade_settings, .sheet-control__hide--track_settings, .sheet-control__hide--swim_settings, .sheet-control__hide--sleight-of-hand_settings, .sheet-control__hide--set-trap_settings, .sheet-control__hide--secret-signs_settings, .sheet-control__hide--sail_settings, .sheet-control__hide--research_settings, .sheet-control__hide--ranged_settings, .sheet-control__hide--pray_settings, .sheet-control__hide--play_settings, .sheet-control__hide--pick-lock_settings, .sheet-control__hide--perform_settings, .sheet-control__hide--lore_settings, .sheet-control__hide--language_settings, .sheet-control__hide--heal_settings, .sheet-control__hide--eva1uate_settings, .sheet-control__hide--channelling_settings, .sheet-control__hide--animal-training_settings, .sheet-control__hide--settings, .sheet-control__hide--animal-care_settings, .sheet-control__hide--fellowship, .sheet-control__hide--willpower, .sheet-control__hide--intelligence, .sheet-control__hide--dexterity, .sheet-control__hide--agility, .sheet-control__hide--initiative, .sheet-control__hide--toughness, .sheet-control__hide--strength, .sheet-control__hide--ballistic_skill, .sheet-control__hide--weapon_skill { +.sheet-wfrp-npcsettings__wrapper, .sheet-control__hide--npctalent_settings, .sheet-control__hide--npctrait_settings, .sheet-control__hide--npcattack_settings, .sheet-control__hide--Custom, .sheet-control__hide--Prayer, .sheet-control__hide--Spell, .sheet-control__hide--skill, .sheet-control__hide--characteristic, .sheet-wfrp-criticaltable__row .sheet-wfrp-criticaltable__cell--description, .sheet-wfrp-corruptiontable__row .sheet-wfrp-corruptiontable__cell--description, .sheet-wfrp-psychologytable__row .sheet-wfrp-psychologytable__cell--description, .sheet-wfrp-conditiontable__row .sheet-wfrp-conditiontable__cell--description, .sheet-wfrp-talenttable__row .sheet-wfrp-talenttable__cell--description, .sheet-control__hide--spell_settings, .sheet-control__hide--weapon_settings, .sheet-control__hide--armour_settings, .sheet-control__hide--trappings_settings, .sheet-control__hide--species_settings, .sheet-control__hide--career_settings, .sheet-control__hide--critical_settings, .sheet-control__hide--corruption_settings, .sheet-control__hide--psychology_settings, .sheet-control__hide--condition_settings, .sheet-control__hide--talent_settings, .sheet-control__hide--custom, .sheet-control__hide--magick, .sheet-control__hide--ulgu, .sheet-control__hide--shyish, .sheet-control__hide--hysh, .sheet-control__hide--ghyran, .sheet-control__hide--ghur, .sheet-control__hide--dhar, .sheet-control__hide--chamon, .sheet-control__hide--aqshy, .sheet-control__hide--azyr, .sheet-control__hide--throwing, .sheet-control__hide--sling, .sheet-control__hide--explosives, .sheet-control__hide--entangling, .sheet-control__hide--engineering, .sheet-control__hide--crossbow, .sheet-control__hide--bow, .sheet-control__hide--blackpowder, .sheet-control__hide--two-handed, .sheet-control__hide--polearm, .sheet-control__hide--parry, .sheet-control__hide--flail, .sheet-control__hide--fencing, .sheet-control__hide--cavalry, .sheet-control__hide--brawling, .sheet-control__hide--basic, .sheet-control__hide--custom_settings, .sheet-control__hide--magick_settings, .sheet-control__hide--ulgu_settings, .sheet-control__hide--shyish_settings, .sheet-control__hide--hysh_settings, .sheet-control__hide--ghyran_settings, .sheet-control__hide--ghur_settings, .sheet-control__hide--dhar_settings, .sheet-control__hide--chamon_settings, .sheet-control__hide--aqshy_settings, .sheet-control__hide--azyr_settings, .sheet-control__hide--throwing_settings, .sheet-control__hide--sling_settings, .sheet-control__hide--explosives_settings, .sheet-control__hide--entangling_settings, .sheet-control__hide--engineering_settings, .sheet-control__hide--crossbow_settings, .sheet-control__hide--bow_settings, .sheet-control__hide--blackpowder_settings, .sheet-control__hide--two-handed_settings, .sheet-control__hide--polearm_settings, .sheet-control__hide--parry_settings, .sheet-control__hide--flail_settings, .sheet-control__hide--fencing_settings, .sheet-control__hide--cavalry_settings, .sheet-control__hide--brawling_settings, .sheet-control__hide--basic_settings, .sheet-control__hide--stealth_settings, .sheet-control__hide--row_settings, .sheet-control__hide--ride_settings, .sheet-control__hide--perception_settings, .sheet-control__hide--outdoor-survival_settings, .sheet-control__hide--navigation_settings, .sheet-control__hide--melee_settings, .sheet-control__hide--leadership_settings, .sheet-control__hide--intuition_settings, .sheet-control__hide--intimidate_settings, .sheet-control__hide--haggle_settings, .sheet-control__hide--gossip_settings, .sheet-control__hide--gamble_settings, .sheet-control__hide--entertain_settings, .sheet-control__hide--endurance_settings, .sheet-control__hide--drive_settings, .sheet-control__hide--dodge_settings, .sheet-control__hide--cool_settings, .sheet-control__hide--consume-alcohol_settings, .sheet-control__hide--climb_settings, .sheet-control__hide--charm-animal_settings, .sheet-control__hide--charm_settings, .sheet-control__hide--bribery_settings, .sheet-control__hide--athletics_settings, .sheet-control__hide--art_settings, .sheet-control__hide--trade_settings, .sheet-control__hide--track_settings, .sheet-control__hide--swim_settings, .sheet-control__hide--sleight-of-hand_settings, .sheet-control__hide--set-trap_settings, .sheet-control__hide--secret-signs_settings, .sheet-control__hide--sail_settings, .sheet-control__hide--research_settings, .sheet-control__hide--ranged_settings, .sheet-control__hide--pray_settings, .sheet-control__hide--play_settings, .sheet-control__hide--pick-lock_settings, .sheet-control__hide--perform_settings, .sheet-control__hide--lore_settings, .sheet-control__hide--language_settings, .sheet-control__hide--heal_settings, .sheet-control__hide--eva1uate_settings, .sheet-control__hide--channelling_settings, .sheet-control__hide--animal-training_settings, .sheet-control__hide--settings, .sheet-control__hide--animal-care_settings, .sheet-control__hide--fellowship, .sheet-control__hide--willpower, .sheet-control__hide--intelligence, .sheet-control__hide--dexterity, .sheet-control__hide--agility, .sheet-control__hide--initiative, .sheet-control__hide--toughness, .sheet-control__hide--strength, .sheet-control__hide--ballistic_skill, .sheet-control__hide--weapon_skill { display: none; } @@ -1351,7 +1363,7 @@ input[name*=characteristic][value=fellowship] ~ .sheet-control__hide--fellowship display: block; } -input[name*=npc_settings][value=on] + .sheet-wfrp-npcsettings__wrapper, input[name*=settings][value="1"] + div > .sheet-control__hide--npctalent_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--npctrait_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--npcattack_settings, input[name*=type][value=Custom] ~ .sheet-control__hide--Custom, input[name*=type][value=Prayer] ~ .sheet-control__hide--Prayer, input[name*=type][value=Spell] ~ .sheet-control__hide--Spell, input[name=attr_talent_test_type][value=skill] ~ .sheet-control__hide--skill, input[name=attr_talent_test_type][value=characteristic] ~ .sheet-control__hide--characteristic, .sheet-wfrp-criticaltable__row input[name=attr_critical_toggle][value="1"] + .sheet-wfrp-criticaltable__cell--description, .sheet-wfrp-corruptiontable__row input[name=attr_corruption_toggle][value="1"] + .sheet-wfrp-corruptiontable__cell--description, .sheet-wfrp-psychologytable__row input[name=attr_psychology_toggle][value="1"] + .sheet-wfrp-psychologytable__cell--description, .sheet-wfrp-conditiontable__row input[name=attr_condition_toggle][value="1"] + .sheet-wfrp-conditiontable__cell--description, .sheet-wfrp-talenttable__row input[name=attr_talent_toggle][value="1"] + .sheet-wfrp-talenttable__cell--description, input[name*=settings][value="1"] + div > .sheet-control__hide--spell_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--weapon_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--armour_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--trappings_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--species_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--career_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--critical_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--corruption_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--psychology_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--condition_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--talent_settings, input[name*=control][value=on] + .sheet-control__hide--magick, input[name*=control][value=on] + .sheet-control__hide--ulgu, input[name*=control][value=on] + .sheet-control__hide--shyish, input[name*=control][value=on] + .sheet-control__hide--hysh, input[name*=control][value=on] + .sheet-control__hide--ghyran, input[name*=control][value=on] + .sheet-control__hide--ghur, input[name*=control][value=on] + .sheet-control__hide--dhar, input[name*=control][value=on] + .sheet-control__hide--chamon, input[name*=control][value=on] + .sheet-control__hide--aqshy, input[name*=control][value=on] + .sheet-control__hide--throwing, input[name*=control][value=on] + .sheet-control__hide--sling, input[name*=control][value=on] + .sheet-control__hide--explosives, input[name*=control][value=on] + .sheet-control__hide--entangling, input[name*=control][value=on] + .sheet-control__hide--engineering, input[name*=control][value=on] + .sheet-control__hide--crossbow, input[name*=control][value=on] + .sheet-control__hide--bow, input[name*=control][value=on] + .sheet-control__hide--blackpowder, input[name*=control][value=on] + .sheet-control__hide--two-handed, input[name*=control][value=on] + .sheet-control__hide--polearm, input[name*=control][value=on] + .sheet-control__hide--parry, input[name*=control][value=on] + .sheet-control__hide--flail, input[name*=control][value=on] + .sheet-control__hide--fencing, input[name*=control][value=on] + .sheet-control__hide--cavalry, input[name*=control][value=on] + .sheet-control__hide--brawling, input[name*=control][value=on] + .sheet-control__hide--basic, input[name*=settings][value="1"] ~ div > .sheet-control__hide--magick_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--ulgu_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--shyish_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--hysh_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--ghyran_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--ghur_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--dhar_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--chamon_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--aqshy_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--throwing_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--sling_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--explosives_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--entangling_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--engineering_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--crossbow_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--bow_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--blackpowder_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--two-handed_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--polearm_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--parry_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--flail_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--fencing_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--cavalry_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--brawling_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--basic_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--stealth_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--row_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--ride_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--perception_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--outdoor-survival_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--navigation_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--melee_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--leadership_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--intuition_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--intimidate_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--haggle_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--gossip_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--gamble_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--entertain_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--endurance_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--drive_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--dodge_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--cool_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--consume-alcohol_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--climb_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--charm-animal_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--charm_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--bribery_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--athletics_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--art_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--trade_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--track_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--swim_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--sleight-of-hand_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--set-trap_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--secret-signs_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--sail_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--research_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--ranged_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--pray_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--play_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--pick-lock_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--perform_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--lore_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--language_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--heal_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--eva1uate_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--channelling_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--animal-training_settings, input[name*=settings][value="1"] ~ div > div[class*=settings], input[name*=settings][value="1"] ~ div > .sheet-control__hide--animal-care_settings { +input[name*=npc_settings][value=on] + .sheet-wfrp-npcsettings__wrapper, input[name*=settings][value="1"] + div > .sheet-control__hide--npctalent_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--npctrait_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--npcattack_settings, input[name*=type][value=Custom] ~ .sheet-control__hide--Custom, input[name*=type][value=Prayer] ~ .sheet-control__hide--Prayer, input[name*=type][value=Spell] ~ .sheet-control__hide--Spell, input[name=attr_talent_test_type][value=skill] ~ .sheet-control__hide--skill, input[name=attr_talent_test_type][value=characteristic] ~ .sheet-control__hide--characteristic, .sheet-wfrp-criticaltable__row input[name=attr_critical_toggle][value="1"] + .sheet-wfrp-criticaltable__cell--description, .sheet-wfrp-corruptiontable__row input[name=attr_corruption_toggle][value="1"] + .sheet-wfrp-corruptiontable__cell--description, .sheet-wfrp-psychologytable__row input[name=attr_psychology_toggle][value="1"] + .sheet-wfrp-psychologytable__cell--description, .sheet-wfrp-conditiontable__row input[name=attr_condition_toggle][value="1"] + .sheet-wfrp-conditiontable__cell--description, .sheet-wfrp-talenttable__row input[name=attr_talent_toggle][value="1"] + .sheet-wfrp-talenttable__cell--description, input[name*=settings][value="1"] + div > .sheet-control__hide--spell_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--weapon_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--armour_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--trappings_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--species_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--career_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--critical_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--corruption_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--psychology_settings, input[name*=settings][value="1"] + div > .sheet-control__hide--condition_settings, input[name*=settings][value="1"] + div > div[class*=settings], input[name*=settings][value="1"] + div > .sheet-control__hide--talent_settings, input[name*=control][value=on] + .sheet-control__hide--custom, input[name*=control][value=on] + .sheet-control__hide--magick, input[name*=control][value=on] + .sheet-control__hide--ulgu, input[name*=control][value=on] + .sheet-control__hide--shyish, input[name*=control][value=on] + .sheet-control__hide--hysh, input[name*=control][value=on] + .sheet-control__hide--ghyran, input[name*=control][value=on] + .sheet-control__hide--ghur, input[name*=control][value=on] + .sheet-control__hide--dhar, input[name*=control][value=on] + .sheet-control__hide--chamon, input[name*=control][value=on] + .sheet-control__hide--aqshy, input[name*=control][value=on] + .sheet-control__hide--azyr, input[name*=control][value=on] + .sheet-control__hide--throwing, input[name*=control][value=on] + .sheet-control__hide--sling, input[name*=control][value=on] + .sheet-control__hide--explosives, input[name*=control][value=on] + .sheet-control__hide--entangling, input[name*=control][value=on] + .sheet-control__hide--engineering, input[name*=control][value=on] + .sheet-control__hide--crossbow, input[name*=control][value=on] + .sheet-control__hide--bow, input[name*=control][value=on] + .sheet-control__hide--blackpowder, input[name*=control][value=on] + .sheet-control__hide--two-handed, input[name*=control][value=on] + .sheet-control__hide--polearm, input[name*=control][value=on] + .sheet-control__hide--parry, input[name*=control][value=on] + .sheet-control__hide--flail, input[name*=control][value=on] + .sheet-control__hide--fencing, input[name*=control][value=on] + .sheet-control__hide--cavalry, input[name*=control][value=on] + .sheet-control__hide--brawling, input[name*=control][value=on] + .sheet-control__hide--basic, input[name*=settings][value="1"] ~ div > .sheet-control__hide--custom_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--magick_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--ulgu_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--shyish_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--hysh_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--ghyran_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--ghur_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--dhar_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--chamon_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--aqshy_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--azyr_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--throwing_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--sling_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--explosives_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--entangling_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--engineering_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--crossbow_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--bow_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--blackpowder_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--two-handed_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--polearm_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--parry_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--flail_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--fencing_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--cavalry_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--brawling_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--basic_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--stealth_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--row_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--ride_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--perception_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--outdoor-survival_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--navigation_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--melee_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--leadership_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--intuition_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--intimidate_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--haggle_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--gossip_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--gamble_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--entertain_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--endurance_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--drive_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--dodge_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--cool_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--consume-alcohol_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--climb_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--charm-animal_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--charm_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--bribery_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--athletics_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--art_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--trade_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--track_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--swim_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--sleight-of-hand_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--set-trap_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--secret-signs_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--sail_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--research_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--ranged_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--pray_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--play_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--pick-lock_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--perform_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--lore_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--language_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--heal_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--eva1uate_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--channelling_settings, input[name*=settings][value="1"] ~ div > .sheet-control__hide--animal-training_settings, input[name*=settings][value="1"] ~ div > div[class*=settings], input[name*=settings][value="1"] ~ div > .sheet-control__hide--animal-care_settings { display: grid; } @@ -1444,6 +1456,14 @@ input[name*=settings][value="1"] + div > .sheet-wfrp-npctalenttable__cell--descr display: none !important; } +.sheet-wfrp-advancenotify { + display: none; +} + +input[name*=advances_changed][value="1"] + .sheet-wfrp-advancenotify { + display: block; +} + .sheet-wfrp-npc__skills, .sheet-wfrp-npctrappings { display: none; @@ -1620,9 +1640,19 @@ input[type=hidden][name=attr_npc][value=on] ~ * .sheet-wfrp-npc, input[type=hidd gap: 1rem 2rem; margin: 0 3rem; } +.sheet-wfrp-npcsettings__skills--additional .repcontainer { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 1rem 2rem; + margin: 0 3rem; +} +.sheet-wfrp-npcsettings__skills--additional .repcontrol { + margin-top: 0.5rem; +} .sheet-wfrp-npcsettings__skill { display: grid; - grid-template-columns: 1fr 1.5em; + grid-template-columns: 1fr 3rem; + grid-gap: 0.25rem; } .sheet-wfrp-npcsettings__settings { display: grid; @@ -1667,7 +1697,7 @@ input[type=hidden][name=attr_npc][value=on] ~ * .sheet-wfrp-npc, input[type=hidd content: ""; height: 100%; } -.sheet-wfrp-npc__skills input[type=hidden][value="0"] + button.sheet-wfrp-npcskill { +.sheet-wfrp-npc__skills input[type=hidden][value="0"] + button.sheet-wfrp-npcskill, .sheet-wfrp-npc__skills input[type=hidden][value=""] + button.sheet-wfrp-npcskill, .sheet-wfrp-npc__skills input[type=hidden]:not([value]) + button.sheet-wfrp-npcskill { display: none; } .sheet-wfrp-npc button[type=roll].sheet-wfrp-npcskill { @@ -1682,6 +1712,9 @@ input[type=hidden][name=attr_npc][value=on] ~ * .sheet-wfrp-npc, input[type=hidd flex-wrap: wrap; margin: auto; } +.sheet-wfrp-npcskill__wrapper .repcontrol { + display: none; +} .sheet-wfrp-npcskill__title { display: inline; margin-right: 0.5rem; @@ -1918,6 +1951,9 @@ input[type=hidden][name=attr_npc][value=on] ~ * .sheet-wfrp-npc, input[type=hidd grid-template-columns: 0.75fr 1fr; gap: 0.25rem; } +.sheet-rolltemplate-wfrp .sheet-wfrp-roll__row--number { + grid-template-columns: 1fr 3rem; +} .sheet-rolltemplate-wfrp .sheet-wfrp-roll__row--full { grid-template-columns: 1fr; grid-column: 1/-1; diff --git a/Warhammer Fantasy Roleplay 4e Official/wfrp4.html b/Warhammer Fantasy Roleplay 4e Official/wfrp4.html index a592c70301..4ffceaae09 100644 --- a/Warhammer Fantasy Roleplay 4e Official/wfrp4.html +++ b/Warhammer Fantasy Roleplay 4e Official/wfrp4.html @@ -1,5 +1,5 @@ - + @@ -8,7 +8,7 @@ - + @@ -41,11 +41,13 @@
@@ -141,7 +143,7 @@
- +
@@ -160,7 +162,7 @@
- +
@@ -179,7 +181,7 @@
- +
@@ -198,7 +200,7 @@
- +
@@ -217,7 +219,7 @@
- +
@@ -236,7 +238,7 @@
- +
@@ -255,7 +257,7 @@
- +
@@ -274,7 +276,7 @@
- +
@@ -293,7 +295,7 @@
- +
@@ -312,7 +314,7 @@
- +
@@ -407,7 +409,7 @@
- +
@@ -516,7 +518,7 @@
- +
@@ -632,7 +634,7 @@
- +
@@ -748,7 +750,7 @@
- +
@@ -864,7 +866,7 @@
- +
@@ -980,7 +982,7 @@
- +
@@ -1097,7 +1099,7 @@
- +
@@ -1213,7 +1215,7 @@
- +
@@ -1329,7 +1331,7 @@
- +
@@ -1493,7 +1495,7 @@
- +
@@ -1647,7 +1649,7 @@
- +
@@ -1801,7 +1803,7 @@
- +
@@ -1955,7 +1957,7 @@
- +
@@ -2108,7 +2110,7 @@
- +
@@ -2224,7 +2226,7 @@
- +
@@ -2341,7 +2343,7 @@
- +
@@ -2469,7 +2471,7 @@
- +
@@ -2588,6 +2590,10 @@

+
+
+ +
@@ -2620,6 +2626,87 @@
+
+
+ +
+
+
+
+
+ + +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
@@ -2634,7 +2721,7 @@
- +
@@ -2788,7 +2875,7 @@
- +
@@ -2942,7 +3029,7 @@
- +
@@ -3096,7 +3183,7 @@
- +
@@ -3239,6 +3326,87 @@
+
+ + +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
@@ -3249,7 +3417,7 @@
- +
@@ -3385,7 +3553,7 @@
- +
@@ -3519,7 +3687,7 @@
- +
@@ -3629,7 +3797,7 @@
- +
@@ -3746,7 +3914,7 @@
- +
@@ -3929,7 +4097,7 @@
- +
@@ -4083,7 +4251,7 @@
- +
@@ -4237,7 +4405,7 @@
- +
@@ -4391,7 +4559,7 @@
- +
@@ -4533,7 +4701,7 @@
- +
@@ -4643,7 +4811,7 @@
- +
@@ -4759,7 +4927,7 @@
- +
@@ -4883,7 +5051,7 @@
- +
@@ -5053,7 +5221,7 @@
- +
@@ -5104,7 +5272,7 @@  ()
- +
@@ -5154,7 +5322,7 @@
- +
@@ -5349,19 +5517,19 @@
- +
- +
- +
- +
- +
@@ -5518,7 +5686,7 @@
- +
@@ -5616,7 +5784,7 @@
- +
@@ -5632,7 +5800,7 @@
- +
@@ -6490,6 +6660,10 @@
+ +
+ +

@@ -6573,10 +6747,10 @@
-
+
@@ -6614,6 +6788,10 @@
+
+
+ +
+
+
+ +
@@ -6864,6 +7046,10 @@
+
+
+ +
@@ -7041,6 +7227,15 @@
+

+
+
+
+ + +
+
+

@@ -7096,6 +7291,10 @@
+
+
+ +
@@ -7133,61 +7332,61 @@
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
@@ -7206,156 +7405,166 @@

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
+ +
+

@@ -7373,19 +7582,19 @@
- +
- +
- +
- +
- +
@@ -7400,7 +7609,7 @@
- +
@@ -7481,7 +7690,7 @@
- +
@@ -7513,7 +7722,7 @@
- +
@@ -7552,7 +7761,7 @@
- +
@@ -7608,20 +7817,20 @@
{{#^rollTotal() roll 11}}{{#^rollTotal() roll 22}}{{#^rollTotal() roll 33}}{{#^rollTotal() roll 44}}{{#^rollTotal() roll 55}}{{#^rollTotal() roll 66}}{{#^rollTotal() roll 77}}{{#^rollTotal() roll 88}}{{#^rollTotal() roll 99}}{{#rollBetween() target 0 9}}{{#rollBetween() roll 0 9}}Marginal{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Marginal{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Marginal{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Marginal{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Marginal{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Marginal{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Marginal{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Marginal{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Marginal{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Marginal{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Marginal{{/rollBetween() roll 100 109}}{{/rollBetween() target 0 9}}{{#rollBetween() target 10 19}}{{#rollBetween() roll 0 9}}Marginal{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Marginal{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Marginal{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Marginal{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Marginal{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Marginal{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Marginal{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Marginal{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Marginal{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Marginal{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Marginal{{/rollBetween() roll 100 109}}{{/rollBetween() target 10 19}}{{#rollBetween() target 20 29}}{{#rollBetween() roll 0 9}}{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Marginal{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Marginal{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Marginal{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Marginal{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Marginal{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Marginal{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Marginal{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Marginal{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Marginal{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Marginal{{/rollBetween() roll 100 109}}{{/rollBetween() target 20 29}}{{#rollBetween() target 30 39}}{{#rollBetween() roll 0 9}}{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Marginal{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Marginal{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Marginal{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Marginal{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Marginal{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Marginal{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Marginal{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Marginal{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Marginal{{/rollBetween() roll 100 109}}{{/rollBetween() target 30 39}}{{#rollBetween() target 40 49}}{{#rollBetween() roll 0 9}}Impressive{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Marginal{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Marginal{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Marginal{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Marginal{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Marginal{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Marginal{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Marginal{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Marginal{{/rollBetween() roll 100 109}}{{/rollBetween() target 40 49}}{{#rollBetween() target 50 59}}{{#rollBetween() roll 0 9}}Impressive{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Impressive{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Marginal{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Marginal{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Marginal{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Marginal{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Marginal{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Marginal{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Marginal{{/rollBetween() roll 100 109}}{{/rollBetween() target 50 59}}{{#rollBetween() target 60 69}}{{#rollBetween() roll 0 9}}Astounding{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Impressive{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Impressive{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Marginal{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Marginal{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Marginal{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Marginal{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Marginal{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Marginal{{/rollBetween() roll 100 109}}{{/rollBetween() target 60 69}}{{#rollBetween() target 70 79}}{{#rollBetween() roll 0 9}}Astounding{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Astounding{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Impressive{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Impressive{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Marginal{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Marginal{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Marginal{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Marginal{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Marginal{{/rollBetween() roll 100 109}}{{/rollBetween() target 70 79}}{{#rollBetween() target 80 89}}{{#rollBetween() roll 0 9}}Astounding{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Astounding{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Astounding{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Impressive{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Impressive{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Marginal{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Marginal{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Marginal{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Marginal{{/rollBetween() roll 100 109}}{{/rollBetween() target 80 89}}{{#rollBetween() target 90 99}}{{#rollBetween() roll 0 9}}Astounding{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Astounding{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Astounding{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Astounding{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Impressive{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Impressive{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Marginal{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Marginal{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Marginal{{/rollBetween() roll 100 109}}{{/rollBetween() target 90 99}}{{#rollBetween() target 100 109}}{{#rollBetween() roll 0 9}}Astounding{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Astounding{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Astounding{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Astounding{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Astounding{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Impressive{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Impressive{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Marginal{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Marginal{{/rollBetween() roll 100 109}}{{/rollBetween() target 100 109}}{{/^rollTotal() roll 99}}{{/^rollTotal() roll 88}}{{/^rollTotal() roll 77}}{{/^rollTotal() roll 66}}{{/^rollTotal() roll 55}}{{/^rollTotal() roll 44}}{{/^rollTotal() roll 33}}{{/^rollTotal() roll 22}}{{/^rollTotal() roll 11}}{{#rollTotal() roll 11}}{{/rollTotal() roll 11}}{{#rollTotal() roll 22}}{{/rollTotal() roll 22}}{{#rollTotal() roll 33}}{{/rollTotal() roll 33}}{{#rollTotal() roll 44}}{{/rollTotal() roll 44}}{{#rollTotal() roll 55}}{{/rollTotal() roll 55}}{{#rollTotal() roll 66}}{{/rollTotal() roll 66}}{{#rollTotal() roll 77}}{{/rollTotal() roll 77}}{{#rollTotal() roll 88}}{{/rollTotal() roll 88}}{{#rollTotal() roll 99}}{{/rollTotal() roll 99}}{{#rollBetween() target 0 9}}{{#rollBetween() roll 0 9}}(+0){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+-1){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+-2){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+-3){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+-4){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+-5){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+-6){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+-7){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+-8){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+-9){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+-10){{/rollBetween() roll 100 109}}{{/rollBetween() target 0 9}}{{#rollBetween() target 10 19}}{{#rollBetween() roll 0 9}}(+1){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+0){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+-1){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+-2){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+-3){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+-4){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+-5){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+-6){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+-7){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+-8){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+-9){{/rollBetween() roll 100 109}}{{/rollBetween() target 10 19}}{{#rollBetween() target 20 29}}{{#rollBetween() roll 0 9}}(+2){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+1){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+0){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+-1){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+-2){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+-3){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+-4){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+-5){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+-6){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+-7){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+-8){{/rollBetween() roll 100 109}}{{/rollBetween() target 20 29}}{{#rollBetween() target 30 39}}{{#rollBetween() roll 0 9}}(+3){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+2){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+1){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+0){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+-1){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+-2){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+-3){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+-4){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+-5){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+-6){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+-7){{/rollBetween() roll 100 109}}{{/rollBetween() target 30 39}}{{#rollBetween() target 40 49}}{{#rollBetween() roll 0 9}}(+4){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+3){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+2){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+1){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+0){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+-1){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+-2){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+-3){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+-4){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+-5){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+-6){{/rollBetween() roll 100 109}}{{/rollBetween() target 40 49}}{{#rollBetween() target 50 59}}{{#rollBetween() roll 0 9}}(+5){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+4){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+3){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+2){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+1){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+0){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+-1){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+-2){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+-3){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+-4){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+-5){{/rollBetween() roll 100 109}}{{/rollBetween() target 50 59}}{{#rollBetween() target 60 69}}{{#rollBetween() roll 0 9}}(+6){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+5){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+4){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+3){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+2){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+1){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+0){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+-1){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+-2){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+-3){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+-4){{/rollBetween() roll 100 109}}{{/rollBetween() target 60 69}}{{#rollBetween() target 70 79}}{{#rollBetween() roll 0 9}}(+7){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+6){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+5){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+4){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+3){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+2){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+1){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+0){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+-1){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+-2){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+-3){{/rollBetween() roll 100 109}}{{/rollBetween() target 70 79}}{{#rollBetween() target 80 89}}{{#rollBetween() roll 0 9}}(+8){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+7){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+6){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+5){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+4){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+3){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+2){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+1){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+0){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+-1){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+-2){{/rollBetween() roll 100 109}}{{/rollBetween() target 80 89}}{{#rollBetween() target 90 99}}{{#rollBetween() roll 0 9}}(+9){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+8){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+7){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+6){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+5){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+4){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+3){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+2){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+1){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+0){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+-1){{/rollBetween() roll 100 109}}{{/rollBetween() target 90 99}}{{#rollBetween() target 100 109}}{{#rollBetween() roll 0 9}}(+10){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+9){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+8){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+7){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+6){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+5){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+4){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+3){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+2){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+1){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+0){{/rollBetween() roll 100 109}}{{/rollBetween() target 100 109}}{{#rollBetween() target 110 119}}{{#rollBetween() roll 0 9}}(+11){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+10){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+9){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+8){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+7){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+6){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+5){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+4){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+3){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+2){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+1){{/rollBetween() roll 100 109}}{{/rollBetween() target 110 119}}{{#rollBetween() target 120 129}}{{#rollBetween() roll 0 9}}(+12){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+11){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+10){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+9){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+8){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+7){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+6){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+5){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+4){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+3){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+2){{/rollBetween() roll 100 109}}{{/rollBetween() target 120 129}}{{#rollBetween() target 130 139}}{{#rollBetween() roll 0 9}}(+13){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+12){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+11){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+10){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+9){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+8){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+7){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+6){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+5){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+4){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+3){{/rollBetween() roll 100 109}}{{/rollBetween() target 130 139}}{{#rollBetween() target 140 149}}{{#rollBetween() roll 0 9}}(+14){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+13){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+12){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+11){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+10){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+9){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+8){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+7){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+6){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+5){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+4){{/rollBetween() roll 100 109}}{{/rollBetween() target 140 149}}{{#rollBetween() target 150 159}}{{#rollBetween() roll 0 9}}(+15){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(+14){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(+13){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(+12){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(+11){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(+10){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(+9){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(+8){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(+7){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(+6){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(+5){{/rollBetween() roll 100 109}}{{/rollBetween() target 150 159}}
{{/^rollGreater() roll target}}{{/^rollWasFumble() roll}}{{#^rollTotal() roll target}}{{#^rollWasCrit() roll}}{{#^rollLess() roll target}}
{{#^rollTotal() roll 99}}{{#^rollTotal() roll 88}}{{#^rollTotal() roll 77}}{{#^rollTotal() roll 66}}{{#^rollTotal() roll 55}}{{#^rollTotal() roll 44}}{{#^rollTotal() roll 33}}{{#^rollTotal() roll 22}}{{#^rollTotal() roll 11}}{{#rollBetween() target 0 9}}{{#rollBetween() roll 0 9}}Marginal{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Marginal{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Impressive{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Impressive{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Astounding{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Astounding{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Astounding{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Astounding{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Astounding{{/rollBetween() roll 100 109}}{{/rollBetween() target 0 9}}{{#rollBetween() target 10 19}}{{#rollBetween() roll 0 9}}Marginal{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Marginal{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Marginal{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Impressive{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Impressive{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Astounding{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Astounding{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Astounding{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Astounding{{/rollBetween() roll 100 109}}{{/rollBetween() target 10 19}}{{#rollBetween() target 20 29}}{{#rollBetween() roll 0 9}}Marginal{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Marginal{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Marginal{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Marginal{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Impressive{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Impressive{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Astounding{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Astounding{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Astounding{{/rollBetween() roll 100 109}}{{/rollBetween() target 20 29}}{{#rollBetween() target 30 39}}{{#rollBetween() roll 0 9}}Marginal{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Marginal{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Marginal{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Marginal{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Marginal{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Impressive{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Impressive{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Astounding{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Astounding{{/rollBetween() roll 100 109}}{{/rollBetween() target 30 39}}{{#rollBetween() target 40 49}}{{#rollBetween() roll 0 9}}Marginal{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Marginal{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Marginal{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Marginal{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Marginal{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Marginal{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Impressive{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Impressive{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Astounding{{/rollBetween() roll 100 109}}{{/rollBetween() target 40 49}}{{#rollBetween() target 50 59}}{{#rollBetween() roll 0 9}}Marginal{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Marginal{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Marginal{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Marginal{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Marginal{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Marginal{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Marginal{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Impressive{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Impressive{{/rollBetween() roll 100 109}}{{/rollBetween() target 50 59}}{{#rollBetween() target 60 69}}{{#rollBetween() roll 0 9}}Marginal{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Marginal{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Marginal{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Marginal{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Marginal{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Marginal{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Marginal{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Marginal{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Impressive{{/rollBetween() roll 100 109}}{{/rollBetween() target 60 69}}{{#rollBetween() target 70 79}}{{#rollBetween() roll 0 9}}Marginal{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Marginal{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Marginal{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Marginal{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Marginal{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Marginal{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Marginal{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Marginal{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Marginal{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}{{/rollBetween() roll 100 109}}{{/rollBetween() target 70 79}}{{#rollBetween() target 80 89}}{{#rollBetween() roll 0 9}}Marginal{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Marginal{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Marginal{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Marginal{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Marginal{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Marginal{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Marginal{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Marginal{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Marginal{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Marginal{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}{{/rollBetween() roll 100 109}}{{/rollBetween() target 80 89}}{{#rollBetween() target 90 99}}{{#rollBetween() roll 0 9}}Marginal{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Marginal{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Marginal{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Marginal{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Marginal{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Marginal{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Marginal{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Marginal{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Marginal{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Marginal{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Marginal{{/rollBetween() roll 100 109}}{{/rollBetween() target 90 99}}{{#rollBetween() target 100 109}}{{#rollBetween() roll 0 9}}Marginal{{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}Marginal{{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}Marginal{{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}Marginal{{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}Marginal{{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}Marginal{{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}Marginal{{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}Marginal{{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}Marginal{{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}Marginal{{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}Marginal{{/rollBetween() roll 100 109}}{{/rollBetween() target 100 109}}{{/^rollTotal() roll 11}}{{/^rollTotal() roll 22}}{{/^rollTotal() roll 33}}{{/^rollTotal() roll 44}}{{/^rollTotal() roll 55}}{{/^rollTotal() roll 66}}{{/^rollTotal() roll 77}}{{/^rollTotal() roll 88}}{{/^rollTotal() roll 99}}{{#rollTotal() roll 11}}{{/rollTotal() roll 11}}{{#rollTotal() roll 22}}{{/rollTotal() roll 22}}{{#rollTotal() roll 33}}{{/rollTotal() roll 33}}{{#rollTotal() roll 44}}{{/rollTotal() roll 44}}{{#rollTotal() roll 55}}{{/rollTotal() roll 55}}{{#rollTotal() roll 66}}{{/rollTotal() roll 66}}{{#rollTotal() roll 77}}{{/rollTotal() roll 77}}{{#rollTotal() roll 88}}{{/rollTotal() roll 88}}{{#rollTotal() roll 99}}{{/rollTotal() roll 99}}{{#rollBetween() target 0 9}}{{#rollBetween() roll 0 9}}(0){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(-1){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(-2){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(-3){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(-4){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(-5){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(-6){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(-7){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(-8){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(-9){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(-10){{/rollBetween() roll 100 109}}{{/rollBetween() target 0 9}}{{#rollBetween() target 10 19}}{{#rollBetween() roll 0 9}}(1){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(0){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(-1){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(-2){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(-3){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(-4){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(-5){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(-6){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(-7){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(-8){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(-9){{/rollBetween() roll 100 109}}{{/rollBetween() target 10 19}}{{#rollBetween() target 20 29}}{{#rollBetween() roll 0 9}}(2){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(1){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(0){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(-1){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(-2){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(-3){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(-4){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(-5){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(-6){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(-7){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(-8){{/rollBetween() roll 100 109}}{{/rollBetween() target 20 29}}{{#rollBetween() target 30 39}}{{#rollBetween() roll 0 9}}(3){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(2){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(1){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(0){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(-1){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(-2){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(-3){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(-4){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(-5){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(-6){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(-7){{/rollBetween() roll 100 109}}{{/rollBetween() target 30 39}}{{#rollBetween() target 40 49}}{{#rollBetween() roll 0 9}}(4){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(3){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(2){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(1){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(0){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(-1){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(-2){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(-3){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(-4){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(-5){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(-6){{/rollBetween() roll 100 109}}{{/rollBetween() target 40 49}}{{#rollBetween() target 50 59}}{{#rollBetween() roll 0 9}}(5){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(4){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(3){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(2){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(1){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(0){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(-1){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(-2){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(-3){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(-4){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(-5){{/rollBetween() roll 100 109}}{{/rollBetween() target 50 59}}{{#rollBetween() target 60 69}}{{#rollBetween() roll 0 9}}(6){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(5){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(4){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(3){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(2){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(1){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(0){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(-1){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(-2){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(-3){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(-4){{/rollBetween() roll 100 109}}{{/rollBetween() target 60 69}}{{#rollBetween() target 70 79}}{{#rollBetween() roll 0 9}}(7){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(6){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(5){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(4){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(3){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(2){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(1){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(0){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(-1){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(-2){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(-3){{/rollBetween() roll 100 109}}{{/rollBetween() target 70 79}}{{#rollBetween() target 80 89}}{{#rollBetween() roll 0 9}}(8){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(7){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(6){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(5){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(4){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(3){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(2){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(1){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(0){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(-1){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(-2){{/rollBetween() roll 100 109}}{{/rollBetween() target 80 89}}{{#rollBetween() target 90 99}}{{#rollBetween() roll 0 9}}(9){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(8){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(7){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(6){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(5){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(4){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(3){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(2){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(1){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(0){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(-1){{/rollBetween() roll 100 109}}{{/rollBetween() target 90 99}}{{#rollBetween() target 100 109}}{{#rollBetween() roll 0 9}}(10){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(9){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(8){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(7){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(6){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(5){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(4){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(3){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(2){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(1){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(0){{/rollBetween() roll 100 109}}{{/rollBetween() target 100 109}}{{#rollBetween() target 110 119}}{{#rollBetween() roll 0 9}}(11){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(10){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(9){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(8){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(7){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(6){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(5){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(4){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(3){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(2){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(1){{/rollBetween() roll 100 109}}{{/rollBetween() target 110 119}}{{#rollBetween() target 120 129}}{{#rollBetween() roll 0 9}}(12){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(11){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(10){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(9){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(8){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(7){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(6){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(5){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(4){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(3){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(2){{/rollBetween() roll 100 109}}{{/rollBetween() target 120 129}}{{#rollBetween() target 130 139}}{{#rollBetween() roll 0 9}}(13){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(12){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(11){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(10){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(9){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(8){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(7){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(6){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(5){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(4){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(3){{/rollBetween() roll 100 109}}{{/rollBetween() target 130 139}}{{#rollBetween() target 140 149}}{{#rollBetween() roll 0 9}}(14){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(13){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(12){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(11){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(10){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(9){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(8){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(7){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(6){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(5){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(4){{/rollBetween() roll 100 109}}{{/rollBetween() target 140 149}}{{#rollBetween() target 150 159}}{{#rollBetween() roll 0 9}}(15){{/rollBetween() roll 0 9}}{{#rollBetween() roll 10 19}}(14){{/rollBetween() roll 10 19}}{{#rollBetween() roll 20 29}}(13){{/rollBetween() roll 20 29}}{{#rollBetween() roll 30 39}}(12){{/rollBetween() roll 30 39}}{{#rollBetween() roll 40 49}}(11){{/rollBetween() roll 40 49}}{{#rollBetween() roll 50 59}}(10){{/rollBetween() roll 50 59}}{{#rollBetween() roll 60 69}}(9){{/rollBetween() roll 60 69}}{{#rollBetween() roll 70 79}}(8){{/rollBetween() roll 70 79}}{{#rollBetween() roll 80 89}}(7){{/rollBetween() roll 80 89}}{{#rollBetween() roll 90 99}}(6){{/rollBetween() roll 90 99}}{{#rollBetween() roll 100 109}}(5){{/rollBetween() roll 100 109}}{{/rollBetween() target 150 159}} -
{{/^rollLess() roll target}}{{/^rollWasCrit() roll}}{{/^rollTotal() roll target}}{{#roll_bonus}} -
+
{{/^rollLess() roll target}}{{/^rollWasCrit() roll}}{{/^rollTotal() roll target}}{{#bonus}} +
-
{{roll_bonus}}
-
{{/roll_bonus}}{{#roll_advantage}} -
+
{{bonus}}
+
{{/bonus}}{{#roll_advantage}} +
{{roll_advantage}}
-
{{/roll_advantage}}{{#roll_slbonus}} -
+
{{/roll_advantage}}{{#sl_bonus}} +
-
{{roll_slbonus}}
-
{{/roll_slbonus}}{{#roll_cn}} -
+
{{sl_bonus}}
+
{{/sl_bonus}}{{#roll_cn}} +
{{roll_cn}}
{{/roll_cn}}{{#roll_range}} @@ -8668,7 +8877,7 @@ // Global Variables const wfrp = { - sheet_version: "1.0.3", + sheet_version: "1.0.4", characteristics: [ "weapon_skill", @@ -8761,6 +8970,7 @@ "explosives", "sling", "throwing", + "azyr", "aqshy", "chamon", "dhar", @@ -8769,7 +8979,8 @@ "hysh", "shyish", "ulgu", - "magick" + "magick", + "custom" ], repeating_skills: [ @@ -8802,7 +9013,10 @@ const initSheet = () => { - wfrp.characteristics.forEach(char => calculateCharacteristic(char)); + wfrp.characteristics.forEach(char => { + calculateCharacteristic(char) + recalculateAttribute(`${char}_modifier`, char); + }); wfrp.skills.forEach(skill => calculateSkill(skill)); @@ -8853,7 +9067,7 @@ let slbonus = ""; if (new_value === "1") { - query = "?{Bonus|0}"; + query = "?{Target Bonus|0}"; slbonus = "{{sl_bonus=?{SL Bonus|0}}}" } @@ -8882,10 +9096,10 @@ } const toggleInitOption = (new_value) => { - const init = (new_value === "1") ? `{{init=[[@{initiative} &{tracker}]]}}` : - (new_value === "2") ? `{{init=[[@{initiative}+1d10 &{tracker}]]}}` : - (new_value === "3") ? `{{init=[[@{agility_bonus}+@{initiative_bonus}+1d10 &{tracker}]]}}` : - `{{init=[[@{initiative}]]}}`; + const init = (new_value === "1") ? `{{init=[[@{initiative}+@{init_bonus} &{tracker}]]}}` : + (new_value === "2") ? `{{init=[[@{initiative}+1d10+@{init_bonus} &{tracker}]]}}` : + (new_value === "3") ? `{{init=[[@{agility_bonus}+@{initiatve_bonus}+1d10+@{init_bonus} &{tracker}]]}}` : + `{{init=[[@{initiative}+@{init_bonus}]]}}`; setAttrs({roll_init:init}); } @@ -8931,7 +9145,7 @@ } const recalculateAttribute = (attribute, query) => { - const attrs = [...wfrp.characteristics, ...wfrp.characteristics.map(item => `${item}_bonus`)]; + const attrs = [...wfrp.characteristics, ...wfrp.characteristics.map(item => `${item}_bonus`), ...wfrp.characteristics.map(item => `${item}_custom_mod`)]; let match_array = [query]; const parsed_query = query.replace(/ /g, "_"); @@ -9011,6 +9225,8 @@ } }); + if (wfrp.characteristics.includes(query)) mod_array.push(+values[`${parsed_query}_custom_mod`]); + const new_value = mod_array.reduce((a,b) => a+b, 0); setAttrs({[attribute]:new_value}); @@ -9032,6 +9248,9 @@ size: 0 } + if (new_value === "") { + return; + } if (new_value === "human") { update["fate"] = 2; update["resilience"] = 1; @@ -9062,6 +9281,12 @@ update["movement"] = 5; update["size"] = "average"; } + if (new_value === "gnome") { + update["fate"] = 2; + update["resilience"] = 0; + update["movement"] = 3; + update["size"] = "small"; + } if (new_value !== "custom") { @@ -9069,15 +9294,14 @@ const skills = helperFunctions.parseJSON(page.data.Skills); const talents = helperFunctions.parseJSON(page.data.Talents); - let skills_fixed = []; - let talents_fixed = []; + const skills_fixed = skills.Fixed.split(",").map(item=>item.trim()) || []; + const talents_fixed = talents.Fixed.split(",").map(item=>item.trim()) || []; + let talents_choices = []; let skill_index = 1; let talent_index = 1; - if (skills.Fixed) skills_fixed = skills.Fixed.split(",").map(item=>item.trim()); - if (talents.Fixed) talents_fixed = talents.Fixed.split(",").map(item=>item.trim()); if (talents.Choices) talents.Choices.forEach(choice => talents_choices = [...talents_choices, ...choice]); for (let index = 1; index <= 12; index++) { @@ -9107,8 +9331,10 @@ update[`species_talent_${talent_index}_advances`] = "0"; talent_index++; } + + update["advances_changed"] = 1; - setAttrs(update, {silent:true}, callback => calculateTalentAdvances()); + setAttrs(update, {silent:true}); }); } else { @@ -9162,7 +9388,7 @@ const initial = parseInt(values[`${characteristic}_initial`]) || 0; const advances = parseInt(values[`${characteristic}_advances`]) || 0; const modifier = parseInt(values[`${characteristic}_modifier`]) || 0; - const custom_mod = parseInt(values[`${characteristic}_custom_mod`]) || 0; + // const custom_mod = parseInt(values[`${characteristic}_custom_mod`]) || 0; const bonusmod = parseInt(values[`${characteristic}_bonusmod`]) || 0; if (values["npc"] === "on") { @@ -9178,7 +9404,7 @@ return; } else { - const current = initial + advances + modifier + custom_mod; + const current = initial + advances + modifier; const bonus = Math.floor(current / 10) + bonusmod; @@ -9832,7 +10058,7 @@ }); } - const calculateSkillAdvances = (skill) => { + const calculateSkillAdvances = () => { getSectionIDs("careers", id_array => { getSectionIDs("noncareer-skills", id_array_2 => { @@ -10011,7 +10237,7 @@ const key_array = Object.keys(values).filter(item => item !== ""); - let page_name = key.split("(")[0].trim() || key; + let page_name = key.trim() || key; if (value_array_test.includes(page_name.toLowerCase())) { const index = value_array_test.indexOf(page_name.toLowerCase()); @@ -10054,7 +10280,7 @@ const calculateInitColumns = (source_attribute, new_value) => { const attrs = []; const source_type = (source_attribute.match(/talent/g)) ? "talent" : - (source_attribute.match(/skill/g)) ? "skill" : + (source_attribute.match(/career_skill/g)) ? "skill" : false; const source_id = helperFunctions.extractRepeatingId(source_attribute, "careers"); const is_init = source_attribute.match(/init/); @@ -10075,6 +10301,7 @@ getAttrs(attrs, values => { const spent = Object.values(values).filter(item => item !== "").map(item => parseInt(item)); + if (spent.length === 0) return; const total = spent.reduce((a,b) => a+b) || 0; const maximum_allowed = (source_type === "skill") ? 40 : 1; @@ -10088,6 +10315,14 @@ } + const updateAdvances = () => { + wfrp.characteristics.forEach(characteristic => calculateCharacteristicAdvances(characteristic)); + calculateSkillAdvances(); + calculateTalentAdvances(); + + setAttrs({advances_changed:0}); + } + // Trappings, Weapons & Armor Functions const calculateArmour = () => { @@ -10213,9 +10448,9 @@ armour_array.forEach(id => { const worn = values[`repeating_armour_${id}_armour_worn`] || false; const enc = parseInt(values[`repeating_armour_${id}_armour_enc`]) - const total = (worn === "on") ? enc - 1 : enc || 0 + const total = (enc > 0 && worn === "on") ? enc - 1 : enc || 0 - total_enc += total >= 0 ? total : 0; + total_enc += total; }); weapons_array.forEach(id => { @@ -10230,9 +10465,9 @@ const worn = values[`repeating_trappings_${id}_trappings_worn`] || false; const inenc = values[`repeating_trappings_${id}_trappings_inenc`] || "0"; - const total = (worn === "on") ? (enc - 1) * amount : enc * amount; + const total = (enc > 0 && worn === "on") ? (enc - 1) * amount : enc * amount; - if (inenc === "on") total_enc += total >= 0 ? total : 0; + if (inenc === "on") total_enc += total; }); setAttrs({encumbrance:total_enc}) @@ -10510,6 +10745,11 @@ "intuition", "perception", "cool", + "npc_dodge", + "npc_endurance", + "npc_intuition", + "npc_perception", + "npc_cool", ...wfrp.characteristics ]; @@ -10517,11 +10757,31 @@ if (values[`NPC`] === "0") return; const update = {}; - if (!values[`dodge`]) update[`dodge`] = values[`agility`]; - if (!values[`endurance`]) update[`endurance`] = values[`toughness`]; - if (!values[`intuition`]) update[`intuition`] = values[`initiative`]; - if (!values[`perception`]) update[`perception`] = values[`initiative`]; - if (!values[`cool`]) update[`cool`] = values[`willpower`]; + const dodge = (values["dodge"]) ? values["dodge"] : + (values["npc_dodge"]) ? values["npc_dodge"] : + values["agility"]; + + const endurance = (values["endurance"]) ? values["endurance"] : + (values["npc_endurance"]) ? values["npc_endurance"] : + values["toughness"]; + + const intuition = (values["intuition"]) ? values["intuition"] : + (values["npc_intuition"]) ? values["npc_intuition"] : + values["initiative"]; + + const perception = (values["perception"]) ? values["perception"] : + (values["npc_perception"]) ? values["npc_perception"] : + values["initiative"]; + + const cool = (values["cool"]) ? values["cool"] : + (values["npc_cool"]) ? values["npc_cool"] : + values["willpower"]; + + update[`npc_dodge`] = dodge; + update[`npc_endurance`] = endurance; + update[`npc_intuition`] = intuition; + update[`npc_perception`] = perception; + update[`npc_cool`] = cool; setAttrs(update); @@ -10542,6 +10802,7 @@ toggleRollCrits:toggleRollCrits, toggleInitOption:toggleInitOption, toggleWhisper:toggleWhisper, + recalculateAttribute:recalculateAttribute, parseModField:parseModField, // Class and Species Controls @@ -10556,7 +10817,6 @@ // Skill Functions calculateSkill: calculateSkill, calculateSpecialisation: calculateSpecialisation, - //updateRepeatingSkillBase: updateRepeatingSkillBase, recalculateRepeatingSkill: recalculateRepeatingSkill, cascadeSkillChanges:cascadeSkillChanges, @@ -10565,18 +10825,19 @@ updateCurrentCareer: updateCurrentCareer, updateCurrentCareerLevel: updateCurrentCareerLevel, updateCareerNames: updateCareerNames, - updateFirstCareer:updateFirstCareer, + updateFirstCareer: updateFirstCareer, // Experience Functions - calculateTotalAdvances:calculateTotalAdvances, - recalculateEarnedXP:recalculateEarnedXP, - recalculateCurrentXP:recalculateCurrentXP, - recalculateSpentXP:recalculateSpentXP, calculateCharacteristicAdvances:calculateCharacteristicAdvances, calculateSkillAdvances:calculateSkillAdvances, calculateTalentAdvances:calculateTalentAdvances, + calculateTotalAdvances:calculateTotalAdvances, calculateInitColumns:calculateInitColumns, consolidateXP:consolidateXP, + recalculateEarnedXP:recalculateEarnedXP, + recalculateCurrentXP:recalculateCurrentXP, + recalculateSpentXP:recalculateSpentXP, + updateAdvances: updateAdvances, // Trappings, Weapons & Armor Functions calculateArmour:calculateArmour, @@ -10625,7 +10886,11 @@ on(`change:setting_whisper`, eventInfo => wfrpModule.toggleWhisper(eventInfo.new "repeating_weapon:weapon_mods", "repeating_armour:armour_mods", ].forEach(modifier => { - on(`change:${modifier}`, eventInfo => wfrpModule.parseModField(eventInfo.newValue, eventInfo.previousValue)) + on(`change:${modifier}`, eventInfo => wfrpModule.parseModField(eventInfo.newValue, eventInfo.previousValue)); +}); + +wfrpModule.wfrp.characteristics.forEach(characteristic => { + on(`change:${characteristic}_custom_mod`, eventInfo => wfrpModule.recalculateAttribute(`${characteristic}_modifier`, characteristic)); }); // CLASS AND SPECIES CONTROLS @@ -10677,6 +10942,8 @@ wfrpModule.wfrp.repeating_skills.forEach(section => { // CAREERS CHANGES +on(`clicked:update_advances`, eventInfo => wfrpModule.updateAdvances()); + on(`change:repeating_careers change:_reporder:careers`, eventInfo => { if (eventInfo.sourceType === "player" && !eventInfo.sourceAttribute.match(/reporder/g)) wfrpModule.calculateTotalAdvances(eventInfo.sourceAttribute); wfrpModule.updateCareerPath(); @@ -10709,36 +10976,34 @@ on(`change:current_xp change:spent_xp change:total_xp remove:repeating_experienc on(`change:repeating_experience change:repeating_experiencespent change:experience_mod remove:repeating_experiencespent remove:repeating_experience`, eventInfo => wfrpModule.recalculateSpentXP()); +const advance_triggers = [] + wfrpModule.wfrp.characteristics.forEach(characteristic => { - on(`change:repeating_careers:career_${characteristic}_advances change:repeating_careers:career_${characteristic}_init`, eventInfo => wfrpModule.calculateCharacteristicAdvances(characteristic)) + advance_triggers.push(`change:repeating_careers:career_${characteristic}_advances change:repeating_careers:career_${characteristic}_init`) }); [1,2,3,4].forEach(level => { [1,2,3,4,5].forEach(talent => { - on(`change:repeating_careers:career_talent_${level}_${talent}_name - change:repeating_careers:career_talent_${level}_${talent}_init - change:repeating_careers:career_talent_${level}_${talent}_advances`, - eventInfo => wfrpModule.calculateTalentAdvances()); + advance_triggers.push(`change:repeating_careers:career_talent_${level}_${talent}_name change:repeating_careers:career_talent_${level}_${talent}_init change:repeating_careers:career_talent_${level}_${talent}_advances`) }); [1,2,3,4,5,6,7,8,9,10].forEach(skill => { - on(`change:repeating_careers:career_skill_${level}_${skill}_name - change:repeating_careers:career_skill_${level}_${skill}_init - change:repeating_careers:career_skill_${level}_${skill}_advances`, - eventInfo => wfrpModule.calculateSkillAdvances()); + advance_triggers.push(`change:repeating_careers:career_skill_${level}_${skill}_name change:repeating_careers:career_skill_${level}_${skill}_init change:repeating_careers:career_skill_${level}_${skill}_advances`); }); }); for (let index = 1; index <= 12; index++) { - on(`clicked:remove_skill_${index}`, eventInfo => setAttrs({[`species_skill_${index}_advances`]:"0"})); + advance_triggers.push(`clicked:remove_skill_${index}`); - on(`change:species_skill_${index}_advances`, eventInfo => wfrpModule.calculateSkillAdvances()); + advance_triggers.push(`change:species_skill_${index}_advances`); } for (let index = 1; index <= 10; index++) { - on(`change:species_talent_${index}_advances`, eventInfo => wfrpModule.calculateTalentAdvances()) + advance_triggers.push(`change:species_talent_${index}_advances`); }; +on(advance_triggers.join(" "), eventInfo => setAttrs({advances_changed:"1"})); + on(`clicked:combinexp`, eventInfo => wfrpModule.consolidateXP()); on(`clicked:advance`, eventInfo => wfrpModule.advanceXP()); @@ -10755,7 +11020,7 @@ on(`change:repeating_careers`, eventInfo => wfrpModule.calculateInitColumns(even on(`change:repeating_armour remove:repeating_armour`, eventInfo => wfrpModule.calculateArmour()); -on(`change:repeating_trappings change:repeating_armour:armour_enc change:repeating_weapons:weapon_enc`, eventInfo => wfrpModule.calculateCurrentEncumbrance()); +on(`change:repeating_trappings change:repeating_armour:armour_enc change:repeating_armour:armour_worn change:repeating_weapons:weapon_enc`, eventInfo => wfrpModule.calculateCurrentEncumbrance()); on(`change:repeating_weapons:weapon_damage_flat change:repeating_weapons:weapon_damage_bonus`, eventInfo => wfrpModule.updateWeaponDamage(eventInfo.sourceAttribute)); @@ -10787,14 +11052,12 @@ on(`change:repeating_attacks:attack_name change:repeating_attacks:attack_type`, on(`change:weapon_skill change:ballistic_skill`, eventInfo => wfrpModule.cascadeNPCAttacks()); -wfrpModule.wfrp.characteristics.forEach(characteristic => { +[...wfrpModule.wfrp.characteristics, "initiative", "dodge", "endurance", "intuition", "perception", "cool"].forEach(characteristic => { on(`change:${characteristic} change:${characteristic}_bonus`, eventInfo => wfrpModule.updateNPCButtons()) }); on(`change:npc sheet:opened`, eventInfo => wfrpModule.updateNPCButtons()); -//# sourceURL=sheetworkers.js - const wfrpDragAndDrop = ( () => { @@ -10979,8 +11242,6 @@ const wfrpDragAndDrop = ( () => { updateAttrs[`${characteristic.replace(/ /g,"_")}_bonus`] = Math.floor(characteristics[characteristic]/10); } - console.log(updateAttrs); - const trait_map = new Map(); for (const trait of traits) { @@ -11292,8 +11553,6 @@ const wfrpDragAndDrop = ( () => { } getAttrs(token_values, settings => { - - console.log(settings) const default_attr = { width: 70, @@ -11308,8 +11567,6 @@ const wfrpDragAndDrop = ( () => { getAttrs(attrs, values => { - console.log(values) - for (const item in settings) { if (settings[item] !== "") { default_attr[item] = settings[item]; @@ -11353,7 +11610,9 @@ on("change:drop_name", (eventInfo) => { getAttrs(["drop_name", "drop_content", "drop_data"], (values) => { wfrpDragAndDrop.handleDrop(values); }); -});const helperFunctions = (() => { +}); + +const helperFunctions = (() => { const extractRepeatingId = (attribute, section) => { const prefix = `repeating_${section}`; @@ -11426,4 +11685,5 @@ on("change:drop_name", (eventInfo) => { } })(); + //# sourceURL=sheetworkers.js \ No newline at end of file