diff --git a/Altered Carbon Official/src/js/sheetworker.js b/Altered Carbon Official/src/js/sheetworker.js index 0e4cfc47bc..bb2074b9d6 100644 --- a/Altered Carbon Official/src/js/sheetworker.js +++ b/Altered Carbon Official/src/js/sheetworker.js @@ -1,26 +1,26 @@ - -const updateBonuses = () => { - const array = ["strength","empathy","acuity","perception","willpower","intelligence"]; - - getAttrs(array, values => { - - array.forEach(item => updateBonus(item, values[item])); - - }); -} - -const updateBonus = (stat, new_value) => { - const bonus = Math.floor(new_value/10); - - const updateAttrs = {}; - - updateAttrs[`${stat}_bonus`] = bonus; - - setAttrs(updateAttrs); - - console.log(updateAttrs); -} - -["strength","empathy","acuity","perception","willpower","intelligence"].forEach(item => on(`change:${item}`, eventInfo => updateBonus(item, eventInfo.newValue))); - + +const updateBonuses = () => { + const array = ["strength","empathy","acuity","perception","willpower","intelligence"]; + + getAttrs(array, values => { + + array.forEach(item => updateBonus(item, values[item])); + + }); +} + +const updateBonus = (stat, new_value) => { + const bonus = Math.floor(new_value/10); + + const updateAttrs = {}; + + updateAttrs[`${stat}_bonus`] = bonus; + + setAttrs(updateAttrs); + + console.log(updateAttrs); +} + +["strength","empathy","acuity","perception","willpower","intelligence"].forEach(item => on(`change:${item}`, eventInfo => updateBonus(item, eventInfo.newValue))); + on(`sheet:opened`, eventInfo => updateBonuses()) \ No newline at end of file diff --git a/Altered Carbon Official/src/pug/altered-carbon.pug b/Altered Carbon Official/src/pug/altered-carbon.pug index 2dfe5f64b4..4f190c2733 100644 --- a/Altered Carbon Official/src/pug/altered-carbon.pug +++ b/Altered Carbon Official/src/pug/altered-carbon.pug @@ -1,221 +1,221 @@ -include mixins.pug - -.ac-wrapper - h1(data-i18n="DHF Protectorate Citizenship Record") DHF Protectorate Citizenship Record - .ac-header - .ac-header__grid - each entry in ["Character Name", "Planet of Origin", "Age", "Sleeve Type", "Archetype", "Campaign"] - - - const attr = entry.toLowerCase().replace(/ /g,"_"); - .ac-header__item - .ac-header__label(data-i18n=entry)=entry - input.ac-header__input(name=`attr_${attr}`, type="text") - each entry in ["Stackpoints", "Influence Points", "Ego Points", "Wealth Level"] - - const attr = entry.toLowerCase().replace(/ /g,"_"); - .ac-header__item--subitem - .ac-header__label(data-i18n=entry)=entry - input.ac-header__input(name=`attr_${attr}`, type="text") - .ac-nav - each link in ["Character Sheet", "Equipment"] - label.ac-nav__item - input.ac-nav__hide(type="radio", name="attr_nav", value=link) - .ac-nav__label(data-i18n=link)=link - - input.ac-nav__hide(type="hidden", name="attr_nav") - .ac-body - .ac-body__stats - each entry in [{"Strength":["Athletics", "Brawl", "Endurance", "Melee Combat", "Toughness"]},{"Perception":["Detection", "D. Energy Wpns", "Firearms", "Search", "Stealth", "Throw"]},{"Empathy":["Diplomacy", "Expression", "Read Person"]}, {"Willpower":["Composure", "Discipline", "Intimidation"]}, {"Acuity":["Data Analysis", "Data Engineering", "Digi. Networking", "Investigation", "Mechanics", "Navigation", "Pilot", "Survival"]}, {"Intelligence":["Bureaucracy", "Cultures", "Engineering", "Geography", "History", "Science", "Medicine"]}] - - - const block_title = Object.keys(entry)[0]; - const skill_array = Object.values(entry)[0]; - const attr = block_title.toLowerCase().replace(/ /g,"_"); - .ac-stat - .ac-stat__header - .ac-stat__title(data-i18n=block_title)=block_title - .ac-stat__value - input(name=`attr_${attr}`, type="number", value=20) - span.ac-stat__bonus(name=`attr_${attr}_bonus`) - - .ac-stat__body - each skill in skill_array - - - const attr = skill.toLowerCase().replace(/ /g,"_"); - const roll = [ - `&{template:alteredcarbon}`, - `{{name=${skill}}}`, - `{{character_name=@{character_name}}}`, - `{{target_number=?{Target Number|5}}}`, - `{{roll=[[@{${attr}}]]}}`, - `{{bonus=[[?{Number of Bonus Dice|0}?{Bonus|none,0|d20,d20cs1cf20kl1|d12,d12cs1cf12kl1|d10,d10cs1cf10kl1|d8,d8cs1cf8kl1|d6,d6cs1cf6kl1|d4,d4cs1cf4kl1}]]}}`, - `{{luck=[[?{Luck|none,0|d20,d20cs1cf20|d12,d12cs1cf12|d10,d10cs1cf10|d8,d8cs1cf8|d6,d6cs1cf6|d4,d4cs1cf4}]]}}` - ].join(" "); - .ac-skill - button.ac-skill__name(data-i18n=skill, type="roll", value=roll)=skill - .ac-skill__value - select(name=`attr_${attr}`) - +dice-select() - .ac-body__traits - each repeating in ["Traits", "Abilities", "Specializations"] - - const attr = repeating.toLowerCase().replace(/ /g,"_"); - .ac-traits - .ac-traits__header(data-i18n=repeating)=repeating - fieldset(class=`repeating_${attr}`) - .ac-trait - .ac-trait__title - input.ac-trait__input(data-i18n-placeholder="Name", name=`attr_${attr}_name`, type="text") - .ac-trait__description - textarea(data-i18n-placeholder="Description", name=`attr_${attr}_description`) - .ac-body__misc - .ac-body__col - .ac-networks - .ac-networks__header(data-i18n="Networks/Contacts") Networks/Contacts - fieldset(class=`repeating_networks`) - .ac-networks__item - input.ac-networks__input(name="attr_network", type="text") - .ac-baggage - .ac-baggage__header(data-i18n="Baggage/Scandals") Baggage/Scandals - fieldset(class=`repeating_baggage`) - .ac-baggage__item - textarea.ac-baggage__input(name="attr_baggage", type="text") - .ac-body__col - .ac-biometrics - .ac-biometrics__header(data-i18n="Sleeve Biometrics") Sleeve Biometrics - .ac-biometrics__container - .ac-biometrics__row - .ac-biometrics__label(data-i18n="Tech Points") Tech Points - .ac-biometrics__input--minmax - input.ac-minmax(name="attr_techpoints", type="number") - | / - input.ac-minmax(name="attr_techpoints_max", type="number") - .ac-biometrics__row - .ac-biometrics__label(data-i18n="Damage Threshold") Damage Threshold - .ac-biometrics__input - input.ac-minmax(name="attr_damagethreshold", type="text") - .ac-biometrics__row--textarea - .ac-biometrics__label(data-i18n="Special") Special - .ac-biometrics__input - textarea(name="attr_special") - .ac-health - .ac-health__row - .ac-health__label(data-i18n="Health Points") Health Points - .ac-health__input--minmax - input.ac-minmax(name="attr_hitpoints", type="number") - | / - input.ac-minmax(name="attr_hitpoints_max", type="number") - .ac-health__injuries - .ac-health__label(data-i18n="Injuries") Injuries - fieldset(class=`repeating_injuries`) - .ac-networks__item - input.ac-networks__input(name="attr_injuries", type="text") - .ac-equipment - .ac-equipment__credits - .ac-credits - .ac-credits__title(data-i18n="Credits") - each level in [1, 2, 3, 4, 5] - .ac-credits__item - .ac-credits__label(data-i18n=`Lv.${level}`) Lv.#{level} - input.ac-credits__input(name=`attr_credits_${level}`, type="text") - - .ac-equipment__equipment - .ac-equipment__header(data-i18n="Equipment") Equipment - fieldset(class=`repeating_equipment`) - .ac-item - .ac-item__row--name - .ac-item__label--name(data-i18n="Name") Name - input(name="attr_equipment_name", type="text") - .ac-item__price - .ac-item__label(data-i18n="Price Level") Price Level - input(name="attr_equipment_price", type="text") - .ac-item__row--skillchecks - .ac-item__label(data-i18n="Skill Check(s)") Skill Check(s) - span.ac-item__wrap { - input.ac-item__input--wrap(name="attr_equipment_checks", type="text") - span.ac-item__wrap } - .ac-item__bonus - .ac-item__label--small + - input(name="attr_equipment_bonusdice", type="text") - .ac-item__label--small × - .ac-item__label--small(data-i18n="Bonus Dice") Bonus Dice - .ac-item__row--checks - .ac-item__label(data-i18n="Tech Point Chassis") Tech Point Chassis - .ac-item__checkmarks - each index in [1,2,3,4,5,6,7,8,9,10] - label.ac-checkmark - input(name="attr_equipment_tp_chassis", type="radio", value=index) - span - .ac-item__row--checks - .ac-item__label(data-i18n="Tech Points Used") Tech Points Used - .ac-item__checkmarks - each index in [1,2,3,4,5,6,7,8,9,10] - label.ac-checkmark--red - input(name="attr_equipment_tp_used", type="radio", value=index) - span - .ac-item__row--special - .ac-item__special - .ac-item__label(data-i18n="Special") Special - textarea.ac-item__textarea(name="attr_equipment_special") - .ac-item__row - .ac-item__triggered - .ac-item__label(data-i18n="Triggered Effects") Triggered Effects - each index in [1,2,3,4,5] - .ac-item__checkmarks - each ch_index in [1,2,3,4,5] - label.ac-checkmark--cyan - input(name=`attr_equipment_triggered_${index}`, type="radio", value=ch_index) - span - .ac-item__input - input(name=`attr_equipment_triggered_${index}_desc`, type="text") - - .ac-equipment__tools - .ac-equipment__header(data-i18n="Tools") Tools - fieldset(class=`repeating_tools`) - .ac-tool - .ac-tool__row--name - .ac-tool__label--name(data-i18n="Name") Name - input(name="attr_equipment_name", type="text") - .ac-tool__price - .ac-tool__label(data-i18n="Price Level") Price Level - input(name="attr_equipment_price", type="text") - .ac-tool__row--skillchecks - .ac-tool__label(data-i18n="Skill Check(s)") Skill Check(s) - span.ac-tool__wrap { - input.ac-tool__input--wrap(name="attr_equipment_checks", type="text") - span.ac-tool__wrap } - .ac-tool__bonus - .ac-tool__label--small + - input(name="attr_equipment_bonusdice", type="text") - .ac-tool__label--small × - .ac-tool__label--small(data-i18n="Bonus Dice") Bonus Dice - .ac-tool__row--skillchecks - .ac-tool__label(data-i18n="Skill Check(s)") Skill Check(s) - span.ac-tool__wrap { - input.ac-tool__input--wrap(name="attr_equipment_checks", type="text") - span.ac-tool__wrap } - .ac-tool__bonus - .ac-tool__label--small + - input(name="attr_equipment_bonusdice", type="text") - .ac-tool__label--small × - .ac-tool__label--small(data-i18n="Bonus Dice") Bonus Dice - .ac-tool__row--checks - .ac-tool__label(data-i18n="Tech Point Chassis") Tech Point Chassis - .ac-tool__checkmarks - each index in [1,2,3,4,5] - label.ac-checkmark - input(name="attr_equipment_tp_chassis", type="radio", value=index) - span - .ac-tool__row--checks - .ac-tool__label(data-i18n="Tech Points Used") Tech Points Used - .ac-tool__checkmarks - each index in [1,2,3,4,5] - label.ac-checkmark--red - input(name="attr_equipment_tp_used", type="radio", value=index) - span - .ac-tool__row--special - .ac-tool__special - .ac-tool__label(data-i18n="Special") Special - textarea.ac-tool__textarea(name="attr_tool_special") - -include rolltemplates.pug - -script(type="text/worker") - +include mixins.pug + +.ac-wrapper + h1(data-i18n="DHF Protectorate Citizenship Record") DHF Protectorate Citizenship Record + .ac-header + .ac-header__grid + each entry in ["Character Name", "Planet of Origin", "Age", "Sleeve Type", "Archetype", "Campaign"] + - + const attr = entry.toLowerCase().replace(/ /g,"_"); + .ac-header__item + .ac-header__label(data-i18n=entry)=entry + input.ac-header__input(name=`attr_${attr}`, type="text") + each entry in ["Stackpoints", "Influence Points", "Ego Points", "Wealth Level"] + - const attr = entry.toLowerCase().replace(/ /g,"_"); + .ac-header__item--subitem + .ac-header__label(data-i18n=entry)=entry + input.ac-header__input(name=`attr_${attr}`, type="text") + .ac-nav + each link in ["Character Sheet", "Equipment"] + label.ac-nav__item + input.ac-nav__hide(type="radio", name="attr_nav", value=link) + .ac-nav__label(data-i18n=link)=link + + input.ac-nav__hide(type="hidden", name="attr_nav") + .ac-body + .ac-body__stats + each entry in [{"Strength":["Athletics", "Brawl", "Endurance", "Melee Combat", "Toughness"]},{"Perception":["Detection", "D. Energy Wpns", "Firearms", "Search", "Stealth", "Throw"]},{"Empathy":["Diplomacy", "Expression", "Read Person"]}, {"Willpower":["Composure", "Discipline", "Intimidation"]}, {"Acuity":["Data Analysis", "Data Engineering", "Digi. Networking", "Investigation", "Mechanics", "Navigation", "Pilot", "Survival"]}, {"Intelligence":["Bureaucracy", "Cultures", "Engineering", "Geography", "History", "Science", "Medicine"]}] + - + const block_title = Object.keys(entry)[0]; + const skill_array = Object.values(entry)[0]; + const attr = block_title.toLowerCase().replace(/ /g,"_"); + .ac-stat + .ac-stat__header + .ac-stat__title(data-i18n=block_title)=block_title + .ac-stat__value + input(name=`attr_${attr}`, type="number", value=20) + span.ac-stat__bonus(name=`attr_${attr}_bonus`) - + .ac-stat__body + each skill in skill_array + - + const attr = skill.toLowerCase().replace(/ /g,"_"); + const roll = [ + `&{template:alteredcarbon}`, + `{{name=${skill}}}`, + `{{character_name=@{character_name}}}`, + `{{target_number=?{Target Number|5}}}`, + `{{roll=[[@{${attr}}]]}}`, + `{{bonus=[[?{Number of Bonus Dice|0}?{Bonus|none,0|d20,d20cs1cf20kl1|d12,d12cs1cf12kl1|d10,d10cs1cf10kl1|d8,d8cs1cf8kl1|d6,d6cs1cf6kl1|d4,d4cs1cf4kl1}]]}}`, + `{{luck=[[?{Luck|none,0|d20,d20cs1cf20|d12,d12cs1cf12|d10,d10cs1cf10|d8,d8cs1cf8|d6,d6cs1cf6|d4,d4cs1cf4}]]}}` + ].join(" "); + .ac-skill + button.ac-skill__name(data-i18n=skill, type="roll", value=roll)=skill + .ac-skill__value + select(name=`attr_${attr}`) + +dice-select() + .ac-body__traits + each repeating in ["Traits", "Abilities", "Specializations"] + - const attr = repeating.toLowerCase().replace(/ /g,"_"); + .ac-traits + .ac-traits__header(data-i18n=repeating)=repeating + fieldset(class=`repeating_${attr}`) + .ac-trait + .ac-trait__title + input.ac-trait__input(data-i18n-placeholder="Name", name=`attr_${attr}_name`, type="text") + .ac-trait__description + textarea(data-i18n-placeholder="Description", name=`attr_${attr}_description`) + .ac-body__misc + .ac-body__col + .ac-networks + .ac-networks__header(data-i18n="Networks/Contacts") Networks/Contacts + fieldset(class=`repeating_networks`) + .ac-networks__item + input.ac-networks__input(name="attr_network", type="text") + .ac-baggage + .ac-baggage__header(data-i18n="Baggage/Scandals") Baggage/Scandals + fieldset(class=`repeating_baggage`) + .ac-baggage__item + textarea.ac-baggage__input(name="attr_baggage", type="text") + .ac-body__col + .ac-biometrics + .ac-biometrics__header(data-i18n="Sleeve Biometrics") Sleeve Biometrics + .ac-biometrics__container + .ac-biometrics__row + .ac-biometrics__label(data-i18n="Tech Points") Tech Points + .ac-biometrics__input--minmax + input.ac-minmax(name="attr_techpoints", type="number") + | / + input.ac-minmax(name="attr_techpoints_max", type="number") + .ac-biometrics__row + .ac-biometrics__label(data-i18n="Damage Threshold") Damage Threshold + .ac-biometrics__input + input.ac-minmax(name="attr_damagethreshold", type="text") + .ac-biometrics__row--textarea + .ac-biometrics__label(data-i18n="Special") Special + .ac-biometrics__input + textarea(name="attr_special") + .ac-health + .ac-health__row + .ac-health__label(data-i18n="Health Points") Health Points + .ac-health__input--minmax + input.ac-minmax(name="attr_hitpoints", type="number") + | / + input.ac-minmax(name="attr_hitpoints_max", type="number") + .ac-health__injuries + .ac-health__label(data-i18n="Injuries") Injuries + fieldset(class=`repeating_injuries`) + .ac-networks__item + input.ac-networks__input(name="attr_injuries", type="text") + .ac-equipment + .ac-equipment__credits + .ac-credits + .ac-credits__title(data-i18n="Credits") + each level in [1, 2, 3, 4, 5] + .ac-credits__item + .ac-credits__label(data-i18n=`Lv.${level}`) Lv.#{level} + input.ac-credits__input(name=`attr_credits_${level}`, type="text") + + .ac-equipment__equipment + .ac-equipment__header(data-i18n="Equipment") Equipment + fieldset(class=`repeating_equipment`) + .ac-item + .ac-item__row--name + .ac-item__label--name(data-i18n="Name") Name + input(name="attr_equipment_name", type="text") + .ac-item__price + .ac-item__label(data-i18n="Price Level") Price Level + input(name="attr_equipment_price", type="text") + .ac-item__row--skillchecks + .ac-item__label(data-i18n="Skill Check(s)") Skill Check(s) + span.ac-item__wrap { + input.ac-item__input--wrap(name="attr_equipment_checks", type="text") + span.ac-item__wrap } + .ac-item__bonus + .ac-item__label--small + + input(name="attr_equipment_bonusdice", type="text") + .ac-item__label--small × + .ac-item__label--small(data-i18n="Bonus Dice") Bonus Dice + .ac-item__row--checks + .ac-item__label(data-i18n="Tech Point Chassis") Tech Point Chassis + .ac-item__checkmarks + each index in [1,2,3,4,5,6,7,8,9,10] + label.ac-checkmark + input(name="attr_equipment_tp_chassis", type="radio", value=index) + span + .ac-item__row--checks + .ac-item__label(data-i18n="Tech Points Used") Tech Points Used + .ac-item__checkmarks + each index in [1,2,3,4,5,6,7,8,9,10] + label.ac-checkmark--red + input(name="attr_equipment_tp_used", type="radio", value=index) + span + .ac-item__row--special + .ac-item__special + .ac-item__label(data-i18n="Special") Special + textarea.ac-item__textarea(name="attr_equipment_special") + .ac-item__row + .ac-item__triggered + .ac-item__label(data-i18n="Triggered Effects") Triggered Effects + each index in [1,2,3,4,5] + .ac-item__checkmarks + each ch_index in [1,2,3,4,5] + label.ac-checkmark--cyan + input(name=`attr_equipment_triggered_${index}`, type="radio", value=ch_index) + span + .ac-item__input + input(name=`attr_equipment_triggered_${index}_desc`, type="text") + + .ac-equipment__tools + .ac-equipment__header(data-i18n="Tools") Tools + fieldset(class=`repeating_tools`) + .ac-tool + .ac-tool__row--name + .ac-tool__label--name(data-i18n="Name") Name + input(name="attr_equipment_name", type="text") + .ac-tool__price + .ac-tool__label(data-i18n="Price Level") Price Level + input(name="attr_equipment_price", type="text") + .ac-tool__row--skillchecks + .ac-tool__label(data-i18n="Skill Check(s)") Skill Check(s) + span.ac-tool__wrap { + input.ac-tool__input--wrap(name="attr_equipment_checks", type="text") + span.ac-tool__wrap } + .ac-tool__bonus + .ac-tool__label--small + + input(name="attr_equipment_bonusdice", type="text") + .ac-tool__label--small × + .ac-tool__label--small(data-i18n="Bonus Dice") Bonus Dice + .ac-tool__row--skillchecks + .ac-tool__label(data-i18n="Skill Check(s)") Skill Check(s) + span.ac-tool__wrap { + input.ac-tool__input--wrap(name="attr_equipment_checks", type="text") + span.ac-tool__wrap } + .ac-tool__bonus + .ac-tool__label--small + + input(name="attr_equipment_bonusdice", type="text") + .ac-tool__label--small × + .ac-tool__label--small(data-i18n="Bonus Dice") Bonus Dice + .ac-tool__row--checks + .ac-tool__label(data-i18n="Tech Point Chassis") Tech Point Chassis + .ac-tool__checkmarks + each index in [1,2,3,4,5] + label.ac-checkmark + input(name="attr_equipment_tp_chassis", type="radio", value=index) + span + .ac-tool__row--checks + .ac-tool__label(data-i18n="Tech Points Used") Tech Points Used + .ac-tool__checkmarks + each index in [1,2,3,4,5] + label.ac-checkmark--red + input(name="attr_equipment_tp_used", type="radio", value=index) + span + .ac-tool__row--special + .ac-tool__special + .ac-tool__label(data-i18n="Special") Special + textarea.ac-tool__textarea(name="attr_tool_special") + +include rolltemplates.pug + +script(type="text/worker") + include ../js/sheetworker.js \ No newline at end of file diff --git a/Altered Carbon Official/src/pug/mixins.pug b/Altered Carbon Official/src/pug/mixins.pug index 266e43613c..4bf5a83cde 100644 --- a/Altered Carbon Official/src/pug/mixins.pug +++ b/Altered Carbon Official/src/pug/mixins.pug @@ -1,4 +1,4 @@ -mixin dice-select(selected) - - const dice = ["20", "12", "10", "8", "6", "4"]; - each die in dice +mixin dice-select(selected) + - const dice = ["20", "12", "10", "8", "6", "4"]; + each die in dice option(value=`d${die}cs1cf${die}` selected=(die == selected)) d#{die} \ No newline at end of file diff --git a/Altered Carbon Official/src/pug/rolltemplates.pug b/Altered Carbon Official/src/pug/rolltemplates.pug index ae654f604e..e118baaf98 100644 --- a/Altered Carbon Official/src/pug/rolltemplates.pug +++ b/Altered Carbon Official/src/pug/rolltemplates.pug @@ -1,56 +1,56 @@ - -rolltemplate.sheet-rolltemplate-alteredcarbon - .ac-roll-container - | {{#name}} - h1 {{name}} - | {{/name}} - .ac-roll-body - | {{#character_name}} - h2 {{character_name}} - | {{/character_name}} - | {{#target_number}} - .ac-roll-target - span.ac-roll-target-label(data-i18n="Target") - span.ac-roll-target-value {{target_number}} - | {{/target_number}} - .ac-roll-result - | {{#roll}} - .ac-roll-result-roll - strong(data-i18n="Roll") - div {{roll}} - | {{/roll}} - | {{#rollGreater() luck 0}} - .ac-roll-result-luck - strong(data-i18n="Luck") - div {{luck}} - | {{/rollGreater() luck 0}} - | {{#rollGreater() bonus 0}} - .ac-roll-result-bonus - strong(data-i18n="Bonus") - div {{bonus}} - | {{/rollGreater() bonus 0}} - - .ac-roll-tag - | {{#rollWasCrit() roll}} - | {{#^rollWasCrit() luck}} - .ac-roll-ace(data-i18n="Ace") - | {{/^rollWasCrit() luck}} - | {{/rollWasCrit() roll}} - - | {{#^rollWasCrit() roll}} - | {{#rollWasCrit() bonus}} - .ac-roll-ace(data-i18n="Ace") - | {{/rollWasCrit() bonus}} - | {{/^rollWasCrit() roll}} - - | {{#rollWasCrit() roll}} - | {{#rollWasCrit() luck}} - .ac-roll-stroke(data-i18n="Stroke of Luck") - | {{/rollWasCrit() luck}} - | {{/rollWasCrit() roll}} - - | {{#rollWasFumble() roll}} - | {{#rollWasFumble() luck}} - .ac-roll-catastrophe(data-i18n="Catastrophe") - | {{/rollWasFumble() luck}} + +rolltemplate.sheet-rolltemplate-alteredcarbon + .ac-roll-container + | {{#name}} + h1 {{name}} + | {{/name}} + .ac-roll-body + | {{#character_name}} + h2 {{character_name}} + | {{/character_name}} + | {{#target_number}} + .ac-roll-target + span.ac-roll-target-label(data-i18n="Target") + span.ac-roll-target-value {{target_number}} + | {{/target_number}} + .ac-roll-result + | {{#roll}} + .ac-roll-result-roll + strong(data-i18n="Roll") + div {{roll}} + | {{/roll}} + | {{#rollGreater() luck 0}} + .ac-roll-result-luck + strong(data-i18n="Luck") + div {{luck}} + | {{/rollGreater() luck 0}} + | {{#rollGreater() bonus 0}} + .ac-roll-result-bonus + strong(data-i18n="Bonus") + div {{bonus}} + | {{/rollGreater() bonus 0}} + + .ac-roll-tag + | {{#rollWasCrit() roll}} + | {{#^rollWasCrit() luck}} + .ac-roll-ace(data-i18n="Ace") + | {{/^rollWasCrit() luck}} + | {{/rollWasCrit() roll}} + + | {{#^rollWasCrit() roll}} + | {{#rollWasCrit() bonus}} + .ac-roll-ace(data-i18n="Ace") + | {{/rollWasCrit() bonus}} + | {{/^rollWasCrit() roll}} + + | {{#rollWasCrit() roll}} + | {{#rollWasCrit() luck}} + .ac-roll-stroke(data-i18n="Stroke of Luck") + | {{/rollWasCrit() luck}} + | {{/rollWasCrit() roll}} + + | {{#rollWasFumble() roll}} + | {{#rollWasFumble() luck}} + .ac-roll-catastrophe(data-i18n="Catastrophe") + | {{/rollWasFumble() luck}} | {{/rollWasFumble() roll}} \ No newline at end of file diff --git a/Altered Carbon Official/src/scss/altered-carbon.scss b/Altered Carbon Official/src/scss/altered-carbon.scss index 7a65d1affa..6937eeb5da 100644 --- a/Altered Carbon Official/src/scss/altered-carbon.scss +++ b/Altered Carbon Official/src/scss/altered-carbon.scss @@ -1,1211 +1,1211 @@ -@import url("https://fonts.googleapis.com/css?family=Montserrat:200|Montserrat:400|Montserrat:600|Montserrat:700|Montserrat:800|Montserrat:900&display=swap"); - -$foreground: black; -$background: white; - -$invert-foreground: white; -$invert-input-background: rgba(0, 0, 40, .25); -$invert-background: rgb(4, 41, 56); - -$invert-background-gradient: linear-gradient(164deg, rgb(4, 41, 56) 0%, rgb(3, 31, 39) 100%); - -$cyan-sheet: #00a99d; -$cyan: #38e0d5; -$red: #d2232a; -$yellow: #bd9c55; -$grey: #aaa; -$light-grey: #eee; - -.sheet-ac-wrapper { - background: $background; - color: $foreground; - - font-family: Montserrat, sans-serif; - font-size: 10pt; - - * { - box-sizing: border-box; - } - - input { - height: 1.75em; - } - - input[type="number"] { - -moz-appearance: textfield; - - text-align: center; - - &::-webkit-outer-spin-button, - &::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; - } - } - - input[type="number"], - input[type="text"], - textarea, - select { - min-width: 0; - width: 100%; - - border-radius: 0; - - background-color: transparent; - color: $foreground; - - font-family: "Montserrat", Verdana, sans-serif; - font-size: 10pt; - font-variant: normal; - - &:hover { - border: 1px solid $cyan; - box-shadow: 0 0 5px $cyan; - } - } - - button { - &:hover { - border: 1px solid $cyan; - box-shadow: 0 0 5px $cyan; - } - } - - select { - -webkit-appearance: none; - -moz-appearance: none; - - height: 1.75em; - - cursor: pointer; - - background: transparent url("https://s3.amazonaws.com/files.d20.io/images/138210258/mZTqw1vke8SrkprMJmiZQw/med.png?1590443723") right 5px center no-repeat; - } - - textarea { - resize: vertical; - width: 100%; - margin: 0; - padding: 0; - - border: 0; - border-radius: 0; - } - - label { - padding: 0; - margin: 0; - } - - .itemcontrol { - position: relative; - - button.repcontrol_del, - a.repcontrol_move { - display: block; - top: calc(50% - 1.5rem); - position: relative; - border: 1px solid $foreground; - border-radius: 0; - padding: 0; - margin: 0; - height: 3rem; - width: 3rem; - box-shadow: none; - - line-height: 2em; - text-shadow: none; - - font-weight: bold; - - &:hover { - border: 1px solid $cyan; - box-shadow: 0 0 5px $cyan; - } - } - - button.repcontrol_del { - margin-right: .25rem; - - background: transparent; - border: 1px solid $red; - color: $red; - - &:hover { - border: 1px solid $red; - box-shadow: 0 0 5px $red; - } - } - - a.repcontrol_move { - margin-left: .25rem; - - background: transparent; - color: $foreground; - - &:hover { - border: 1px solid $cyan; - box-shadow: 0 0 5px $cyan; - } - } - - } - - .repcontrol { - padding: .25em; - - background-color: transparent; - - button.repcontrol_add, - button.repcontrol_del, - button.repcontrol_move, - button.repcontrol_edit { - display: block; - border: 1px solid $foreground; - border-radius: 0; - background: none; - padding: 0; - margin: 0; - height: 3rem; - width: 3rem; - box-shadow: none; - - font-size: 0; - line-height: 1em; - text-shadow: none; - - &:hover { - border: 1px solid $cyan; - box-shadow: 0 0 5px $cyan; - } - } - - button.repcontrol_add:before { - display: block; - content: "&"; - - font-family: "Pictos"; - font-size: 12pt; - font-weight: bold; - } - - button.repcontrol_edit { - &:before { - display: block; - content: "p"; - right: 5px; - - font-family: "Pictos"; - font-size: 12pt; - font-weight: bold; - } - } - } - - h1 { - font-size: 16pt; - font-weight: 700; - letter-spacing: 2px; - text-align: center; - text-transform: uppercase; - } - -} - -%label { - font-weight: 400; - text-transform: uppercase; -} - -%input { - &[type="number"], - &[type="text"] { - margin: 0; - padding: 0; - - border: 0; - } -} - -.sheet-ac { - - &-header { - padding: 1em; - - background: $invert-background-gradient; - background-color: $invert-background; - color: $invert-foreground; - - &__grid { - display: grid; - grid-template-columns: repeat(4, 1fr); - gap: 0 1em; - } - - &__item { - grid-column: span 2; - - &--subitem { - @extend .sheet-ac-header__item; - grid-column: span 1; - } - - } - - &__label { - @extend %label; - font-family: 12pt; - } - - &__input { - @extend %input; - - &[type="number"], - &[type="text"] { - border: 1px solid transparent; - border-bottom: 1px solid $invert-foreground; - color: $invert-foreground !important; - - font-size: 12pt !important; - font-weight: 800 !important; - text-transform: uppercase; - } - } - - - } - - &-nav { - display: flex; - flex-direction: row; - justify-content: flex-end; - - > label { - margin: 5px; - } - - &__item { - width: auto; - padding: 5px; - - cursor: pointer; - - font-size: 11pt; - font-weight: 600; - text-transform: uppercase; - } - - &__label { - padding: 0 5px; - - border-radius: 3px; - border: 1px solid $foreground; - - &:hover { - border: 1px solid $cyan; - box-shadow: 0 0 5px $cyan; - } - } - - &__hide { - display: none; - } - - input[type=radio]:checked + .sheet-ac-nav__label { - border: 1px solid $cyan-sheet; - background: rgba($cyan-sheet, 15%); - color: $cyan-sheet; - } - } - - &-body { - - &__stats { - display: grid; - grid-template-columns: 1fr 1fr; - grid-gap: 1em; - } - - &__traits { - display: grid; - grid-template-columns: 1fr 1fr 1fr; - margin: 1em 0; - padding: 1em 1em; - - background-color: $invert-background; - background: $invert-background-gradient; - color: $invert-foreground; - - .itemcontrol { - - button.repcontrol_del, - a.repcontrol_move { - border: 1px solid $invert-foreground; - - color: $invert-foreground - } - - a.repcontrol_move { - color: $invert-foreground; - } - - } - - .repcontrol { - margin-bottom: 1em; - - button.repcontrol_add, - button.repcontrol_del, - button.repcontrol_move, - button.repcontrol_edit { - border: 1px solid $invert-foreground; - color: $invert-foreground; - } - } - } - - &__misc { - display: grid; - grid-template-columns: 1fr 1fr; - grid-gap: 1em; - } - - } - - &-stat { - - &__header { - display: grid; - grid-template-columns: 1fr 5em; - align-items: center; - padding: .125em .5em; - - background: $yellow; - color: $background; - - font-size: 12pt; - font-weight: 800; - text-transform: uppercase; - - input { - @extend %input; - } - } - - &__title { - letter-spacing: 2px; - } - - &__value { - display: grid; - grid-template-columns: 1fr .75fr; - align-items: center; - - color: $background; - - input { - @extend %input; - - &[type="text"], - &[type="number"] { - background: rgba($foreground, .125); - color: $background; - - font-size: 14pt; - font-weight: 800; - } - } - - span { - text-align: center; - font-weight: 600; - } - } - - &__bonus { - font-size: 12pt; - - &:before, - &:after { - display: inline; - } - - &:before { - content: "("; - } - - &:after { - content: ")"; - } - } - - &__body { - display: grid; - grid-template-columns: 1fr 1fr; - gap: .25em 0; - } - - } - - &-skill { - - display: grid; - grid-template-columns: 1fr 3.5em; - gap: 0; - align-items: center; - - &__name[type="roll"] { - display: flex; - flex-grow: 0; - align-items: center; - border: 0; - background: none; - - font-size: 9pt !important; - font-weight: 600; - text-align: left; - text-transform: uppercase; - - &:before { - display: none; - } - - &:after { - display: block; - flex-grow: 1; - content: ""; - height: 0; - margin: 0; - margin-left: 4px; - - border-bottom: 3px solid $yellow; - } - - &:hover { - color: $cyan; - box-shadow: none !important; - border: 0 !important; - - &:after { - border-color: $cyan; - } - } - } - - &__value { - margin: 0; - padding: 0; - - select { - margin: 0 !important; - padding: 0; - - border: 0; - - font-size: 10pt; - line-height: 10pt; - } - } - - } - - &-traits { - border-right: 1px solid rgba($invert-foreground, .25); - padding: 1em; - - &:last-child { - border-right: 0; - } - - &__header { - padding: .5em; - margin-bottom: .5em; - - font-weight: 800; - text-align: center; - text-transform: uppercase; - } - - } - - &-trait { - margin-bottom: 1em; - - border: 1px solid rgba($cyan-sheet, .5); - - &__title { - display: flex; - align-items: center; - flex-flow: row nowrap; - margin-bottom: 0; - padding: 0; - - border: 1px solid transparent; - - > div { - flex-shrink: 0; - margin-right: 5px; - } - - > input { - flex-grow: 1; - height: 2.5em; - - background: $invert-input-background !important; - border: 1px solid transparent; - border-bottom: 1px solid rgba($cyan-sheet, .5); - border-radius: 0; - color: $cyan !important; - - font-size: 9pt !important; - font-weight: 600 !important; - } - } - - &__label { - @extend %label; - } - - &__description { - padding: 0; - - textarea { - width: 100%; - height: 7.5em; - padding: .25em; - margin: 0; - - border: 1px solid transparent; - border-radius: none; - background: $invert-input-background; - color: $invert-foreground; - - font-size: 9pt; - } - } - - } - - &-networks, - &-baggage { - - &__header { - color: $red; - - font-size: 14pt; - font-weight: 800; - text-transform: uppercase; - } - - &__item { - display: flex; - align-items: center; - flex-flow: row nowrap; - margin-bottom: .5em; - - border: 0; - border-bottom: 1px solid $grey; - - &:before { - display: inline-block; - flex-shrink: 0; - content: "4"; - margin-right: .25em; - - color: $cyan-sheet; - - font-family: "Pictos"; - } - - > input { - flex-grow: 1; - border: 0; - - font-size: 10pt !important; - } - } - - } - - &-baggage { - textarea { - height: 4.5em; - } - - &__item { - align-items: flex-start !important; - - &:before { - margin-top: .1em; - } - } - - } - - &-biometrics { - - &__header { - color: $red; - - font-size: 14pt; - font-weight: 800; - text-transform: uppercase; - } - - &__container { - border: 1px solid $yellow; - padding: .5em; - } - - &__row { - display: flex; - flex-flow: row nowrap; - align-items: center; - - &--textarea { - margin-top: .5em; - - textarea { - background: $light-grey; - } - } - } - - &__label { - flex-shrink: 0; - - font-size: 10pt; - font-weight: 600; - text-transform: uppercase; - - &:after { - display: inline; - content: ":"; - margin-right: .5em; - } - } - - &__input { - flex-grow: 1; - - font-size: 10pt; - font-weight: 600; - - input[type="number"], - input[type="text"] { - border: 0; - border-bottom: 1px solid $grey; - } - - &--minmax { - @extend .sheet-ac-biometrics__input; - flex-grow: 0; - - display: grid; - grid-template-columns: 1fr .5em 1fr; - align-items: center; - width: 50%; - - } - } - - textarea { - height: 7.5em; - } - - } - - &-health { - margin-top: 2em; - - &__label { - flex-shrink: 0; - - font-size: 10pt; - font-weight: 600; - text-transform: uppercase; - - &:after { - display: inline; - content: ":"; - margin-right: .5em; - } - } - - &__input { - flex-grow: 1; - - font-size: 10pt; - font-weight: 600; - - input[type="number"], - input[type="text"] { - border: 0; - border-bottom: 1px solid $grey; - } - - &--minmax { - @extend .sheet-ac-biometrics__input; - flex-grow: 0; - display: grid; - grid-template-columns: 1fr .5em 1fr; - align-items: center; - width: 30%; - } - } - - &__row { - display: flex; - flex-flow: row nowrap; - align-items: center; - - margin-bottom: .5em; - - &--textarea { - - textarea { - background: $light-grey; - } - } - } - - } - - &-equipment { - display: grid; - grid-template-columns: 1fr 1fr; - align-items: stretch; - gap: 1em 0; - - > * { - padding: 0.75em; - } - - &__credits { - grid-column: 1 / -1; - } - - &__header { - color: $red; - - font-size: 14pt; - font-weight: 800; - text-align: center; - text-transform: uppercase; - } - - &__tools { - border-left: 1px dashed $grey; - } - } - - &-credits { - - display: grid; - grid-template-columns: repeat(6, 1fr); - gap: 1.5em; - align-items: center; - - &__title { - color: $red; - - font-size: 14pt; - font-weight: 800; - text-transform: uppercase; - } - - &__item { - display: flex; - border: 1px solid $cyan-sheet; - border-left: 3px solid $cyan-sheet; - border-right: 3px solid $cyan-sheet; - - font-size: 10pt; - font-weight: 600; - - input { - border: 0; - - text-align: center; - } - } - - &__label { - padding: .125em; - } - - &__input { - margin-left: .5em; - } - - } - - &-tool, - &-item { - margin-bottom: 1.5em; - padding: .75em; - - border: 2px solid $cyan-sheet; - - input { - flex-shrink: 1; - - border: 0; - width: 100%; - } - - &__row { - display: flex; - flex-flow: row nowrap; - align-items: center; - margin-bottom: 1em; - - input { - flex-grow: 1; - border-bottom: 1px solid $grey; - } - - &--name, - &--skillchecks { - @extend .sheet-ac-item__row; - } - - &--bonus { - display: grid; - grid-template-columns: 1fr 1fr; - margin-bottom: 1em; - } - - &--checks { - display: grid; - grid-template-columns: 1fr 1.5fr; - margin-bottom: 1em; - } - - &--special { - display: grid; - } - } - - &__label { - flex-shrink: 0; - - font-size: 9pt; - font-weight: 800; - - &:after { - display: inline; - content: ":"; - - margin-right: .5em; - } - - &--name { - @extend .sheet-ac-item__label; - color: $red; - - font-size: 14pt; - font-weight: 800; - text-transform: uppercase; - } - - &--small { - flex-basis: 1.5em; - - font-weight: 400; - } - } - - &__bonus { - grid-column: span 2; - display: flex; - flex-flow: row nowrap; - align-items: center; - - } - - &__checkmarks { - display: grid; - grid-template-columns: repeat(10, 1fr); - - label { - cursor: pointer; - - span { - display: block; - height: 1em; - width: 1em; - border-radius: 50%; - - background-color: rgba($cyan-sheet, .125); - border: 1px solid $cyan; - } - - input[type="radio"] { - display: none; - - &:checked { - - & + span { - background-color: $cyan-sheet; - } - } - } - - &.sheet-ac-checkmark--red { - span { - background-color: rgba($red, .125); - border: 1px solid $red; - } - - input[type="radio"] { - display: none; - - &:checked { - & + span { - background-color: $red; - } - } - } - } - } - } - - &__price { - display: flex; - flex-flow: row nowrap; - align-items: center; - margin: .25em; - padding: .25em; - - border: 1px solid $yellow; - - .sheet-ac-tool__label, - .sheet-ac-item__label { - font-size: 8pt; - font-weight: 400; - } - - input[type=text] { - width: 4em; - } - } - - &__special { - - textarea { - border: 1px solid $grey; - - height: 5em; - } - - } - - &__triggered { - display: grid; - grid-template-columns: 1fr 2fr; - align-items: center; - gap: .5em; - width: 100%; - - .sheet-ac-item__checkmarks { - grid-template-columns: repeat(5, 1fr); - } - } - - &__special, - &__triggered { - - .sheet-ac-tool__label, - .sheet-ac-item__label { - grid-column: 1 / -1; - - color: $cyan-sheet; - - font-size: 10pt; - } - - } - - &__wrap { - font-size: 14pt; - font-weight: 600; - } - } -} - -.sheet-ac-body { - display: none; -} - -.sheet-ac-equipment { - display: none; -} - -input[name="attr_nav"][value="Character Sheet"] ~ .sheet-ac-body { - display: block; -} - -input[name="attr_nav"][value="Equipment"] ~ .sheet-ac-equipment { - display: grid; -} - -.sheet-rolltemplate-alteredcarbon { - background: $background; - padding: .5em; - - h1 { - margin-bottom: .25em; - - color: $cyan-sheet; - - font-size: 14pt; - letter-spacing: 2px; - line-height: 14pt; - text-align: center; - text-transform: uppercase; - } - - h2 { - margin-bottom: .25em; - - color: $red; - - font-size: 10pt; - font-weight: 600; - line-height: 10pt; - text-align: center; - } - - .sheet-ac-roll-container { - padding: .5em; - - border: 2px solid $cyan; - color: $foreground; - } - - .sheet-ac-roll-target { - margin: .5em 0; - padding: .5em; - - text-align: center; - - background: $invert-background; - color: $invert-foreground; - - .sheet-ac-roll-target-label { - font-size: 12pt; - font-weight: 600; - letter-spacing: 2px; - text-transform: uppercase; - - &:after { - display: inline; - content: ":"; - margin-right: .75em; - } - } - - .sheet-ac-roll-target-value { - color: $cyan; - - font-size: 12pt; - font-weight: 800; - } - - - } - - .sheet-ac-roll-result { - - display: flex; - justify-content: space-around; - - &-roll, - &-luck, - &-bonus { - * { - text-align: center; - } - - strong { - display: block; - - font-size: 9pt; - font-weight: 400; - text-transform: uppercase; - } - - div { - width: 1em; - height: 1em; - margin: auto; - padding: .25em; - border: 1px solid $grey; - font-size: 16pt; - } - } - - .importantroll, - .fullcrit, - .fullfail, - .inlinerollresult { - border: none; - background: transparent; - - font-family: inherit; - line-height: 1em; - } - - .fullcrit { - color: $cyan-sheet; - } - - .fullfail { - color: $red; - } - } - - .sheet-ac-roll-tag { - margin-top: .5em; - - .sheet-ac-roll-ace { - padding: 5px; - - border: 1px solid $cyan-sheet; - color: $cyan-sheet; - - font-size: 12pt; - font-weight: 800; - text-align: center; - text-transform: uppercase; - } - - .sheet-ac-roll-stroke { - padding: 5px; - - background: $cyan; - color: $background; - - font-size: 12pt; - font-weight: 800; - text-align: center; - text-transform: uppercase; - } - - .sheet-ac-roll-catastrophe { - padding: 5px; - - background: $red; - color: $background; - - font-size: 12pt; - font-weight: 800; - text-align: center; - text-transform: uppercase; - } - - } - +@import url("https://fonts.googleapis.com/css?family=Montserrat:200|Montserrat:400|Montserrat:600|Montserrat:700|Montserrat:800|Montserrat:900&display=swap"); + +$foreground: black; +$background: white; + +$invert-foreground: white; +$invert-input-background: rgba(0, 0, 40, .25); +$invert-background: rgb(4, 41, 56); + +$invert-background-gradient: linear-gradient(164deg, rgb(4, 41, 56) 0%, rgb(3, 31, 39) 100%); + +$cyan-sheet: #00a99d; +$cyan: #38e0d5; +$red: #d2232a; +$yellow: #bd9c55; +$grey: #aaa; +$light-grey: #eee; + +.sheet-ac-wrapper { + background: $background; + color: $foreground; + + font-family: Montserrat, sans-serif; + font-size: 10pt; + + * { + box-sizing: border-box; + } + + input { + height: 1.75em; + } + + input[type="number"] { + -moz-appearance: textfield; + + text-align: center; + + &::-webkit-outer-spin-button, + &::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + } + + input[type="number"], + input[type="text"], + textarea, + select { + min-width: 0; + width: 100%; + + border-radius: 0; + + background-color: transparent; + color: $foreground; + + font-family: "Montserrat", Verdana, sans-serif; + font-size: 10pt; + font-variant: normal; + + &:hover { + border: 1px solid $cyan; + box-shadow: 0 0 5px $cyan; + } + } + + button { + &:hover { + border: 1px solid $cyan; + box-shadow: 0 0 5px $cyan; + } + } + + select { + -webkit-appearance: none; + -moz-appearance: none; + + height: 1.75em; + + cursor: pointer; + + background: transparent url("https://s3.amazonaws.com/files.d20.io/images/138210258/mZTqw1vke8SrkprMJmiZQw/med.png?1590443723") right 5px center no-repeat; + } + + textarea { + resize: vertical; + width: 100%; + margin: 0; + padding: 0; + + border: 0; + border-radius: 0; + } + + label { + padding: 0; + margin: 0; + } + + .itemcontrol { + position: relative; + + button.repcontrol_del, + a.repcontrol_move { + display: block; + top: calc(50% - 1.5rem); + position: relative; + border: 1px solid $foreground; + border-radius: 0; + padding: 0; + margin: 0; + height: 3rem; + width: 3rem; + box-shadow: none; + + line-height: 2em; + text-shadow: none; + + font-weight: bold; + + &:hover { + border: 1px solid $cyan; + box-shadow: 0 0 5px $cyan; + } + } + + button.repcontrol_del { + margin-right: .25rem; + + background: transparent; + border: 1px solid $red; + color: $red; + + &:hover { + border: 1px solid $red; + box-shadow: 0 0 5px $red; + } + } + + a.repcontrol_move { + margin-left: .25rem; + + background: transparent; + color: $foreground; + + &:hover { + border: 1px solid $cyan; + box-shadow: 0 0 5px $cyan; + } + } + + } + + .repcontrol { + padding: .25em; + + background-color: transparent; + + button.repcontrol_add, + button.repcontrol_del, + button.repcontrol_move, + button.repcontrol_edit { + display: block; + border: 1px solid $foreground; + border-radius: 0; + background: none; + padding: 0; + margin: 0; + height: 3rem; + width: 3rem; + box-shadow: none; + + font-size: 0; + line-height: 1em; + text-shadow: none; + + &:hover { + border: 1px solid $cyan; + box-shadow: 0 0 5px $cyan; + } + } + + button.repcontrol_add:before { + display: block; + content: "&"; + + font-family: "Pictos"; + font-size: 12pt; + font-weight: bold; + } + + button.repcontrol_edit { + &:before { + display: block; + content: "p"; + right: 5px; + + font-family: "Pictos"; + font-size: 12pt; + font-weight: bold; + } + } + } + + h1 { + font-size: 16pt; + font-weight: 700; + letter-spacing: 2px; + text-align: center; + text-transform: uppercase; + } + +} + +%label { + font-weight: 400; + text-transform: uppercase; +} + +%input { + &[type="number"], + &[type="text"] { + margin: 0; + padding: 0; + + border: 0; + } +} + +.sheet-ac { + + &-header { + padding: 1em; + + background: $invert-background-gradient; + background-color: $invert-background; + color: $invert-foreground; + + &__grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 0 1em; + } + + &__item { + grid-column: span 2; + + &--subitem { + @extend .sheet-ac-header__item; + grid-column: span 1; + } + + } + + &__label { + @extend %label; + font-family: 12pt; + } + + &__input { + @extend %input; + + &[type="number"], + &[type="text"] { + border: 1px solid transparent; + border-bottom: 1px solid $invert-foreground; + color: $invert-foreground !important; + + font-size: 12pt !important; + font-weight: 800 !important; + text-transform: uppercase; + } + } + + + } + + &-nav { + display: flex; + flex-direction: row; + justify-content: flex-end; + + > label { + margin: 5px; + } + + &__item { + width: auto; + padding: 5px; + + cursor: pointer; + + font-size: 11pt; + font-weight: 600; + text-transform: uppercase; + } + + &__label { + padding: 0 5px; + + border-radius: 3px; + border: 1px solid $foreground; + + &:hover { + border: 1px solid $cyan; + box-shadow: 0 0 5px $cyan; + } + } + + &__hide { + display: none; + } + + input[type=radio]:checked + .sheet-ac-nav__label { + border: 1px solid $cyan-sheet; + background: rgba($cyan-sheet, 15%); + color: $cyan-sheet; + } + } + + &-body { + + &__stats { + display: grid; + grid-template-columns: 1fr 1fr; + grid-gap: 1em; + } + + &__traits { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + margin: 1em 0; + padding: 1em 1em; + + background-color: $invert-background; + background: $invert-background-gradient; + color: $invert-foreground; + + .itemcontrol { + + button.repcontrol_del, + a.repcontrol_move { + border: 1px solid $invert-foreground; + + color: $invert-foreground + } + + a.repcontrol_move { + color: $invert-foreground; + } + + } + + .repcontrol { + margin-bottom: 1em; + + button.repcontrol_add, + button.repcontrol_del, + button.repcontrol_move, + button.repcontrol_edit { + border: 1px solid $invert-foreground; + color: $invert-foreground; + } + } + } + + &__misc { + display: grid; + grid-template-columns: 1fr 1fr; + grid-gap: 1em; + } + + } + + &-stat { + + &__header { + display: grid; + grid-template-columns: 1fr 5em; + align-items: center; + padding: .125em .5em; + + background: $yellow; + color: $background; + + font-size: 12pt; + font-weight: 800; + text-transform: uppercase; + + input { + @extend %input; + } + } + + &__title { + letter-spacing: 2px; + } + + &__value { + display: grid; + grid-template-columns: 1fr .75fr; + align-items: center; + + color: $background; + + input { + @extend %input; + + &[type="text"], + &[type="number"] { + background: rgba($foreground, .125); + color: $background; + + font-size: 14pt; + font-weight: 800; + } + } + + span { + text-align: center; + font-weight: 600; + } + } + + &__bonus { + font-size: 12pt; + + &:before, + &:after { + display: inline; + } + + &:before { + content: "("; + } + + &:after { + content: ")"; + } + } + + &__body { + display: grid; + grid-template-columns: 1fr 1fr; + gap: .25em 0; + } + + } + + &-skill { + + display: grid; + grid-template-columns: 1fr 3.5em; + gap: 0; + align-items: center; + + &__name[type="roll"] { + display: flex; + flex-grow: 0; + align-items: center; + border: 0; + background: none; + + font-size: 9pt !important; + font-weight: 600; + text-align: left; + text-transform: uppercase; + + &:before { + display: none; + } + + &:after { + display: block; + flex-grow: 1; + content: ""; + height: 0; + margin: 0; + margin-left: 4px; + + border-bottom: 3px solid $yellow; + } + + &:hover { + color: $cyan; + box-shadow: none !important; + border: 0 !important; + + &:after { + border-color: $cyan; + } + } + } + + &__value { + margin: 0; + padding: 0; + + select { + margin: 0 !important; + padding: 0; + + border: 0; + + font-size: 10pt; + line-height: 10pt; + } + } + + } + + &-traits { + border-right: 1px solid rgba($invert-foreground, .25); + padding: 1em; + + &:last-child { + border-right: 0; + } + + &__header { + padding: .5em; + margin-bottom: .5em; + + font-weight: 800; + text-align: center; + text-transform: uppercase; + } + + } + + &-trait { + margin-bottom: 1em; + + border: 1px solid rgba($cyan-sheet, .5); + + &__title { + display: flex; + align-items: center; + flex-flow: row nowrap; + margin-bottom: 0; + padding: 0; + + border: 1px solid transparent; + + > div { + flex-shrink: 0; + margin-right: 5px; + } + + > input { + flex-grow: 1; + height: 2.5em; + + background: $invert-input-background !important; + border: 1px solid transparent; + border-bottom: 1px solid rgba($cyan-sheet, .5); + border-radius: 0; + color: $cyan !important; + + font-size: 9pt !important; + font-weight: 600 !important; + } + } + + &__label { + @extend %label; + } + + &__description { + padding: 0; + + textarea { + width: 100%; + height: 7.5em; + padding: .25em; + margin: 0; + + border: 1px solid transparent; + border-radius: none; + background: $invert-input-background; + color: $invert-foreground; + + font-size: 9pt; + } + } + + } + + &-networks, + &-baggage { + + &__header { + color: $red; + + font-size: 14pt; + font-weight: 800; + text-transform: uppercase; + } + + &__item { + display: flex; + align-items: center; + flex-flow: row nowrap; + margin-bottom: .5em; + + border: 0; + border-bottom: 1px solid $grey; + + &:before { + display: inline-block; + flex-shrink: 0; + content: "4"; + margin-right: .25em; + + color: $cyan-sheet; + + font-family: "Pictos"; + } + + > input { + flex-grow: 1; + border: 0; + + font-size: 10pt !important; + } + } + + } + + &-baggage { + textarea { + height: 4.5em; + } + + &__item { + align-items: flex-start !important; + + &:before { + margin-top: .1em; + } + } + + } + + &-biometrics { + + &__header { + color: $red; + + font-size: 14pt; + font-weight: 800; + text-transform: uppercase; + } + + &__container { + border: 1px solid $yellow; + padding: .5em; + } + + &__row { + display: flex; + flex-flow: row nowrap; + align-items: center; + + &--textarea { + margin-top: .5em; + + textarea { + background: $light-grey; + } + } + } + + &__label { + flex-shrink: 0; + + font-size: 10pt; + font-weight: 600; + text-transform: uppercase; + + &:after { + display: inline; + content: ":"; + margin-right: .5em; + } + } + + &__input { + flex-grow: 1; + + font-size: 10pt; + font-weight: 600; + + input[type="number"], + input[type="text"] { + border: 0; + border-bottom: 1px solid $grey; + } + + &--minmax { + @extend .sheet-ac-biometrics__input; + flex-grow: 0; + + display: grid; + grid-template-columns: 1fr .5em 1fr; + align-items: center; + width: 50%; + + } + } + + textarea { + height: 7.5em; + } + + } + + &-health { + margin-top: 2em; + + &__label { + flex-shrink: 0; + + font-size: 10pt; + font-weight: 600; + text-transform: uppercase; + + &:after { + display: inline; + content: ":"; + margin-right: .5em; + } + } + + &__input { + flex-grow: 1; + + font-size: 10pt; + font-weight: 600; + + input[type="number"], + input[type="text"] { + border: 0; + border-bottom: 1px solid $grey; + } + + &--minmax { + @extend .sheet-ac-biometrics__input; + flex-grow: 0; + display: grid; + grid-template-columns: 1fr .5em 1fr; + align-items: center; + width: 30%; + } + } + + &__row { + display: flex; + flex-flow: row nowrap; + align-items: center; + + margin-bottom: .5em; + + &--textarea { + + textarea { + background: $light-grey; + } + } + } + + } + + &-equipment { + display: grid; + grid-template-columns: 1fr 1fr; + align-items: stretch; + gap: 1em 0; + + > * { + padding: 0.75em; + } + + &__credits { + grid-column: 1 / -1; + } + + &__header { + color: $red; + + font-size: 14pt; + font-weight: 800; + text-align: center; + text-transform: uppercase; + } + + &__tools { + border-left: 1px dashed $grey; + } + } + + &-credits { + + display: grid; + grid-template-columns: repeat(6, 1fr); + gap: 1.5em; + align-items: center; + + &__title { + color: $red; + + font-size: 14pt; + font-weight: 800; + text-transform: uppercase; + } + + &__item { + display: flex; + border: 1px solid $cyan-sheet; + border-left: 3px solid $cyan-sheet; + border-right: 3px solid $cyan-sheet; + + font-size: 10pt; + font-weight: 600; + + input { + border: 0; + + text-align: center; + } + } + + &__label { + padding: .125em; + } + + &__input { + margin-left: .5em; + } + + } + + &-tool, + &-item { + margin-bottom: 1.5em; + padding: .75em; + + border: 2px solid $cyan-sheet; + + input { + flex-shrink: 1; + + border: 0; + width: 100%; + } + + &__row { + display: flex; + flex-flow: row nowrap; + align-items: center; + margin-bottom: 1em; + + input { + flex-grow: 1; + border-bottom: 1px solid $grey; + } + + &--name, + &--skillchecks { + @extend .sheet-ac-item__row; + } + + &--bonus { + display: grid; + grid-template-columns: 1fr 1fr; + margin-bottom: 1em; + } + + &--checks { + display: grid; + grid-template-columns: 1fr 1.5fr; + margin-bottom: 1em; + } + + &--special { + display: grid; + } + } + + &__label { + flex-shrink: 0; + + font-size: 9pt; + font-weight: 800; + + &:after { + display: inline; + content: ":"; + + margin-right: .5em; + } + + &--name { + @extend .sheet-ac-item__label; + color: $red; + + font-size: 14pt; + font-weight: 800; + text-transform: uppercase; + } + + &--small { + flex-basis: 1.5em; + + font-weight: 400; + } + } + + &__bonus { + grid-column: span 2; + display: flex; + flex-flow: row nowrap; + align-items: center; + + } + + &__checkmarks { + display: grid; + grid-template-columns: repeat(10, 1fr); + + label { + cursor: pointer; + + span { + display: block; + height: 1em; + width: 1em; + border-radius: 50%; + + background-color: rgba($cyan-sheet, .125); + border: 1px solid $cyan; + } + + input[type="radio"] { + display: none; + + &:checked { + + & + span { + background-color: $cyan-sheet; + } + } + } + + &.sheet-ac-checkmark--red { + span { + background-color: rgba($red, .125); + border: 1px solid $red; + } + + input[type="radio"] { + display: none; + + &:checked { + & + span { + background-color: $red; + } + } + } + } + } + } + + &__price { + display: flex; + flex-flow: row nowrap; + align-items: center; + margin: .25em; + padding: .25em; + + border: 1px solid $yellow; + + .sheet-ac-tool__label, + .sheet-ac-item__label { + font-size: 8pt; + font-weight: 400; + } + + input[type=text] { + width: 4em; + } + } + + &__special { + + textarea { + border: 1px solid $grey; + + height: 5em; + } + + } + + &__triggered { + display: grid; + grid-template-columns: 1fr 2fr; + align-items: center; + gap: .5em; + width: 100%; + + .sheet-ac-item__checkmarks { + grid-template-columns: repeat(5, 1fr); + } + } + + &__special, + &__triggered { + + .sheet-ac-tool__label, + .sheet-ac-item__label { + grid-column: 1 / -1; + + color: $cyan-sheet; + + font-size: 10pt; + } + + } + + &__wrap { + font-size: 14pt; + font-weight: 600; + } + } +} + +.sheet-ac-body { + display: none; +} + +.sheet-ac-equipment { + display: none; +} + +input[name="attr_nav"][value="Character Sheet"] ~ .sheet-ac-body { + display: block; +} + +input[name="attr_nav"][value="Equipment"] ~ .sheet-ac-equipment { + display: grid; +} + +.sheet-rolltemplate-alteredcarbon { + background: $background; + padding: .5em; + + h1 { + margin-bottom: .25em; + + color: $cyan-sheet; + + font-size: 14pt; + letter-spacing: 2px; + line-height: 14pt; + text-align: center; + text-transform: uppercase; + } + + h2 { + margin-bottom: .25em; + + color: $red; + + font-size: 10pt; + font-weight: 600; + line-height: 10pt; + text-align: center; + } + + .sheet-ac-roll-container { + padding: .5em; + + border: 2px solid $cyan; + color: $foreground; + } + + .sheet-ac-roll-target { + margin: .5em 0; + padding: .5em; + + text-align: center; + + background: $invert-background; + color: $invert-foreground; + + .sheet-ac-roll-target-label { + font-size: 12pt; + font-weight: 600; + letter-spacing: 2px; + text-transform: uppercase; + + &:after { + display: inline; + content: ":"; + margin-right: .75em; + } + } + + .sheet-ac-roll-target-value { + color: $cyan; + + font-size: 12pt; + font-weight: 800; + } + + + } + + .sheet-ac-roll-result { + + display: flex; + justify-content: space-around; + + &-roll, + &-luck, + &-bonus { + * { + text-align: center; + } + + strong { + display: block; + + font-size: 9pt; + font-weight: 400; + text-transform: uppercase; + } + + div { + width: 1em; + height: 1em; + margin: auto; + padding: .25em; + border: 1px solid $grey; + font-size: 16pt; + } + } + + .importantroll, + .fullcrit, + .fullfail, + .inlinerollresult { + border: none; + background: transparent; + + font-family: inherit; + line-height: 1em; + } + + .fullcrit { + color: $cyan-sheet; + } + + .fullfail { + color: $red; + } + } + + .sheet-ac-roll-tag { + margin-top: .5em; + + .sheet-ac-roll-ace { + padding: 5px; + + border: 1px solid $cyan-sheet; + color: $cyan-sheet; + + font-size: 12pt; + font-weight: 800; + text-align: center; + text-transform: uppercase; + } + + .sheet-ac-roll-stroke { + padding: 5px; + + background: $cyan; + color: $background; + + font-size: 12pt; + font-weight: 800; + text-align: center; + text-transform: uppercase; + } + + .sheet-ac-roll-catastrophe { + padding: 5px; + + background: $red; + color: $background; + + font-size: 12pt; + font-weight: 800; + text-align: center; + text-transform: uppercase; + } + + } + } \ No newline at end of file diff --git a/Black Crusade Advanced API/scripts/Ammos.js b/Black Crusade Advanced API/scripts/Ammos.js index 28a323ee77..2d72f2b36d 100644 --- a/Black Crusade Advanced API/scripts/Ammos.js +++ b/Black Crusade Advanced API/scripts/Ammos.js @@ -1,299 +1,299 @@ -var Ammo = Ammo || (function() { - 'use strict'; - - var version = '0.3.7', - lastUpdate = 1490362793, - schemaVersion = 0.1, - - ch = function (c) { - var entities = { - '<' : 'lt', - '>' : 'gt', - "'" : '#39', - '@' : '#64', - '{' : '#123', - '|' : '#124', - '}' : '#125', - '[' : '#91', - ']' : '#93', - '"' : 'quot', - '-' : 'mdash', - ' ' : 'nbsp' - }; - - if(_.has(entities,c) ){ - return ('&'+entities[c]+';'); - } - return ''; - }, - sendMessage = function(message, who) { - sendChat('Ammo', (who ? ('/w '+who+' ') : '') + '
'+ - message+ - '
' - ); - }, - - adjustAmmo = function (who,attr,amount,label,playerid) { - var val = parseInt(attr.get('current'),10)||0, - max = parseInt(attr.get('max'),10)||10000, - adj = (val+amount), - chr = getObj('character',attr.get('characterid')), - valid = true; - label=label||'ammo'; - - if(adj < 0 ) { - sendMessage( - ''+chr.get('name') + ' does not have enough '+label+'. Needs '+Math.abs(amount)+', but only has '+ - ''+val+'.'+ - ''+max+'.'+ - ''+ - '
'+ - 'Ammo v'+version+ - '
'+ - '
'+ - '

Ammo provides inventory management for ammunition stored in a character '+ - 'attribute. If the adjustment would change the attribute to be below 0 or above '+ - 'it'+ch("'")+'s maximum value, a warning will be issued and the attribute will not be'+ - 'changed.

'+ - - ( (playerIsGM(playerid)) ? '

Note: As the GM, bounds will not be '+ - 'enforced for you. You will be whispered the warnings, but the operation '+ - 'will succeed. You will also be told the previous and current state in case '+ - 'you want to revert the change.' : '')+ - - '

'+ - 'Commands'+ - '
'+ - '!ammo '+ch('<')+'id'+ch('>')+' '+ch('<')+'attribute'+ch('>')+' '+ch('<')+'amount'+ch('>')+' '+ch('[')+'resource name'+ch(']')+''+ - '
'+ - 'This command requires 3 parameters:'+ - '
    '+ - '
  • '+ - 'id -- The id of the character which has the attribute. You can pass this as '+ch('@')+ch('{')+'selected|token_id'+ch('}')+' and the character id will be pulled from represents field of the token.'+ - '
  • '+ - '
  • '+ - 'attribute -- The name of the attribute representing ammunition.'+ - '
  • '+ - '
  • '+ - 'amount -- The change to apply to the current quantity of ammo. Use negative numbers to decrease the amount, and positive numbers to increase it. You can use inline rolls to determine the number.'+ - '
  • '+ - '
  • '+ - 'resource name -- Anything you put after the amount to adjust by will be used as the resource name (default: "ammo").'+ - '
  • '+ - '
'+ - '
'+ - '!wammo '+ch('<')+'id'+ch('>')+' '+ch('<')+'attribute'+ch('>')+' '+ch('<')+'amount'+ch('>')+' '+ch('[')+'resource name'+ch(']')+''+ - '
'+ - 'This command is identical to !ammo but will whisper all output.'+ - '
'+ - '
'+ -'' - ); - }, - - attrLookup = function(character,name,caseSensitive){ - let match=name.match(/^(repeating_.*)_\$(\d+)_.*$/); - if(match){ - let index=match[2], - attrMatcher=new RegExp(`^${name.replace(/_\$\d+_/,'_([-\\da-zA-Z]+)_')}$`,(caseSensitive?'i':'')), - createOrderKeys=[], - attrs=_.chain(findObjs({type:'attribute', characterid:character.id})) - .map((a)=>{ - return {attr:a,match:a.get('name').match(attrMatcher)}; - }) - .filter((o)=>o.match) - .each((o)=>createOrderKeys.push(o.match[1])) - .reduce((m,o)=>{ m[o.match[1]]=o.attr; return m;},{}) - .value(), - sortOrderKeys = _.chain( ((findObjs({ - type:'attribute', - characterid:character.id, - name: `_reporder_${match[1]}` - })[0]||{get:_.noop}).get('current') || '' ).split(/\s*,\s*/)) - .intersection(createOrderKeys) - .union(createOrderKeys) - .value(); - if(index'API'}).get('_displayname'); - - if(_.has(msg,'inlinerolls')){ - msg.content = _.chain(msg.inlinerolls) - .reduce(function(m,v,k){ - m['$[['+k+']]']=v.results.total || 0; - return m; - },{}) - .reduce(function(m,v,k){ - return m.replace(k,v); - },msg.content) - .value(); - } - - args = msg.content.split(/\s+/); - switch(args[0]) { - case '!wammo': - whisper = true; - /* break; // intentional dropthrough */ /* falls through */ - - case '!ammo': - if(args.length > 1) { - - switch(args[1]) { - case '--help': - return showHelp(who,msg.playerid); - - case 'recover': // - // apply policy to put amounts back in - case 'check': // - // print the amount in the attribute nicely formatted - case 'recovery-policy': // [character/token_id] [attribute_name] - // create the right entry in the state - case 'name': // [character/token_id] [attribute_name] - // create the right entry in the state - - // configs - case 'recovery-updates-maximum': - // adjust the maximum to be whatever the current is - case 'create-attributes-automatically': - // create the requested attribute and start using it. - } - - - chr = getObj('character', args[1]); - if( ! chr ) { - token = getObj('graphic', args[1]); - if(token) { - chr = getObj('character', token.get('represents')); - } - } - if(chr) { - if(! playerIsGM(msg.playerid) && - ! _.contains(chr.get('controlledby').split(','),msg.playerid) && - ! _.contains(chr.get('controlledby').split(','),'all') - ) - { - sendMessage( - 'You do not control the specified character: '+chr.id , - (playerIsGM(msg.playerid) ? 'gm' : (whisper ? who :false)) - ); - sendMessage( - ''+getObj('player',msg.playerid).get('_displayname')+' attempted to adjust attribute '+args[2]+' on character '+chr.get('name')+'.', - 'gm' - ); - return; - } - - attr = attrLookup(chr,args[2],false); - } - amount=parseInt(args[3],10); - label=_.rest(args,4).join(' '); - if(attr) { - adjustAmmo( - (playerIsGM(msg.playerid) ? 'gm' : (whisper ? who :false)), - attr,amount,label,msg.playerid - ); - } else { - if(chr) { - sendMessage( - 'Attribute ['+args[2]+'] was not found. Please verify that you have the right name.', - (playerIsGM(msg.playerid) ? 'gm' : (whisper ? who :false)) - ); - } else { - sendMessage( - ( token ? 'Token id ['+args[1]+'] does not represent a character. ' : 'Character/Token id ['+args[1]+'] is not valid. ' ) + - 'Please be sure you are specifying it correctly, either with '+ch('@')+ch('{')+'selected|token_id'+ch('}')+ - ' or '+ch('@')+ch('{')+'selected|character_id'+ch('}')+'.', - (playerIsGM(msg.playerid) ? 'gm' : (whisper ? who :false)) - ); - } - } - } else { - showHelp(who,msg.playerid); - } - break; - } - - }, - checkInstall = function() { - log('-=> Ammo v'+version+' <=- ['+(new Date(lastUpdate*1000))+']'); - if( ! _.has(state,'Ammo') || state.Ammo.version !== schemaVersion) { - log(' > Updating Schema to v'+schemaVersion+' <'); - state.Ammo = { - version: schemaVersion, - config: { - }, - policies: { - global: { - recoveryUpdatesMaximum: false - }, - byAttribute: { - }, - byCharacter: { - } - } - }; - } - }, - - RegisterEventHandlers = function() { - on('chat:message', HandleInput); - }; - - return { - CheckInstall: checkInstall, - RegisterEventHandlers: RegisterEventHandlers - }; -}()); - -on("ready",function(){ - 'use strict'; - - Ammo.CheckInstall(); - Ammo.RegisterEventHandlers(); +var Ammo = Ammo || (function() { + 'use strict'; + + var version = '0.3.7', + lastUpdate = 1490362793, + schemaVersion = 0.1, + + ch = function (c) { + var entities = { + '<' : 'lt', + '>' : 'gt', + "'" : '#39', + '@' : '#64', + '{' : '#123', + '|' : '#124', + '}' : '#125', + '[' : '#91', + ']' : '#93', + '"' : 'quot', + '-' : 'mdash', + ' ' : 'nbsp' + }; + + if(_.has(entities,c) ){ + return ('&'+entities[c]+';'); + } + return ''; + }, + sendMessage = function(message, who) { + sendChat('Ammo', (who ? ('/w '+who+' ') : '') + '
'+ + message+ + '
' + ); + }, + + adjustAmmo = function (who,attr,amount,label,playerid) { + var val = parseInt(attr.get('current'),10)||0, + max = parseInt(attr.get('max'),10)||10000, + adj = (val+amount), + chr = getObj('character',attr.get('characterid')), + valid = true; + label=label||'ammo'; + + if(adj < 0 ) { + sendMessage( + ''+chr.get('name') + ' does not have enough '+label+'. Needs '+Math.abs(amount)+', but only has '+ + ''+val+'.'+ + ''+max+'.'+ + ''+ + '
'+ + 'Ammo v'+version+ + '
'+ + '
'+ + '

Ammo provides inventory management for ammunition stored in a character '+ + 'attribute. If the adjustment would change the attribute to be below 0 or above '+ + 'it'+ch("'")+'s maximum value, a warning will be issued and the attribute will not be'+ + 'changed.

'+ + + ( (playerIsGM(playerid)) ? '

Note: As the GM, bounds will not be '+ + 'enforced for you. You will be whispered the warnings, but the operation '+ + 'will succeed. You will also be told the previous and current state in case '+ + 'you want to revert the change.' : '')+ + + '

'+ + 'Commands'+ + '
'+ + '!ammo '+ch('<')+'id'+ch('>')+' '+ch('<')+'attribute'+ch('>')+' '+ch('<')+'amount'+ch('>')+' '+ch('[')+'resource name'+ch(']')+''+ + '
'+ + 'This command requires 3 parameters:'+ + '
    '+ + '
  • '+ + 'id -- The id of the character which has the attribute. You can pass this as '+ch('@')+ch('{')+'selected|token_id'+ch('}')+' and the character id will be pulled from represents field of the token.'+ + '
  • '+ + '
  • '+ + 'attribute -- The name of the attribute representing ammunition.'+ + '
  • '+ + '
  • '+ + 'amount -- The change to apply to the current quantity of ammo. Use negative numbers to decrease the amount, and positive numbers to increase it. You can use inline rolls to determine the number.'+ + '
  • '+ + '
  • '+ + 'resource name -- Anything you put after the amount to adjust by will be used as the resource name (default: "ammo").'+ + '
  • '+ + '
'+ + '
'+ + '!wammo '+ch('<')+'id'+ch('>')+' '+ch('<')+'attribute'+ch('>')+' '+ch('<')+'amount'+ch('>')+' '+ch('[')+'resource name'+ch(']')+''+ + '
'+ + 'This command is identical to !ammo but will whisper all output.'+ + '
'+ + '
'+ +'' + ); + }, + + attrLookup = function(character,name,caseSensitive){ + let match=name.match(/^(repeating_.*)_\$(\d+)_.*$/); + if(match){ + let index=match[2], + attrMatcher=new RegExp(`^${name.replace(/_\$\d+_/,'_([-\\da-zA-Z]+)_')}$`,(caseSensitive?'i':'')), + createOrderKeys=[], + attrs=_.chain(findObjs({type:'attribute', characterid:character.id})) + .map((a)=>{ + return {attr:a,match:a.get('name').match(attrMatcher)}; + }) + .filter((o)=>o.match) + .each((o)=>createOrderKeys.push(o.match[1])) + .reduce((m,o)=>{ m[o.match[1]]=o.attr; return m;},{}) + .value(), + sortOrderKeys = _.chain( ((findObjs({ + type:'attribute', + characterid:character.id, + name: `_reporder_${match[1]}` + })[0]||{get:_.noop}).get('current') || '' ).split(/\s*,\s*/)) + .intersection(createOrderKeys) + .union(createOrderKeys) + .value(); + if(index'API'}).get('_displayname'); + + if(_.has(msg,'inlinerolls')){ + msg.content = _.chain(msg.inlinerolls) + .reduce(function(m,v,k){ + m['$[['+k+']]']=v.results.total || 0; + return m; + },{}) + .reduce(function(m,v,k){ + return m.replace(k,v); + },msg.content) + .value(); + } + + args = msg.content.split(/\s+/); + switch(args[0]) { + case '!wammo': + whisper = true; + /* break; // intentional dropthrough */ /* falls through */ + + case '!ammo': + if(args.length > 1) { + + switch(args[1]) { + case '--help': + return showHelp(who,msg.playerid); + + case 'recover': // + // apply policy to put amounts back in + case 'check': // + // print the amount in the attribute nicely formatted + case 'recovery-policy': // [character/token_id] [attribute_name] + // create the right entry in the state + case 'name': // [character/token_id] [attribute_name] + // create the right entry in the state + + // configs + case 'recovery-updates-maximum': + // adjust the maximum to be whatever the current is + case 'create-attributes-automatically': + // create the requested attribute and start using it. + } + + + chr = getObj('character', args[1]); + if( ! chr ) { + token = getObj('graphic', args[1]); + if(token) { + chr = getObj('character', token.get('represents')); + } + } + if(chr) { + if(! playerIsGM(msg.playerid) && + ! _.contains(chr.get('controlledby').split(','),msg.playerid) && + ! _.contains(chr.get('controlledby').split(','),'all') + ) + { + sendMessage( + 'You do not control the specified character: '+chr.id , + (playerIsGM(msg.playerid) ? 'gm' : (whisper ? who :false)) + ); + sendMessage( + ''+getObj('player',msg.playerid).get('_displayname')+' attempted to adjust attribute '+args[2]+' on character '+chr.get('name')+'.', + 'gm' + ); + return; + } + + attr = attrLookup(chr,args[2],false); + } + amount=parseInt(args[3],10); + label=_.rest(args,4).join(' '); + if(attr) { + adjustAmmo( + (playerIsGM(msg.playerid) ? 'gm' : (whisper ? who :false)), + attr,amount,label,msg.playerid + ); + } else { + if(chr) { + sendMessage( + 'Attribute ['+args[2]+'] was not found. Please verify that you have the right name.', + (playerIsGM(msg.playerid) ? 'gm' : (whisper ? who :false)) + ); + } else { + sendMessage( + ( token ? 'Token id ['+args[1]+'] does not represent a character. ' : 'Character/Token id ['+args[1]+'] is not valid. ' ) + + 'Please be sure you are specifying it correctly, either with '+ch('@')+ch('{')+'selected|token_id'+ch('}')+ + ' or '+ch('@')+ch('{')+'selected|character_id'+ch('}')+'.', + (playerIsGM(msg.playerid) ? 'gm' : (whisper ? who :false)) + ); + } + } + } else { + showHelp(who,msg.playerid); + } + break; + } + + }, + checkInstall = function() { + log('-=> Ammo v'+version+' <=- ['+(new Date(lastUpdate*1000))+']'); + if( ! _.has(state,'Ammo') || state.Ammo.version !== schemaVersion) { + log(' > Updating Schema to v'+schemaVersion+' <'); + state.Ammo = { + version: schemaVersion, + config: { + }, + policies: { + global: { + recoveryUpdatesMaximum: false + }, + byAttribute: { + }, + byCharacter: { + } + } + }; + } + }, + + RegisterEventHandlers = function() { + on('chat:message', HandleInput); + }; + + return { + CheckInstall: checkInstall, + RegisterEventHandlers: RegisterEventHandlers + }; +}()); + +on("ready",function(){ + 'use strict'; + + Ammo.CheckInstall(); + Ammo.RegisterEventHandlers(); }); \ No newline at end of file diff --git a/Black Crusade Advanced API/scripts/CharacteristicScriptBC.js b/Black Crusade Advanced API/scripts/CharacteristicScriptBC.js index e013a129d1..7c26a0c45d 100644 --- a/Black Crusade Advanced API/scripts/CharacteristicScriptBC.js +++ b/Black Crusade Advanced API/scripts/CharacteristicScriptBC.js @@ -1,75 +1,75 @@ -/** - * This script rolls a d100 and computes and outputs the success results based - * originally on Dark Heresy Second Edition RPG criteria and now Black Crusade RPG criteria. - * - * The following commands is used: - * !roll40k [tokenName], [attributeValue], [unnaturalAttributeValue], [ModifierValue] - * - * This script was written by Jack D on Roll20 Forums at https://app.roll20.net/forum/post/4607859/help-dark-heresy-2nd-edition-api - * and later modified by Pixizz for Black Crusade. -**/ - -//Rolls a d100 and calculates the success or fail results to the chat window. -var rollcharacteristic40k = rollcharacteristic40k || (function(){ - - var rollResultForRoll40k = function (token, attribute, unAttribute, modifier) { - var roll = randomInteger(100); - var modTarget = parseInt(attribute) + parseInt(modifier); - var output1, output2, degOfSuc; - //Form output message based on result - if (roll === 1) { - output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + '. '; - output2 = '' + token + ' rolled a 1 and automatically succeeds by 1 degree.'; - } - else if (roll === 100) { - output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + '. '; - output2 = '' + token + ' rolled a 100 and automatically fails by 1 degree.'; - } - else if (roll <= modTarget) { - degOfSuc = (Math.floor(modTarget / 10) - Math.floor(roll / 10)) + 1 + parseInt(unAttribute); - output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + '. '; - output2 = '' + token + ' succeeds by ' + degOfSuc + ' degree(s).'; - } - else { - degOfSuc = (Math.floor(roll / 10) - Math.floor(modTarget / 10)) + 1; - output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + '. '; - output2 = '' + token + ' fails by ' + degOfSuc + ' degree(s).'; - } - //Return output - return output1 + '

' + output2; - }, - - processInlinerolls = function(msg) { - if (_.has(msg, 'inlinerolls')) { - return _.chain(msg.inlinerolls) - .reduce(function(previous, current, index) { - previous['$[[' + index + ']]'] = current.results.total || 0; - return previous; - },{}) - .reduce(function(previous, current, index) { - return previous.replace(index, current); - }, msg.content) - .value(); - } else { - return msg.content; - } - }; - - /** Interpret the chat commands. **/ - on('chat:message', function (msg) { - 'use strict'; - var cmdName = '!rollcharacteristic40k '; - if (msg.type === 'api' && msg.content.indexOf(cmdName) !== -1) { - let content = processInlinerolls(msg); - var paramArray = content.slice(cmdName.length).split(','); - if (paramArray.length !== 4) { - sendChat(msg.who, '/w ' + msg.who + ' You must specify four comma-separated ' + - 'parameters for the !rollcharacteristic40k command. Do not use commas in the input zones.'); - } - else { - var result = rollResultForRoll40k(paramArray[0].trim(), paramArray[1].trim(), paramArray[2].trim(), paramArray[3].trim()); - sendChat(msg.who, result); - } - } - }); +/** + * This script rolls a d100 and computes and outputs the success results based + * originally on Dark Heresy Second Edition RPG criteria and now Black Crusade RPG criteria. + * + * The following commands is used: + * !roll40k [tokenName], [attributeValue], [unnaturalAttributeValue], [ModifierValue] + * + * This script was written by Jack D on Roll20 Forums at https://app.roll20.net/forum/post/4607859/help-dark-heresy-2nd-edition-api + * and later modified by Pixizz for Black Crusade. +**/ + +//Rolls a d100 and calculates the success or fail results to the chat window. +var rollcharacteristic40k = rollcharacteristic40k || (function(){ + + var rollResultForRoll40k = function (token, attribute, unAttribute, modifier) { + var roll = randomInteger(100); + var modTarget = parseInt(attribute) + parseInt(modifier); + var output1, output2, degOfSuc; + //Form output message based on result + if (roll === 1) { + output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + '. '; + output2 = '' + token + ' rolled a 1 and automatically succeeds by 1 degree.'; + } + else if (roll === 100) { + output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + '. '; + output2 = '' + token + ' rolled a 100 and automatically fails by 1 degree.'; + } + else if (roll <= modTarget) { + degOfSuc = (Math.floor(modTarget / 10) - Math.floor(roll / 10)) + 1 + parseInt(unAttribute); + output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + '. '; + output2 = '' + token + ' succeeds by ' + degOfSuc + ' degree(s).'; + } + else { + degOfSuc = (Math.floor(roll / 10) - Math.floor(modTarget / 10)) + 1; + output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + '. '; + output2 = '' + token + ' fails by ' + degOfSuc + ' degree(s).'; + } + //Return output + return output1 + '

' + output2; + }, + + processInlinerolls = function(msg) { + if (_.has(msg, 'inlinerolls')) { + return _.chain(msg.inlinerolls) + .reduce(function(previous, current, index) { + previous['$[[' + index + ']]'] = current.results.total || 0; + return previous; + },{}) + .reduce(function(previous, current, index) { + return previous.replace(index, current); + }, msg.content) + .value(); + } else { + return msg.content; + } + }; + + /** Interpret the chat commands. **/ + on('chat:message', function (msg) { + 'use strict'; + var cmdName = '!rollcharacteristic40k '; + if (msg.type === 'api' && msg.content.indexOf(cmdName) !== -1) { + let content = processInlinerolls(msg); + var paramArray = content.slice(cmdName.length).split(','); + if (paramArray.length !== 4) { + sendChat(msg.who, '/w ' + msg.who + ' You must specify four comma-separated ' + + 'parameters for the !rollcharacteristic40k command. Do not use commas in the input zones.'); + } + else { + var result = rollResultForRoll40k(paramArray[0].trim(), paramArray[1].trim(), paramArray[2].trim(), paramArray[3].trim()); + sendChat(msg.who, result); + } + } + }); }()) \ No newline at end of file diff --git a/Black Crusade Advanced API/scripts/DegreesSkillBC.js b/Black Crusade Advanced API/scripts/DegreesSkillBC.js index 5b7aa6ced8..a608602ea2 100644 --- a/Black Crusade Advanced API/scripts/DegreesSkillBC.js +++ b/Black Crusade Advanced API/scripts/DegreesSkillBC.js @@ -1,101 +1,101 @@ -/** - * This script rolls a d100 and computes and outputs the success results based - * originally on Dark Heresy Second Edition RPG criteria. It is intended to be used - * for skill checks. - * - * The following commands is used: - * !skill40k [tokenName], [attributeValue], [unnaturalAttributeValue] [skillBonus1], [skillBonus2], [skillBonus3], [skillBonus4], [ModifierValue] - * - * It is expected that the following bonus are included based on the skill level of the character: - * skillBonus1 = 20 or 0, if known or untrained - * skillBonus2 = 10 or 0, if trained or less than trained - * skillBonus3 = 10 or 0, if experienced or less than experienced - * skillBonus4 = 10 or 0, if veteran or less than veteran - * - * Example: - * /em @{character_name} makes a known Acrobatics skill check! - * !skill40k @{character_name},@{Agility},@{UnAg},20,0,0,0,?{Total Modifiers|0} - * - * This script was written by Jack D on Roll20 Forums at https://app.roll20.net/forum/post/4607859/help-dark-heresy-2nd-edition-api and - * later modified by Pixizz for use in Black Crusade. - * - **/ - - -//Rolls a d100 and calculates the success or fail results to the chat window. -var rollResultForSkill40k = function (token, attribute, unAttribute, skillBn1, skillBn2, skillBn3, skillBn4, modifier) { - var roll = randomInteger(100); - var skillBonus = parseInt(skillBn1) + parseInt(skillBn2) + parseInt(skillBn3) + parseInt(skillBn4) - 20; - var modTarget = parseInt(attribute) + skillBonus + parseInt(modifier); - var output1 = token, - output2, degOfSuc; - - - //Create output which includes skill level wording - switch (skillBonus) { - case 0: - output1 += ' is known (0)'; - break; - case 10: - output1 += ' is trained (+10)'; - break; - case 20: - output1 += ' is experienced (+20)'; - break; - case 30: - output1 += ' is veteran (+30)'; - break; - default: - output1 += ' is untrained (-20)'; - } - output1 += ' granting a modified target of ' + modTarget + '. They ' + - 'rolled a ' + roll + '.'; - - - //Form output message based on result - if (roll === 1) { - output2 = '' + token + ' rolled a 1 and automatically succeeds by 1 degree.'; - } - else if (roll === 100) { - output2 = '' + token + ' rolled a 100 and automatically fails by 1 degree.'; - } - else if (roll <= modTarget) { - degOfSuc = (Math.floor(modTarget / 10) - Math.floor(roll / 10)) + 1 + parseInt(unAttribute); - output2 = '' + token + ' succeeds by ' + degOfSuc + ' degree(s).'; - } - else { - degOfSuc = (Math.floor(roll / 10) - Math.floor(modTarget / 10)) + 1; - output2 = '' + token + ' fails by ' + degOfSuc + ' degree(s).'; - } - - - //Return output - return output1 + '

' + output2; -}; - - -/** Interpret the chat commands. **/ -on('chat:message', function (msg) { - 'use strict'; - var cmdName = '!skill40k '; - - - if (msg.type === 'api' && msg.content.indexOf(cmdName) !== -1) { - var paramArray = msg.content.slice(cmdName.length).split(','); - if (paramArray.length !== 8) { - sendChat(msg.who, '/w ' + msg.who + ' must specify eight comma-separated ' + - 'parameters for the !skill40k command. Do not use commas in the input zones.'); - } - else { - var result = rollResultForSkill40k(paramArray[0].trim(), - paramArray[1].trim(), - paramArray[2].trim(), - paramArray[3].trim(), - paramArray[4].trim(), - paramArray[5].trim(), - paramArray[6].trim(), - paramArray[7].trim()); - sendChat(msg.who, result); - } - } +/** + * This script rolls a d100 and computes and outputs the success results based + * originally on Dark Heresy Second Edition RPG criteria. It is intended to be used + * for skill checks. + * + * The following commands is used: + * !skill40k [tokenName], [attributeValue], [unnaturalAttributeValue] [skillBonus1], [skillBonus2], [skillBonus3], [skillBonus4], [ModifierValue] + * + * It is expected that the following bonus are included based on the skill level of the character: + * skillBonus1 = 20 or 0, if known or untrained + * skillBonus2 = 10 or 0, if trained or less than trained + * skillBonus3 = 10 or 0, if experienced or less than experienced + * skillBonus4 = 10 or 0, if veteran or less than veteran + * + * Example: + * /em @{character_name} makes a known Acrobatics skill check! + * !skill40k @{character_name},@{Agility},@{UnAg},20,0,0,0,?{Total Modifiers|0} + * + * This script was written by Jack D on Roll20 Forums at https://app.roll20.net/forum/post/4607859/help-dark-heresy-2nd-edition-api and + * later modified by Pixizz for use in Black Crusade. + * + **/ + + +//Rolls a d100 and calculates the success or fail results to the chat window. +var rollResultForSkill40k = function (token, attribute, unAttribute, skillBn1, skillBn2, skillBn3, skillBn4, modifier) { + var roll = randomInteger(100); + var skillBonus = parseInt(skillBn1) + parseInt(skillBn2) + parseInt(skillBn3) + parseInt(skillBn4) - 20; + var modTarget = parseInt(attribute) + skillBonus + parseInt(modifier); + var output1 = token, + output2, degOfSuc; + + + //Create output which includes skill level wording + switch (skillBonus) { + case 0: + output1 += ' is known (0)'; + break; + case 10: + output1 += ' is trained (+10)'; + break; + case 20: + output1 += ' is experienced (+20)'; + break; + case 30: + output1 += ' is veteran (+30)'; + break; + default: + output1 += ' is untrained (-20)'; + } + output1 += ' granting a modified target of ' + modTarget + '. They ' + + 'rolled a ' + roll + '.'; + + + //Form output message based on result + if (roll === 1) { + output2 = '' + token + ' rolled a 1 and automatically succeeds by 1 degree.'; + } + else if (roll === 100) { + output2 = '' + token + ' rolled a 100 and automatically fails by 1 degree.'; + } + else if (roll <= modTarget) { + degOfSuc = (Math.floor(modTarget / 10) - Math.floor(roll / 10)) + 1 + parseInt(unAttribute); + output2 = '' + token + ' succeeds by ' + degOfSuc + ' degree(s).'; + } + else { + degOfSuc = (Math.floor(roll / 10) - Math.floor(modTarget / 10)) + 1; + output2 = '' + token + ' fails by ' + degOfSuc + ' degree(s).'; + } + + + //Return output + return output1 + '

' + output2; +}; + + +/** Interpret the chat commands. **/ +on('chat:message', function (msg) { + 'use strict'; + var cmdName = '!skill40k '; + + + if (msg.type === 'api' && msg.content.indexOf(cmdName) !== -1) { + var paramArray = msg.content.slice(cmdName.length).split(','); + if (paramArray.length !== 8) { + sendChat(msg.who, '/w ' + msg.who + ' must specify eight comma-separated ' + + 'parameters for the !skill40k command. Do not use commas in the input zones.'); + } + else { + var result = rollResultForSkill40k(paramArray[0].trim(), + paramArray[1].trim(), + paramArray[2].trim(), + paramArray[3].trim(), + paramArray[4].trim(), + paramArray[5].trim(), + paramArray[6].trim(), + paramArray[7].trim()); + sendChat(msg.who, result); + } + } }); \ No newline at end of file diff --git a/Black Crusade Advanced API/scripts/PerilTable.js b/Black Crusade Advanced API/scripts/PerilTable.js index a1035d4d30..9427bf436d 100644 --- a/Black Crusade Advanced API/scripts/PerilTable.js +++ b/Black Crusade Advanced API/scripts/PerilTable.js @@ -1,113 +1,113 @@ -/** - * This script rolls a d100 and compares it to the Black Crusade Perils of the Warp table. - * - * The following commands is used: - * !rollperiltable40k [tokenName] - * - * This script is based on Jack D works, modified by Pixizz. -**/ - -//Rolls a d100, add the modifier and determine the peril based on the Black Crusade chart. - -var rollperiltable40k = rollperiltable40k || (function(){ - - var rollResultForRollPsyTable40k = function (token) { - var roll = randomInteger(100); - var output1 = token + ' rolled a ' + roll + ' on the Perils of the Warp Table'; - var output2; - //Form output message based on roll - if (roll <= 5) { - output2 = 'The Gibbering: The psyker screams in pain as uncontrolled warp energies surge through his unprepared mind. He must make a Challenging (+0) Willpower Test or be stunned for 1d5 rounds'; - } - else if (roll >= 6 && roll <= 9) { - output2 = 'Warp Burn: A violent burst of energy from the warp smashes into the psyker’s mind, sending him reeling. He suffers 2d5 wounds, ignoring Toughness Bonus and Armour, and is stunned for 1d5 Rounds'; - } - else if (roll >= 10 && roll <= 13) { - output2 = 'Psychic Concussion: With a crack of energy, the psyker is knocked unconscious for 1d5 rounds, and everyone within 3d10 metres must make a Routine (+10) Willpower Test or be Stunned for one round'; - } - else if (roll >= 14 && roll <= 18) { - output2 = 'Psy Blast: There is an explosion of power and the psyker is thrown 3d10 metres into the air, falling to the ground moments later (see page 257 for Falling Damage)'; - } - else if (roll >= 19 && roll <= 24) { - output2 = 'Soul Sear: Warp power courses through the psyker’s body, scorching his soul. The psyker cannot use any powers for the next hour and gains 2d5 Corruption Points'; - } - else if (roll >= 25 && roll <= 30) { - output2 = 'Locked In: The power cages the psyker’s mind in an ethereal prison, tormented by visions of the warp. The psyker falls to the ground in a catatonic state. Each round thereafter, he must spend a full action to make a Diffi cult (–10) Willpower Test. On a success, his mind is freed and restored to his body, haunted by his experiences but otherwise unharmed'; - } - else if (roll >= 31 && roll <= 38) { - output2 = 'Chronological Incontinence: Time warps around the psyker. He winks out of existence and reappears in 1d10 rounds (for one minute in narrative time) in the exact location. He suffers one point of permanent Toughness and Intelligence damage as his body and mind rebel against the experience, and gains 1d5 Corruption Points'; - } - else if (roll >= 39 && roll <= 46) { - output2 = 'Psychic Mirror: The psyker’s power is turned back on him. Resolve the power’s effects, but the power targets the psyker instead. If the power is beneficial, it deals 1d10+5 Energy Damage (ignoring armour) to the psyker instead of its normal effect'; - } - else if (roll >= 47 && roll <= 55) { - output2 = 'Warp Whispers: The voices of daemons fill the air within 4d10 metres of the psyker, whispering terrible secrets and shocking truths. Everyone in the area (including the psyker ) must make a Hard (–20) Willpower Test or suffer 1d5 Corruption Points and an equal amount of Willpower Damage. In addition, whether or not the psyker passes the Willpower Test, he still suffers an additional 1d5+5 Willpower Damage'; - } - else if (roll >= 56 && roll <= 58) { - output2 = 'Vice Versa: The psyker’s mind is thrown out of his body and into another nearby creature or person. The psyker and a random being (note, this cannot be a daemon, untouchable or other “soulless” creature) within 50 metres swap consciousness for 1d10 rounds. This may be allies or enemies. Each creature retains its Weapon Skill, Ballistic Skill, Intelligence, Perception, Willpower and Fellowship during the swap, but all other Characteristics are of the new host body. If either body is slain, the effect ends immediately and both parties return to their original bodies. Both suffer 1d5 Intelligence Damage from the experience. If there are no creatures within range, the psyker becomes catatonic for 1d5 rounds while his mind wanders the warp. This journey causes 1d10 Willpower Damage, 1d10 Intelligence Damage and 1d10 Corruption Points'; - } - else if (roll >= 59 && roll <= 67) { - output2 = 'Dark Summoning: Khorne’s wrath swells at the arrogance of the psyker, and he sends a Bloodletter to deal with the fool. (see Chapter XI: Adversaries) The Bloodletter rips into existence within 3d10 metres of the psyker, for a number of rounds equal to 1d5 plus the daemon’s Toughness Bonus. The psyker’s turn immediately ends, and the Daemon may take its turn immediately. It detests the psyker and focuses all of its attacks upon the fool that unwittingly summoned it. It will not attack anyone else, even if others attack it'; - } - else if (roll >= 68 && roll <= 72) { - output2 = 'Rending the Veil: The air vibrates with images of cackling daemons and the kaleidoscopic taint of the warp is rendered visible. All sentient creatures (any creature with an Intelligence characteristic) within 1d100 metres must test against Fear (2). The psyker must Test against Fear (4) instead. This effect lasts for 1d5 rounds'; - } - else if (roll >= 73 && roll <= 78) { - output2 = 'Blood Rain: A psychic storm erupts, covering an area of 5d10 metres in which everyone must pass a Challenging (+0) Strength Test or be knocked to the ground. In addition to howling winds and the skies raining blood, any psychic powers used in the area automatically invoke Perils of the Warp for 1d5 rounds, in addition to any Psychic Phenomena those powers cause. The psyker gains 1d5+1 Corruption Points'; - } - else if (roll >= 79 && roll <= 82) { - output2 = 'Cataclysmic Blast: The psyker’s power overloads, arcing out in great bolts of warp energy. Anyone within 1d10 metres (including the psyker) takes 1d10+8 Energy Damage with a Pen of 5. The psyker may not Dodge this, or stop the attack with a Field Save. In addition, all of the psyker’s clothing and gear is destroyed, leaving him naked and smoking on the ground. The psyker may use no further powers for 1d5 hours after the event'; - } - else if (roll >= 83 && roll <= 86) { - output2 = 'Mass Possession: Daemons ravage the mind of every living thing within 1d100 metres. Every character in the area must resist a possession attack (see the Possession Trait in Chapter IV: Talents and Traits; the attacker is a random Lesser Daemon). This possession will last for no more than 2d10 rounds, after which the daemons are cast back into the warp'; - } - else if (roll >= 87 && roll <= 90) { - output2 = 'Reality Quake: Reality buckles around the psyker, and an area radiating out 3d10 metres from him is sundered: solid objects alternately rot, burn, and freeze, and everyone and everything in the area takes 2d10 Rending Damage, ignoring armour (and unable to be dodged). Warded objects, daemons and untouchables halve the Damage rolled'; - } - else if (roll >= 91 && roll <= 99) { - output2 = 'Grand Possession: A grand and terrible warp entity takes interest in the psyker’s soul, descending from the warp to seize the mortal’s body for its own purposes. A Greater Daemon chosen by the GM attempts to possess the psyker (see the Possession Trait in Chapter IV: Talents and Traits). Even if the daemon fails, the psyker still suffers 2d10 Toughness Damage, and will forever add +10 to all rolls on the Psychic Phenomena and Perils of the Warp tables as his body now serves as a conduit to the power of the warp. If the character dies while possessed, the Greater Daemon manifests in the real world for a number of days equal to its Toughness Bonus or until it is destroyed'; - } - else if (roll === 100) { - output2 = 'Annihilation: The psyker is immediately and irrevocably destroyed, burned to nothing by the screaming fi res of the Immaterium or dragged into the deepest maelstrom of the warp. The psyker may not spend Infamy to recover from this death, he is irrevocably destroyed. There is a chance that a daemonic entity of some sort appears in the psyker’s place— the type of daemon that appears is determined by the GM, based on how powerful the psyker was—more powerful psykers draw more powerful daemons. The percentage chance that the daemon appears is equal to the psyker’s Willpower characteristic (roll a d100, if the result is equal to or under the characteristic, the daemon appears)'; - } - else { - output2 = 'Unexpected value'; - } - //Return output - return output1 + '

' + output2; - }; - - processInlinerolls = function(msg) { - if (_.has(msg, 'inlinerolls')) { - return _.chain(msg.inlinerolls) - .reduce(function(previous, current, index) { - previous['$[[' + index + ']]'] = current.rolls.total || 0; - return previous; - },{}) - .reduce(function(previous, current, index) { - return previous.replace(index, current); - }, msg.content) - .value(); - } else { - return msg.content; - } - }; - - /** Interpret the chat commands. **/ - on('chat:message', function (msg) { - 'use strict'; - var cmdName = '!rollperiltable40k '; - if (msg.type === 'api' && msg.content.indexOf(cmdName) !== -1) { - let content = processInlinerolls(msg); - var paramArray = content.slice(cmdName.length).split(','); - if (paramArray.length !== 1) { - sendChat(msg.who, '/w ' + msg.who + ' You must specify only the token ' + - 'parameter for the !rollperiltable40k command. Do not use commas in the input zones.'); - } - else { - var result = rollResultForRollPsyTable40k(paramArray[0].trim()); - sendChat(msg.who, result); - } - } - }); +/** + * This script rolls a d100 and compares it to the Black Crusade Perils of the Warp table. + * + * The following commands is used: + * !rollperiltable40k [tokenName] + * + * This script is based on Jack D works, modified by Pixizz. +**/ + +//Rolls a d100, add the modifier and determine the peril based on the Black Crusade chart. + +var rollperiltable40k = rollperiltable40k || (function(){ + + var rollResultForRollPsyTable40k = function (token) { + var roll = randomInteger(100); + var output1 = token + ' rolled a ' + roll + ' on the Perils of the Warp Table'; + var output2; + //Form output message based on roll + if (roll <= 5) { + output2 = 'The Gibbering: The psyker screams in pain as uncontrolled warp energies surge through his unprepared mind. He must make a Challenging (+0) Willpower Test or be stunned for 1d5 rounds'; + } + else if (roll >= 6 && roll <= 9) { + output2 = 'Warp Burn: A violent burst of energy from the warp smashes into the psyker’s mind, sending him reeling. He suffers 2d5 wounds, ignoring Toughness Bonus and Armour, and is stunned for 1d5 Rounds'; + } + else if (roll >= 10 && roll <= 13) { + output2 = 'Psychic Concussion: With a crack of energy, the psyker is knocked unconscious for 1d5 rounds, and everyone within 3d10 metres must make a Routine (+10) Willpower Test or be Stunned for one round'; + } + else if (roll >= 14 && roll <= 18) { + output2 = 'Psy Blast: There is an explosion of power and the psyker is thrown 3d10 metres into the air, falling to the ground moments later (see page 257 for Falling Damage)'; + } + else if (roll >= 19 && roll <= 24) { + output2 = 'Soul Sear: Warp power courses through the psyker’s body, scorching his soul. The psyker cannot use any powers for the next hour and gains 2d5 Corruption Points'; + } + else if (roll >= 25 && roll <= 30) { + output2 = 'Locked In: The power cages the psyker’s mind in an ethereal prison, tormented by visions of the warp. The psyker falls to the ground in a catatonic state. Each round thereafter, he must spend a full action to make a Diffi cult (–10) Willpower Test. On a success, his mind is freed and restored to his body, haunted by his experiences but otherwise unharmed'; + } + else if (roll >= 31 && roll <= 38) { + output2 = 'Chronological Incontinence: Time warps around the psyker. He winks out of existence and reappears in 1d10 rounds (for one minute in narrative time) in the exact location. He suffers one point of permanent Toughness and Intelligence damage as his body and mind rebel against the experience, and gains 1d5 Corruption Points'; + } + else if (roll >= 39 && roll <= 46) { + output2 = 'Psychic Mirror: The psyker’s power is turned back on him. Resolve the power’s effects, but the power targets the psyker instead. If the power is beneficial, it deals 1d10+5 Energy Damage (ignoring armour) to the psyker instead of its normal effect'; + } + else if (roll >= 47 && roll <= 55) { + output2 = 'Warp Whispers: The voices of daemons fill the air within 4d10 metres of the psyker, whispering terrible secrets and shocking truths. Everyone in the area (including the psyker ) must make a Hard (–20) Willpower Test or suffer 1d5 Corruption Points and an equal amount of Willpower Damage. In addition, whether or not the psyker passes the Willpower Test, he still suffers an additional 1d5+5 Willpower Damage'; + } + else if (roll >= 56 && roll <= 58) { + output2 = 'Vice Versa: The psyker’s mind is thrown out of his body and into another nearby creature or person. The psyker and a random being (note, this cannot be a daemon, untouchable or other “soulless” creature) within 50 metres swap consciousness for 1d10 rounds. This may be allies or enemies. Each creature retains its Weapon Skill, Ballistic Skill, Intelligence, Perception, Willpower and Fellowship during the swap, but all other Characteristics are of the new host body. If either body is slain, the effect ends immediately and both parties return to their original bodies. Both suffer 1d5 Intelligence Damage from the experience. If there are no creatures within range, the psyker becomes catatonic for 1d5 rounds while his mind wanders the warp. This journey causes 1d10 Willpower Damage, 1d10 Intelligence Damage and 1d10 Corruption Points'; + } + else if (roll >= 59 && roll <= 67) { + output2 = 'Dark Summoning: Khorne’s wrath swells at the arrogance of the psyker, and he sends a Bloodletter to deal with the fool. (see Chapter XI: Adversaries) The Bloodletter rips into existence within 3d10 metres of the psyker, for a number of rounds equal to 1d5 plus the daemon’s Toughness Bonus. The psyker’s turn immediately ends, and the Daemon may take its turn immediately. It detests the psyker and focuses all of its attacks upon the fool that unwittingly summoned it. It will not attack anyone else, even if others attack it'; + } + else if (roll >= 68 && roll <= 72) { + output2 = 'Rending the Veil: The air vibrates with images of cackling daemons and the kaleidoscopic taint of the warp is rendered visible. All sentient creatures (any creature with an Intelligence characteristic) within 1d100 metres must test against Fear (2). The psyker must Test against Fear (4) instead. This effect lasts for 1d5 rounds'; + } + else if (roll >= 73 && roll <= 78) { + output2 = 'Blood Rain: A psychic storm erupts, covering an area of 5d10 metres in which everyone must pass a Challenging (+0) Strength Test or be knocked to the ground. In addition to howling winds and the skies raining blood, any psychic powers used in the area automatically invoke Perils of the Warp for 1d5 rounds, in addition to any Psychic Phenomena those powers cause. The psyker gains 1d5+1 Corruption Points'; + } + else if (roll >= 79 && roll <= 82) { + output2 = 'Cataclysmic Blast: The psyker’s power overloads, arcing out in great bolts of warp energy. Anyone within 1d10 metres (including the psyker) takes 1d10+8 Energy Damage with a Pen of 5. The psyker may not Dodge this, or stop the attack with a Field Save. In addition, all of the psyker’s clothing and gear is destroyed, leaving him naked and smoking on the ground. The psyker may use no further powers for 1d5 hours after the event'; + } + else if (roll >= 83 && roll <= 86) { + output2 = 'Mass Possession: Daemons ravage the mind of every living thing within 1d100 metres. Every character in the area must resist a possession attack (see the Possession Trait in Chapter IV: Talents and Traits; the attacker is a random Lesser Daemon). This possession will last for no more than 2d10 rounds, after which the daemons are cast back into the warp'; + } + else if (roll >= 87 && roll <= 90) { + output2 = 'Reality Quake: Reality buckles around the psyker, and an area radiating out 3d10 metres from him is sundered: solid objects alternately rot, burn, and freeze, and everyone and everything in the area takes 2d10 Rending Damage, ignoring armour (and unable to be dodged). Warded objects, daemons and untouchables halve the Damage rolled'; + } + else if (roll >= 91 && roll <= 99) { + output2 = 'Grand Possession: A grand and terrible warp entity takes interest in the psyker’s soul, descending from the warp to seize the mortal’s body for its own purposes. A Greater Daemon chosen by the GM attempts to possess the psyker (see the Possession Trait in Chapter IV: Talents and Traits). Even if the daemon fails, the psyker still suffers 2d10 Toughness Damage, and will forever add +10 to all rolls on the Psychic Phenomena and Perils of the Warp tables as his body now serves as a conduit to the power of the warp. If the character dies while possessed, the Greater Daemon manifests in the real world for a number of days equal to its Toughness Bonus or until it is destroyed'; + } + else if (roll === 100) { + output2 = 'Annihilation: The psyker is immediately and irrevocably destroyed, burned to nothing by the screaming fi res of the Immaterium or dragged into the deepest maelstrom of the warp. The psyker may not spend Infamy to recover from this death, he is irrevocably destroyed. There is a chance that a daemonic entity of some sort appears in the psyker’s place— the type of daemon that appears is determined by the GM, based on how powerful the psyker was—more powerful psykers draw more powerful daemons. The percentage chance that the daemon appears is equal to the psyker’s Willpower characteristic (roll a d100, if the result is equal to or under the characteristic, the daemon appears)'; + } + else { + output2 = 'Unexpected value'; + } + //Return output + return output1 + '

' + output2; + }; + + processInlinerolls = function(msg) { + if (_.has(msg, 'inlinerolls')) { + return _.chain(msg.inlinerolls) + .reduce(function(previous, current, index) { + previous['$[[' + index + ']]'] = current.rolls.total || 0; + return previous; + },{}) + .reduce(function(previous, current, index) { + return previous.replace(index, current); + }, msg.content) + .value(); + } else { + return msg.content; + } + }; + + /** Interpret the chat commands. **/ + on('chat:message', function (msg) { + 'use strict'; + var cmdName = '!rollperiltable40k '; + if (msg.type === 'api' && msg.content.indexOf(cmdName) !== -1) { + let content = processInlinerolls(msg); + var paramArray = content.slice(cmdName.length).split(','); + if (paramArray.length !== 1) { + sendChat(msg.who, '/w ' + msg.who + ' You must specify only the token ' + + 'parameter for the !rollperiltable40k command. Do not use commas in the input zones.'); + } + else { + var result = rollResultForRollPsyTable40k(paramArray[0].trim()); + sendChat(msg.who, result); + } + } + }); }()) \ No newline at end of file diff --git a/Black Crusade Advanced API/scripts/PsyTable.js b/Black Crusade Advanced API/scripts/PsyTable.js index 8555754993..a9242b2634 100644 --- a/Black Crusade Advanced API/scripts/PsyTable.js +++ b/Black Crusade Advanced API/scripts/PsyTable.js @@ -1,135 +1,135 @@ -/** - * This script rolls a d100, add a modifier and computes a result compared to the the Black Crusade Psychic Phenomena table. - * - * The following commands is used: - * !rollpsytable40k [tokenName], [ModifierValue] - * - * This script is based on Jack D works, modified by Pixizz. -**/ - -//Rolls a d100, add the modifier and determine the phenomenon based on the Black Crusade chart. - -var rollpsytable40k = rollpsytable40k || (function(){ - - var rollResultForRollPsyTable40k = function (token, modifier) { - var roll = randomInteger(100); - var output1 = token + ' rolled a ' + roll + ' with a modifier of ' + modifier + ' on the Psychic Phenomena Table'; - var result = roll + parseInt(modifier); - var output2; - //Form output message based on result - if (result <= 3) { - output2 = 'Dark Foreboding: A faint breeze blows past the sorcerer and those near him, and everyone gets the feeling that somewhere in the galaxy something unfortunate just happened'; - } - else if (result >= 4 && result <= 5) { - output2 = 'Warp Echo: For a few moments, all noises cause echoes, regardless of the surroundings'; - } - else if (result >= 6 && result <= 8) { - output2 = 'Unholy Stench: The air around the psyker becomes permeated with a bizarre and foul smell'; - } - else if (result >= 9 && result <= 11) { - output2 = 'Mind Warp: The psyker suffers a –5 penalty to Willpower Tests until the start of his next turn as his own inherent phobias, suspicions and hatreds surge to the surface of his mind in a wave of unbound emotion'; - } - else if (result >= 12 && result <= 14) { - output2 = 'Hoarfrost: The temperature plummets for an instant, and a thin coating of frost covers everything within 3d10 metres'; - } - else if (result >= 15 && result <= 17) { - output2 = 'Aura of Taint: All animals within 1d100 metres become spooked and agitated; Characters with Psyniscience can pinpoint the psyker as the cause'; - } - else if (result >= 18 && result <= 20) { - output2 = 'Memory Worm: All people within line of sight of the psyker forget something trivial'; - } - else if (result >= 21 && result <= 23) { - output2 = 'Spoilage: Food and drink go bad in a 5d10 metre radius'; - } - else if (result >= 24 && result <= 26) { - output2 = 'Haunting Breeze: Winds whip up around the psyker for a few moments, blowing light objects around and guttering fires within 3d10 metres'; - } - else if (result >= 27 && result <= 29) { - output2 = 'Veil of Darkness: For a brief moment (effectively the remainder of the round), the area within 3d10 metres is plunged into immediate darkness'; - } - else if (result >= 30 && result <= 32) { - output2 = 'Breath Leech: Everyone (including the psyker) within a 3d10 metre radius becomes short of breath for one round and cannot make any Run or Charge actions'; - } - else if (result >= 33 && result <= 35) { - output2 = 'Distorted Reflections: Mirrors and other reflective surfaces within a radius of 5d10 metres distort or shatter'; - } - else if (result >= 36 && result <= 38) { - output2 = 'Daemonic Mask: For a fleeting moment, the psyker takes on a daemonic appearance and gains a Fear rating of 1 until the start of the next turn. However, he also gains one Corruption Point'; - } - else if (result >= 39 && result <= 41) { - output2 = 'Unnatural Decay: All plant life within 3d10 metres of the psyker withers and dies'; - } - else if (result >= 42 && result <= 44) { - output2 = 'Spectral Gale: Howling winds erupt around the psyker, requiring him and everyone within 4d10 metres to make an Easy (+30) Agility or Strength Test to avoid being knocked to the ground'; - } - else if (result >= 45 && result <= 47) { - output2 = 'Bloody Tears: Blood weeps from stone and wood within 3d10 metres of the psyker. If there are any pictures or statues of people inside this area, they appear to be crying blood'; - } - else if (result >= 48 && result <= 50) { - output2 = 'The Earth Protests: The ground suddenly shakes, and everyone (including the psyker) within a 5d10 metre radius must make a Routine (+10) Agility Test or be knocked down'; - } - else if (result >= 51 && result <= 53) { - output2 = 'Actinic Discharge: Static electricity fills the air within 5d10 metres causing hair to stand on end and unprotected electronics to short out, while the psyker is wreathed in eldritch lightning'; - } - else if (result >= 54 && result <= 56) { - output2 = 'Warp Ghosts: Ghostly apparitions fill the air within 3d10 metres around the psyker, flying about and howling in pain for a few brief moments. Everyone in the radius (except the psyker himself) must test against a Fear rating of 1'; - } - else if (result >= 57 && result <= 59) { - output2 = 'Falling Upwards: Everything within 2d10 metres of the psyker (including the psyker himself) rises 1d10 metres into the air as gravity briefl y ceases. Almost immediately, everything crashes back to earth, suffering falling Damage as appropriate for the distances fallen'; - } - else if (result >= 60 && result <= 62) { - output2 = 'Banshee Howl: A shrill keening rings out across the immediate area, shattering glass and forcing every mortal creature able to hear it (including the psyker) to pass a Challenging (+0) Toughness Test or be deafened for 1d10 rounds'; - } - else if (result >= 63 && result <= 65) { - output2 = 'The Furies: The Psyker is assailed by unseen horrors. He is slammed to the ground and suffers 1d5 wounds in Damage (ignoring armour, but not Toughness Bonus) and he must test against Fear (2)'; - } - else if (result >= 66 && result <= 68) { - output2 = 'Shadow of the Warp: For a split second, the world changes in appearance, and everyone within 1d100 metres has brief but horrific glimpse of the shadow of the warp. Everyone in the area (including the psyker) must make a Difficult (–10) Willpower Test or gain 1d5 Corruption Points'; - } - else if (result >= 69 && result <= 71) { - output2 = 'Tech Scorn: The machine spirits reject your unnatural ways. All un-warded technology within 5d10 metres malfunction momentarily, and all ranged weapons Jam (see Chapter I: Playing the Game), whilst characters with cybernetic implants must pass a Routine (+10) Toughness Test or suffer 1d5 Damage, ignoring Toughness Bonus and Armour'; - } - else if (result >= 72 && result <= 74) { - output2 = 'Warp Madness: A violent ripple of tainted discord causes all creatures within 2d10 metres (with the exception of the Psyker) to become Frenzied for a Round and suffer 1d5 Corruption Points unless they can pass a Diffi cult (–10) Willpower Test'; - } - else { - output2 = 'Perils of the Warp: The warp opens in a maelstrom of energy. Roll Perils of the Warp instead.'; - } - //Return output - return output1 + '

' + output2; - }; - - processInlinerolls = function(msg) { - if (_.has(msg, 'inlinerolls')) { - return _.chain(msg.inlinerolls) - .reduce(function(previous, current, index) { - previous['$[[' + index + ']]'] = current.results.total || 0; - return previous; - },{}) - .reduce(function(previous, current, index) { - return previous.replace(index, current); - }, msg.content) - .value(); - } else { - return msg.content; - } - }; - - /** Interpret the chat commands. **/ - on('chat:message', function (msg) { - 'use strict'; - var cmdName = '!rollpsytable40k '; - if (msg.type === 'api' && msg.content.indexOf(cmdName) !== -1) { - let content = processInlinerolls(msg); - var paramArray = content.slice(cmdName.length).split(','); - if (paramArray.length !== 2) { - sendChat(msg.who, '/w ' + msg.who + ' You must specify two comma-separated ' + - 'parameters for the !rollpsytable40k command. Do not use commas in the input zones.'); - } - else { - var result = rollResultForRollPsyTable40k(paramArray[0].trim(), paramArray[1].trim()); - sendChat(msg.who, result); - } - } - }); +/** + * This script rolls a d100, add a modifier and computes a result compared to the the Black Crusade Psychic Phenomena table. + * + * The following commands is used: + * !rollpsytable40k [tokenName], [ModifierValue] + * + * This script is based on Jack D works, modified by Pixizz. +**/ + +//Rolls a d100, add the modifier and determine the phenomenon based on the Black Crusade chart. + +var rollpsytable40k = rollpsytable40k || (function(){ + + var rollResultForRollPsyTable40k = function (token, modifier) { + var roll = randomInteger(100); + var output1 = token + ' rolled a ' + roll + ' with a modifier of ' + modifier + ' on the Psychic Phenomena Table'; + var result = roll + parseInt(modifier); + var output2; + //Form output message based on result + if (result <= 3) { + output2 = 'Dark Foreboding: A faint breeze blows past the sorcerer and those near him, and everyone gets the feeling that somewhere in the galaxy something unfortunate just happened'; + } + else if (result >= 4 && result <= 5) { + output2 = 'Warp Echo: For a few moments, all noises cause echoes, regardless of the surroundings'; + } + else if (result >= 6 && result <= 8) { + output2 = 'Unholy Stench: The air around the psyker becomes permeated with a bizarre and foul smell'; + } + else if (result >= 9 && result <= 11) { + output2 = 'Mind Warp: The psyker suffers a –5 penalty to Willpower Tests until the start of his next turn as his own inherent phobias, suspicions and hatreds surge to the surface of his mind in a wave of unbound emotion'; + } + else if (result >= 12 && result <= 14) { + output2 = 'Hoarfrost: The temperature plummets for an instant, and a thin coating of frost covers everything within 3d10 metres'; + } + else if (result >= 15 && result <= 17) { + output2 = 'Aura of Taint: All animals within 1d100 metres become spooked and agitated; Characters with Psyniscience can pinpoint the psyker as the cause'; + } + else if (result >= 18 && result <= 20) { + output2 = 'Memory Worm: All people within line of sight of the psyker forget something trivial'; + } + else if (result >= 21 && result <= 23) { + output2 = 'Spoilage: Food and drink go bad in a 5d10 metre radius'; + } + else if (result >= 24 && result <= 26) { + output2 = 'Haunting Breeze: Winds whip up around the psyker for a few moments, blowing light objects around and guttering fires within 3d10 metres'; + } + else if (result >= 27 && result <= 29) { + output2 = 'Veil of Darkness: For a brief moment (effectively the remainder of the round), the area within 3d10 metres is plunged into immediate darkness'; + } + else if (result >= 30 && result <= 32) { + output2 = 'Breath Leech: Everyone (including the psyker) within a 3d10 metre radius becomes short of breath for one round and cannot make any Run or Charge actions'; + } + else if (result >= 33 && result <= 35) { + output2 = 'Distorted Reflections: Mirrors and other reflective surfaces within a radius of 5d10 metres distort or shatter'; + } + else if (result >= 36 && result <= 38) { + output2 = 'Daemonic Mask: For a fleeting moment, the psyker takes on a daemonic appearance and gains a Fear rating of 1 until the start of the next turn. However, he also gains one Corruption Point'; + } + else if (result >= 39 && result <= 41) { + output2 = 'Unnatural Decay: All plant life within 3d10 metres of the psyker withers and dies'; + } + else if (result >= 42 && result <= 44) { + output2 = 'Spectral Gale: Howling winds erupt around the psyker, requiring him and everyone within 4d10 metres to make an Easy (+30) Agility or Strength Test to avoid being knocked to the ground'; + } + else if (result >= 45 && result <= 47) { + output2 = 'Bloody Tears: Blood weeps from stone and wood within 3d10 metres of the psyker. If there are any pictures or statues of people inside this area, they appear to be crying blood'; + } + else if (result >= 48 && result <= 50) { + output2 = 'The Earth Protests: The ground suddenly shakes, and everyone (including the psyker) within a 5d10 metre radius must make a Routine (+10) Agility Test or be knocked down'; + } + else if (result >= 51 && result <= 53) { + output2 = 'Actinic Discharge: Static electricity fills the air within 5d10 metres causing hair to stand on end and unprotected electronics to short out, while the psyker is wreathed in eldritch lightning'; + } + else if (result >= 54 && result <= 56) { + output2 = 'Warp Ghosts: Ghostly apparitions fill the air within 3d10 metres around the psyker, flying about and howling in pain for a few brief moments. Everyone in the radius (except the psyker himself) must test against a Fear rating of 1'; + } + else if (result >= 57 && result <= 59) { + output2 = 'Falling Upwards: Everything within 2d10 metres of the psyker (including the psyker himself) rises 1d10 metres into the air as gravity briefl y ceases. Almost immediately, everything crashes back to earth, suffering falling Damage as appropriate for the distances fallen'; + } + else if (result >= 60 && result <= 62) { + output2 = 'Banshee Howl: A shrill keening rings out across the immediate area, shattering glass and forcing every mortal creature able to hear it (including the psyker) to pass a Challenging (+0) Toughness Test or be deafened for 1d10 rounds'; + } + else if (result >= 63 && result <= 65) { + output2 = 'The Furies: The Psyker is assailed by unseen horrors. He is slammed to the ground and suffers 1d5 wounds in Damage (ignoring armour, but not Toughness Bonus) and he must test against Fear (2)'; + } + else if (result >= 66 && result <= 68) { + output2 = 'Shadow of the Warp: For a split second, the world changes in appearance, and everyone within 1d100 metres has brief but horrific glimpse of the shadow of the warp. Everyone in the area (including the psyker) must make a Difficult (–10) Willpower Test or gain 1d5 Corruption Points'; + } + else if (result >= 69 && result <= 71) { + output2 = 'Tech Scorn: The machine spirits reject your unnatural ways. All un-warded technology within 5d10 metres malfunction momentarily, and all ranged weapons Jam (see Chapter I: Playing the Game), whilst characters with cybernetic implants must pass a Routine (+10) Toughness Test or suffer 1d5 Damage, ignoring Toughness Bonus and Armour'; + } + else if (result >= 72 && result <= 74) { + output2 = 'Warp Madness: A violent ripple of tainted discord causes all creatures within 2d10 metres (with the exception of the Psyker) to become Frenzied for a Round and suffer 1d5 Corruption Points unless they can pass a Diffi cult (–10) Willpower Test'; + } + else { + output2 = 'Perils of the Warp: The warp opens in a maelstrom of energy. Roll Perils of the Warp instead.'; + } + //Return output + return output1 + '

' + output2; + }; + + processInlinerolls = function(msg) { + if (_.has(msg, 'inlinerolls')) { + return _.chain(msg.inlinerolls) + .reduce(function(previous, current, index) { + previous['$[[' + index + ']]'] = current.results.total || 0; + return previous; + },{}) + .reduce(function(previous, current, index) { + return previous.replace(index, current); + }, msg.content) + .value(); + } else { + return msg.content; + } + }; + + /** Interpret the chat commands. **/ + on('chat:message', function (msg) { + 'use strict'; + var cmdName = '!rollpsytable40k '; + if (msg.type === 'api' && msg.content.indexOf(cmdName) !== -1) { + let content = processInlinerolls(msg); + var paramArray = content.slice(cmdName.length).split(','); + if (paramArray.length !== 2) { + sendChat(msg.who, '/w ' + msg.who + ' You must specify two comma-separated ' + + 'parameters for the !rollpsytable40k command. Do not use commas in the input zones.'); + } + else { + var result = rollResultForRollPsyTable40k(paramArray[0].trim(), paramArray[1].trim()); + sendChat(msg.who, result); + } + } + }); }()) \ No newline at end of file diff --git a/Black Crusade Advanced API/scripts/WeaponScriptBC.js b/Black Crusade Advanced API/scripts/WeaponScriptBC.js index 309082e3a3..7195d3b1e7 100644 --- a/Black Crusade Advanced API/scripts/WeaponScriptBC.js +++ b/Black Crusade Advanced API/scripts/WeaponScriptBC.js @@ -1,100 +1,100 @@ -/** - * This script rolls a d100 and computes and outputs the success results based - * originally on Dark Heresy Second Edition RPG criteria and now Black Crusade RPG criteria. - * - * The following commands is used: - * !roll40k [tokenName], [attributeValue], [unnaturalAttributeValue], [ModifierValue] - * - * This script was written by Jack D on Roll20 Forums at https://app.roll20.net/forum/post/4607859/help-dark-heresy-2nd-edition-api - * and later modified by Pixizz for Black Crusade. -**/ - -//Rolls a d100 and calculates the success or fail results to the chat window. -var roll40k = roll40k || (function(){ - - /** determine Hit Location from the roll value. **/ - determineLocation = function(roll) { - var hitLocation; - if (roll === 10 || roll === 20 || roll === 30 || roll === 40 || roll === 50 || roll === 60 || roll === 70 || roll === 80 || roll === 90) { - hitLocation = ' (Head)'; - } - else if (roll === 11 || roll === 21 || roll === 31 || roll === 41 || roll === 51 || roll === 61 || roll === 71 || roll === 81 || roll === 91 || roll === 2) { - hitLocation = ' (Right Arm)'; - } - else if (roll === 12 || roll === 22 || roll === 32 || roll === 42 || roll === 52 || roll === 62 || roll === 72 || roll === 82 || roll === 92 || roll === 3) { - hitLocation = ' (Left Arm)'; - } - else if (roll === 13 || roll === 23 || roll === 33 || roll === 43 || roll === 53 || roll === 63 || roll === 73 || roll === 83 || roll === 93 || roll === 4 || roll === 14 || roll === 24 || roll === 34 || roll === 44 || roll === 54 || roll === 64 || roll === 74 || roll === 84 || roll === 94 || roll === 5 || roll === 15 || roll === 25 || roll === 35 || roll === 45 || roll === 55 || roll === 65 || roll === 75 || roll === 85 || roll === 95 || roll === 6 || roll === 16 || roll === 26 || roll === 36 || roll === 46 || roll === 56 || roll === 66 || roll === 76 || roll === 86 || roll === 96 || roll === 7) { - hitLocation = ' (Body)'; - } - else if (roll === 17 || roll === 27 || roll === 37 || roll === 47 || roll === 57 || roll === 67 || roll === 77 || roll === 87 || roll === 97 || roll === 8 || roll === 18 || roll === 28 || roll === 38 || roll === 48 || roll === 58) { - hitLocation = ' (Right Leg)'; - } - else { - hitLocation = ' (Left Leg)'; - } - // return hit location. - return hitLocation; - }; - - var rollResultForRoll40k = function (token, attribute, unAttribute, modifier) { - var roll = randomInteger(100); - var modTarget = parseInt(attribute) + parseInt(modifier); - var output1, output2, degOfSuc; - //Form output message based on result - if (roll === 1) { - output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + '. '; - output2 = '' + token + ' rolled a 1 (Head) and automatically succeeds by 1 degree.'; - } - else if (roll === 100) { - output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + '. '; - output2 = '' + token + ' rolled a 100 and automatically fails by 1 degree.'; - } - else if (roll <= modTarget) { - degOfSuc = (Math.floor(modTarget / 10) - Math.floor(roll / 10)) + 1 + parseInt(unAttribute); - output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + determineLocation(roll) + '. '; - output2 = '' + token + ' succeeds by ' + degOfSuc + ' degree(s).'; - } - else { - degOfSuc = (Math.floor(roll / 10) - Math.floor(modTarget / 10)) + 1; - output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + '. '; - output2 = '' + token + ' fails by ' + degOfSuc + ' degree(s).'; - } - //Return output - return output1 + '

' + output2; - }, - - processInlinerolls = function(msg) { - if (_.has(msg, 'inlinerolls')) { - return _.chain(msg.inlinerolls) - .reduce(function(previous, current, index) { - previous['$[[' + index + ']]'] = current.results.total || 0; - return previous; - },{}) - .reduce(function(previous, current, index) { - return previous.replace(index, current); - }, msg.content) - .value(); - } else { - return msg.content; - } - }; - - /** Interpret the chat commands. **/ - on('chat:message', function (msg) { - 'use strict'; - var cmdName = '!roll40k '; - if (msg.type === 'api' && msg.content.indexOf(cmdName) !== -1) { - let content = processInlinerolls(msg); - var paramArray = content.slice(cmdName.length).split(','); - if (paramArray.length !== 4) { - sendChat(msg.who, '/w ' + msg.who + ' You must specify four comma-separated ' + - 'parameters for the !roll40k command. Do not use commas in the input zones.'); - } - else { - var result = rollResultForRoll40k(paramArray[0].trim(), paramArray[1].trim(), paramArray[2].trim(), paramArray[3].trim()); - sendChat(msg.who, result); - } - } - }); +/** + * This script rolls a d100 and computes and outputs the success results based + * originally on Dark Heresy Second Edition RPG criteria and now Black Crusade RPG criteria. + * + * The following commands is used: + * !roll40k [tokenName], [attributeValue], [unnaturalAttributeValue], [ModifierValue] + * + * This script was written by Jack D on Roll20 Forums at https://app.roll20.net/forum/post/4607859/help-dark-heresy-2nd-edition-api + * and later modified by Pixizz for Black Crusade. +**/ + +//Rolls a d100 and calculates the success or fail results to the chat window. +var roll40k = roll40k || (function(){ + + /** determine Hit Location from the roll value. **/ + determineLocation = function(roll) { + var hitLocation; + if (roll === 10 || roll === 20 || roll === 30 || roll === 40 || roll === 50 || roll === 60 || roll === 70 || roll === 80 || roll === 90) { + hitLocation = ' (Head)'; + } + else if (roll === 11 || roll === 21 || roll === 31 || roll === 41 || roll === 51 || roll === 61 || roll === 71 || roll === 81 || roll === 91 || roll === 2) { + hitLocation = ' (Right Arm)'; + } + else if (roll === 12 || roll === 22 || roll === 32 || roll === 42 || roll === 52 || roll === 62 || roll === 72 || roll === 82 || roll === 92 || roll === 3) { + hitLocation = ' (Left Arm)'; + } + else if (roll === 13 || roll === 23 || roll === 33 || roll === 43 || roll === 53 || roll === 63 || roll === 73 || roll === 83 || roll === 93 || roll === 4 || roll === 14 || roll === 24 || roll === 34 || roll === 44 || roll === 54 || roll === 64 || roll === 74 || roll === 84 || roll === 94 || roll === 5 || roll === 15 || roll === 25 || roll === 35 || roll === 45 || roll === 55 || roll === 65 || roll === 75 || roll === 85 || roll === 95 || roll === 6 || roll === 16 || roll === 26 || roll === 36 || roll === 46 || roll === 56 || roll === 66 || roll === 76 || roll === 86 || roll === 96 || roll === 7) { + hitLocation = ' (Body)'; + } + else if (roll === 17 || roll === 27 || roll === 37 || roll === 47 || roll === 57 || roll === 67 || roll === 77 || roll === 87 || roll === 97 || roll === 8 || roll === 18 || roll === 28 || roll === 38 || roll === 48 || roll === 58) { + hitLocation = ' (Right Leg)'; + } + else { + hitLocation = ' (Left Leg)'; + } + // return hit location. + return hitLocation; + }; + + var rollResultForRoll40k = function (token, attribute, unAttribute, modifier) { + var roll = randomInteger(100); + var modTarget = parseInt(attribute) + parseInt(modifier); + var output1, output2, degOfSuc; + //Form output message based on result + if (roll === 1) { + output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + '. '; + output2 = '' + token + ' rolled a 1 (Head) and automatically succeeds by 1 degree.'; + } + else if (roll === 100) { + output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + '. '; + output2 = '' + token + ' rolled a 100 and automatically fails by 1 degree.'; + } + else if (roll <= modTarget) { + degOfSuc = (Math.floor(modTarget / 10) - Math.floor(roll / 10)) + 1 + parseInt(unAttribute); + output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + determineLocation(roll) + '. '; + output2 = '' + token + ' succeeds by ' + degOfSuc + ' degree(s).'; + } + else { + degOfSuc = (Math.floor(roll / 10) - Math.floor(modTarget / 10)) + 1; + output1 = token + ' has a modified target of ' + modTarget + ' and rolled a ' + roll + '. '; + output2 = '' + token + ' fails by ' + degOfSuc + ' degree(s).'; + } + //Return output + return output1 + '

' + output2; + }, + + processInlinerolls = function(msg) { + if (_.has(msg, 'inlinerolls')) { + return _.chain(msg.inlinerolls) + .reduce(function(previous, current, index) { + previous['$[[' + index + ']]'] = current.results.total || 0; + return previous; + },{}) + .reduce(function(previous, current, index) { + return previous.replace(index, current); + }, msg.content) + .value(); + } else { + return msg.content; + } + }; + + /** Interpret the chat commands. **/ + on('chat:message', function (msg) { + 'use strict'; + var cmdName = '!roll40k '; + if (msg.type === 'api' && msg.content.indexOf(cmdName) !== -1) { + let content = processInlinerolls(msg); + var paramArray = content.slice(cmdName.length).split(','); + if (paramArray.length !== 4) { + sendChat(msg.who, '/w ' + msg.who + ' You must specify four comma-separated ' + + 'parameters for the !roll40k command. Do not use commas in the input zones.'); + } + else { + var result = rollResultForRoll40k(paramArray[0].trim(), paramArray[1].trim(), paramArray[2].trim(), paramArray[3].trim()); + sendChat(msg.who, result); + } + } + }); }()) \ No newline at end of file diff --git a/Black Void by Penny for a Tale/src/js/scripts.js b/Black Void by Penny for a Tale/src/js/scripts.js index 4f57f26f5e..b9edc45b3d 100644 --- a/Black Void by Penny for a Tale/src/js/scripts.js +++ b/Black Void by Penny for a Tale/src/js/scripts.js @@ -1,58 +1,58 @@ -//Convert Integers to be Negative -const convertIntegerNegative = number => number > 0 ? -Math.abs(number) : number - -//Convert an object with negative numbers -const convertIntegersNegatives = numbers => { - numbers => { - for (let [key, value] of Object.entries(numbers)) { - numbers[key] = convertIntegerNegative(value); - } - return numbers - } -} - -//Pass in eventinfo.triggerName -const findRepeatingField = trigger => trigger.split('_')[1] - -//Pass in eventinfo.triggerName -const getReprowid = trigger => { - const split = trigger.split('_'); - return `${split[0]}_${split[1]}_${split[2]}` -} - -//Pass in an object keep that has the repeating section -//Example repeating_weapon_-m1czg68yzicwhfdpyys_name -const getReprowAttribute = key => { - const getReprowid = processingFunctions.getReprowid(key) - return key.split(`${getReprowid}_`)[1] -} - -//Provide the function with an array of keys to find transations for -//Example ['strenght', 'agility', 'willpower'] -const getTranslations = translationKeys => { - let translations = {} - translationKeys.forEach(key => translations[`${key}`] = getTranslationByKey(key)) - return translations -} - -const parseInteger = string => parseInt(string) || 0 - -//Use for convernting the result of getAttrs from strings into integers -const parseIntegers = numbers => { - for (let [key, value] of Object.entries(numbers)) { - numbers[key] = parseInt(value) || 0 - } - return numbers -} - -const setAttributes = (update, silent) => silent && typeof update === 'object' ? setAttrs(update, {silent:true}) : typeof update === 'object' ? setAttrs(update) : console.error(`${update} is not an object`) - -//returns strength from @{strenght} -const sliceAttr = attribute => attribute.slice(2, -1) - -const sumIntegers = numbers => numbers.reduce((a,b) => a + b, 0) - -//enable name edit - -on(`clicked:edit_npc_name`, eventInfo => setAttrs({npc_name_toggle:"on"})); +//Convert Integers to be Negative +const convertIntegerNegative = number => number > 0 ? -Math.abs(number) : number + +//Convert an object with negative numbers +const convertIntegersNegatives = numbers => { + numbers => { + for (let [key, value] of Object.entries(numbers)) { + numbers[key] = convertIntegerNegative(value); + } + return numbers + } +} + +//Pass in eventinfo.triggerName +const findRepeatingField = trigger => trigger.split('_')[1] + +//Pass in eventinfo.triggerName +const getReprowid = trigger => { + const split = trigger.split('_'); + return `${split[0]}_${split[1]}_${split[2]}` +} + +//Pass in an object keep that has the repeating section +//Example repeating_weapon_-m1czg68yzicwhfdpyys_name +const getReprowAttribute = key => { + const getReprowid = processingFunctions.getReprowid(key) + return key.split(`${getReprowid}_`)[1] +} + +//Provide the function with an array of keys to find transations for +//Example ['strenght', 'agility', 'willpower'] +const getTranslations = translationKeys => { + let translations = {} + translationKeys.forEach(key => translations[`${key}`] = getTranslationByKey(key)) + return translations +} + +const parseInteger = string => parseInt(string) || 0 + +//Use for convernting the result of getAttrs from strings into integers +const parseIntegers = numbers => { + for (let [key, value] of Object.entries(numbers)) { + numbers[key] = parseInt(value) || 0 + } + return numbers +} + +const setAttributes = (update, silent) => silent && typeof update === 'object' ? setAttrs(update, {silent:true}) : typeof update === 'object' ? setAttrs(update) : console.error(`${update} is not an object`) + +//returns strength from @{strenght} +const sliceAttr = attribute => attribute.slice(2, -1) + +const sumIntegers = numbers => numbers.reduce((a,b) => a + b, 0) + +//enable name edit + +on(`clicked:edit_npc_name`, eventInfo => setAttrs({npc_name_toggle:"on"})); on(`clicked:save_npc_name`, eventInfo => setAttrs({npc_name_toggle:"0"})); \ No newline at end of file diff --git a/Bunkers&Badasses/bnb.css b/Bunkers&Badasses/bnb.css index 8b68fb2298..8c51002399 100644 --- a/Bunkers&Badasses/bnb.css +++ b/Bunkers&Badasses/bnb.css @@ -1,185 +1,185 @@ -/* Set the min-width so that when the window is resized the look will stay consistant */ - .charsheet { - background-color: #fff; - min-width: 100%; - border-style:inset; -} - .charsheet label { - margin-top: 10px; -} -/* Universal styling applied to all elements of these types */ - h2 { - font-size: 2em; - text-align: center; - width: 100%; -} - label { - text-align: center !important; -} - img { - max-height: 100px; -} - .center { - padding-bottom: 10px; - text-align: center !important; - border-spacing: 10px !important; - background-color: antiquewhite !important; -} - .inputmargin { - text-align: center !important; - width: 100%; -} - .wide { - width: 45% !important; -} - .center2 { - padding-bottom: 10px; - text-align: center !important; - border-spacing: 10px !important; - background-color: antiquewhite !important; -} - .ui-dialog .charsheet { -} - .charsheet { - min-width: 80%; - max-width: 95%; - border-style: inset; - background-color: antiquewhite; -} - .option { - overflow-wrap: break-word; -} - div.sheet-hunter, div.sheet-stats, div.sheet-combat, div.sheet-weapons, div.sheet-skills, div.sheet-items, div.sheet-levels, div.sheet-feats, div.sheet-traits { - display: none; -} - input.sheet-tab1:unchecked ~ div.sheet-hunter { - display: none; -} - input.sheet-tab2:unchecked ~ div.sheet-stats { - display: none; -} - input.sheet-tab3:unchecked ~ div.sheet-combat { - display: none; -} - input.sheet-tab4:unchecked ~ div.sheet-weapons { - display: none; -} - input.sheet-tab5:unchecked ~ div.sheet-skills { - display: none; -} - input.sheet-tab6:unchecked ~ div.sheet-items { - display: none; -} - input.sheet-tab7:unchecked ~ div.sheet-levels { - display: none; -} - input.sheet-tab8:unchecked ~ div.sheet-feats { - display: none; -} - input.sheet-tab9:unchecked ~ div.sheet-traits { - display: none; -} - input.sheet-tab1:checked ~ div.sheet-hunter { - display: block; - border-style: double -} - input.sheet-tab2:checked ~ div.sheet-stats { - display: block; - border-style: double -} - input.sheet-tab3:checked ~ div.sheet-combat { - display: block; - border-style: double -} - input.sheet-tab4:checked ~ div.sheet-weapons { - display: block; - border-style: double -} - input.sheet-tab5:checked ~ div.sheet-skills { - display: block; - border-style: double -} - input.sheet-tab6:checked ~ div.sheet-items { - display: block; - border-style: double -} - input.sheet-tab7:checked ~ div.sheet-levels { - display: block; - border-style: double -} - input.sheet-tab8:checked ~ div.sheet-feats { - display: block; - border-style: double -} - input.sheet-tab9:checked ~ div.sheet-traits { - display: block; - border-style: double -} - .div{ - background-color: antiquewhite; -} - .container { - display: flex; - /* or inline-flex */ - flex-flow:wrap; - flex-direction: row; - justify-content: center; - align-items:flex-start; - width: 90%; -} - .containercol { - display: flex; - /* or inline-flex */ - flex-flow: column; - flex-direction: column; - justify-content: center; - width: 100%; -} - .containercol4 { - display: flex; - /* or inline-flex */ - flex-flow: column; - flex-direction: column; - align-items: stretch; - justify-content:center; - width: 20%; -} - .containercol2 { - display: flex; - /* or inline-flex */ - flex-flow: column; - flex-direction: column; - align-items: stretch; - justify-content:center; - width: 50%; -} - .containerrow { - display: flex; - /* or inline-flex */ - flex-flow: row; - flex-direction: row; - align-items: stretch; - justify-content:center; - width: auto; -} - .item { - flex-grow: 1; - /* default 0 */ - padding-right: 5px; - padding-left: 5px; - background-color: antiquewhite; -} - .item4 { - flex-grow: 1; - /* default 0 */ - padding-right: 5px; - padding-left: 5px; - background-color: antiquewhite; - width: 100%; -} - .sheet-bnb-logo { - height: 116px; -} - .input, .sheet-short { - width: 25px; -} +/* Set the min-width so that when the window is resized the look will stay consistant */ + .charsheet { + background-color: #fff; + min-width: 100%; + border-style:inset; +} + .charsheet label { + margin-top: 10px; +} +/* Universal styling applied to all elements of these types */ + h2 { + font-size: 2em; + text-align: center; + width: 100%; +} + label { + text-align: center !important; +} + img { + max-height: 100px; +} + .center { + padding-bottom: 10px; + text-align: center !important; + border-spacing: 10px !important; + background-color: antiquewhite !important; +} + .inputmargin { + text-align: center !important; + width: 100%; +} + .wide { + width: 45% !important; +} + .center2 { + padding-bottom: 10px; + text-align: center !important; + border-spacing: 10px !important; + background-color: antiquewhite !important; +} + .ui-dialog .charsheet { +} + .charsheet { + min-width: 80%; + max-width: 95%; + border-style: inset; + background-color: antiquewhite; +} + .option { + overflow-wrap: break-word; +} + div.sheet-hunter, div.sheet-stats, div.sheet-combat, div.sheet-weapons, div.sheet-skills, div.sheet-items, div.sheet-levels, div.sheet-feats, div.sheet-traits { + display: none; +} + input.sheet-tab1:unchecked ~ div.sheet-hunter { + display: none; +} + input.sheet-tab2:unchecked ~ div.sheet-stats { + display: none; +} + input.sheet-tab3:unchecked ~ div.sheet-combat { + display: none; +} + input.sheet-tab4:unchecked ~ div.sheet-weapons { + display: none; +} + input.sheet-tab5:unchecked ~ div.sheet-skills { + display: none; +} + input.sheet-tab6:unchecked ~ div.sheet-items { + display: none; +} + input.sheet-tab7:unchecked ~ div.sheet-levels { + display: none; +} + input.sheet-tab8:unchecked ~ div.sheet-feats { + display: none; +} + input.sheet-tab9:unchecked ~ div.sheet-traits { + display: none; +} + input.sheet-tab1:checked ~ div.sheet-hunter { + display: block; + border-style: double +} + input.sheet-tab2:checked ~ div.sheet-stats { + display: block; + border-style: double +} + input.sheet-tab3:checked ~ div.sheet-combat { + display: block; + border-style: double +} + input.sheet-tab4:checked ~ div.sheet-weapons { + display: block; + border-style: double +} + input.sheet-tab5:checked ~ div.sheet-skills { + display: block; + border-style: double +} + input.sheet-tab6:checked ~ div.sheet-items { + display: block; + border-style: double +} + input.sheet-tab7:checked ~ div.sheet-levels { + display: block; + border-style: double +} + input.sheet-tab8:checked ~ div.sheet-feats { + display: block; + border-style: double +} + input.sheet-tab9:checked ~ div.sheet-traits { + display: block; + border-style: double +} + .div{ + background-color: antiquewhite; +} + .container { + display: flex; + /* or inline-flex */ + flex-flow:wrap; + flex-direction: row; + justify-content: center; + align-items:flex-start; + width: 90%; +} + .containercol { + display: flex; + /* or inline-flex */ + flex-flow: column; + flex-direction: column; + justify-content: center; + width: 100%; +} + .containercol4 { + display: flex; + /* or inline-flex */ + flex-flow: column; + flex-direction: column; + align-items: stretch; + justify-content:center; + width: 20%; +} + .containercol2 { + display: flex; + /* or inline-flex */ + flex-flow: column; + flex-direction: column; + align-items: stretch; + justify-content:center; + width: 50%; +} + .containerrow { + display: flex; + /* or inline-flex */ + flex-flow: row; + flex-direction: row; + align-items: stretch; + justify-content:center; + width: auto; +} + .item { + flex-grow: 1; + /* default 0 */ + padding-right: 5px; + padding-left: 5px; + background-color: antiquewhite; +} + .item4 { + flex-grow: 1; + /* default 0 */ + padding-right: 5px; + padding-left: 5px; + background-color: antiquewhite; + width: 100%; +} + .sheet-bnb-logo { + height: 116px; +} + .input, .sheet-short { + width: 25px; +} diff --git a/Bunkers&Badasses/bnb.html b/Bunkers&Badasses/bnb.html index d8e04d4dd9..fefa40dfac 100644 --- a/Bunkers&Badasses/bnb.html +++ b/Bunkers&Badasses/bnb.html @@ -1,1206 +1,1206 @@ - -
- -
-Hunter Stats Combat Skills Weapons Items Levels Feats Traits - -
-
-
-

Vault Hunter

-
-
-
-
-

Welcome Vault Hunter. Below you will begin your journey. Pick your Archetype, Class and Background. All hunters start at level 1 in both Level and BadAss Rank. Your class will tell you what your melee die which will also be your health die as you level up. *NOTE* Use the boxes in the uper left to hide and show sections as preferred!

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

Stats and Checks

-
-
-

Be sure and apply your Archetype and Class base stats to the DMG,ACC,MST,SPD as well as any background or trait modifiers where they are needed.

-
-
-
-
-
- -
- -
-
-
- -
- + = -
-
-
-
-
-
- -
- -
-
-
-
-
- -
- + = -
-
-
- -
- + = -
-
-
-
-
-
-
- -
- -
-
-
-
-
- -
- + = -
-
-
-
- -
- + = -
-
-
-
-
-
- -
- -
-
-
-
-
- -
- + = -
-
-
- -
- + = -
-
-
- -
- + = -
-
-
-
-
-
-
- -
-
-

Combat

-
-
-

When in combat your shield takes damage first. If you go a round without damage it will recharge based on its recharge rate each round without taking damage.

-
-
-
-
- -
-
-

Move: 3 + SPD Mod

-
-
-

Attack: Ranged or Melee

-
-
-

Activate Class Action Skill

-
-
-

Throw: an item or grenade

-
-
-

Drink Potion

-
-
-

Reload: Skip attack and reload

-
-
-
-
- -
-
-

Extra Movement: 3 + SPD Mod

-
-
-

Extra Attack: Ranged or Melee

-
-
-

Swap Guns

-
-
-

Attempt a Check: Failed check results in 2 mayhem points

-
-
-

Handoff Item

-
-
-

Reload: A reload is required after a crit fail

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

Class Action

-
-
-

Choose the action for your class. Note how many times used per day.

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

Skills

Available Points / Used -
-
-

When choosing a skill please add the number to your "Used" box above. Some skills can be gained multiple times (3 is max). Use the S/L to fill in how many times you have bought this skill and apply the skill level to any call out in the text for S/L -
-
-
-
-
- - -
-
- - -
-
-
-
-
- -
-
-

Weapons

-
-
-

When using weapons, roll you 1d20 and add your ACC Mod for hit and DMG Mod for damage only if it is favored. When rolling damage roll the guns DMG Die for every Hit correlating to your Atk roll, Roll 1d12 for every crit, and add an additional 1d12 for a natural 20, and add your DMG Mod to the final value if favored. Don't forget to review the details of the gun for special effects or bonuses.

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

Items

-
-
-

Track any miscellaneous items below. Give a name, description and amount. example: GOLD - DELICIOUS AMAZING GOLD - 5 not enough...

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

Levels

-
-
-

When you gain a level in your archetype add it in here and add stats or roll hit die as needed. You can branch into another archetype after level 5.

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

Feats

-
-
-

Gain your Archetype Feats here when a level notes "+ Archetype Feat". *Note* Some Feats have level or other requirements. Look for these in the description.

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

Character Traits

-
-
-

Your character gets 2 traits when being created. You get to choose one trait that you like and have the second one randomly selected by FATE! Roll a d100 (or 2 d10) and have it randomly selected with 1 reroll allowed.

-
-
-
-
- -
-
-
+ +
+ +
+Hunter Stats Combat Skills Weapons Items Levels Feats Traits + +
+
+
+

Vault Hunter

+
+
+
+
+

Welcome Vault Hunter. Below you will begin your journey. Pick your Archetype, Class and Background. All hunters start at level 1 in both Level and BadAss Rank. Your class will tell you what your melee die which will also be your health die as you level up. *NOTE* Use the boxes in the uper left to hide and show sections as preferred!

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

Stats and Checks

+
+
+

Be sure and apply your Archetype and Class base stats to the DMG,ACC,MST,SPD as well as any background or trait modifiers where they are needed.

+
+
+
+
+
+ +
+ +
+
+
+ +
+ + = +
+
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ + = +
+
+
+ +
+ + = +
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ + = +
+
+
+
+ +
+ + = +
+
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ + = +
+
+
+ +
+ + = +
+
+
+ +
+ + = +
+
+
+
+
+
+
+ +
+
+

Combat

+
+
+

When in combat your shield takes damage first. If you go a round without damage it will recharge based on its recharge rate each round without taking damage.

+
+
+
+
+ +
+
+

Move: 3 + SPD Mod

+
+
+

Attack: Ranged or Melee

+
+
+

Activate Class Action Skill

+
+
+

Throw: an item or grenade

+
+
+

Drink Potion

+
+
+

Reload: Skip attack and reload

+
+
+
+
+ +
+
+

Extra Movement: 3 + SPD Mod

+
+
+

Extra Attack: Ranged or Melee

+
+
+

Swap Guns

+
+
+

Attempt a Check: Failed check results in 2 mayhem points

+
+
+

Handoff Item

+
+
+

Reload: A reload is required after a crit fail

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

Class Action

+
+
+

Choose the action for your class. Note how many times used per day.

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

Skills

Available Points / Used +
+
+

When choosing a skill please add the number to your "Used" box above. Some skills can be gained multiple times (3 is max). Use the S/L to fill in how many times you have bought this skill and apply the skill level to any call out in the text for S/L +
+
+
+
+
+ + +
+
+ + +
+
+
+
+
+ +
+
+

Weapons

+
+
+

When using weapons, roll you 1d20 and add your ACC Mod for hit and DMG Mod for damage only if it is favored. When rolling damage roll the guns DMG Die for every Hit correlating to your Atk roll, Roll 1d12 for every crit, and add an additional 1d12 for a natural 20, and add your DMG Mod to the final value if favored. Don't forget to review the details of the gun for special effects or bonuses.

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

Items

+
+
+

Track any miscellaneous items below. Give a name, description and amount. example: GOLD - DELICIOUS AMAZING GOLD - 5 not enough...

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

Levels

+
+
+

When you gain a level in your archetype add it in here and add stats or roll hit die as needed. You can branch into another archetype after level 5.

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

Feats

+
+
+

Gain your Archetype Feats here when a level notes "+ Archetype Feat". *Note* Some Feats have level or other requirements. Look for these in the description.

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

Character Traits

+
+
+

Your character gets 2 traits when being created. You get to choose one trait that you like and have the second one randomly selected by FATE! Roll a d100 (or 2 d10) and have it randomly selected with 1 reroll allowed.

+
+
+
+
+ +
+
+
\ No newline at end of file diff --git a/Bunkers&Badasses/bnb.json b/Bunkers&Badasses/bnb.json index 67192413a1..82fab544a2 100644 --- a/Bunkers&Badasses/bnb.json +++ b/Bunkers&Badasses/bnb.json @@ -1,9 +1,9 @@ -{ - "html": "bnb.html", - "css": "bnb.css", - "authors": "Shawn-M (ryuaced)", - "roll20userid": "4170820", - "preview": "bnb.png", - "instructions": "Bunkers & Borderlands character sheet with some automation.\n\nVersion: 1.0\n\nIf you find bugs or have suggestions, please use the [Github issue tracker](https://github.com/ryuaced/roll20-character-sheets/issues) for this sheet.\n\n", - "legacy": false +{ + "html": "bnb.html", + "css": "bnb.css", + "authors": "Shawn-M (ryuaced)", + "roll20userid": "4170820", + "preview": "bnb.png", + "instructions": "Bunkers & Borderlands character sheet with some automation.\n\nVersion: 1.0\n\nIf you find bugs or have suggestions, please use the [Github issue tracker](https://github.com/ryuaced/roll20-character-sheets/issues) for this sheet.\n\n", + "legacy": false } \ No newline at end of file diff --git a/Daemon 3e/read me.txt b/Daemon 3e/read me.txt index 9bc51a913b..d6d3abd78d 100644 --- a/Daemon 3e/read me.txt +++ b/Daemon 3e/read me.txt @@ -1,5 +1,5 @@ -Este é o site oficial da editoda do sistema Daemon. Aqui vc pode encontrar um netbook com as regras oficiais do sistema. - -This is the official website of the Daemon system editor. Here you can find a netbook with the official rules of the system. - +Este é o site oficial da editoda do sistema Daemon. Aqui vc pode encontrar um netbook com as regras oficiais do sistema. + +This is the official website of the Daemon system editor. Here you can find a netbook with the official rules of the system. + https://www.daemon.com.br/home/ \ No newline at end of file diff --git a/Daemon Exilia/read.me.txt b/Daemon Exilia/read.me.txt index 9bc51a913b..d6d3abd78d 100644 --- a/Daemon Exilia/read.me.txt +++ b/Daemon Exilia/read.me.txt @@ -1,5 +1,5 @@ -Este é o site oficial da editoda do sistema Daemon. Aqui vc pode encontrar um netbook com as regras oficiais do sistema. - -This is the official website of the Daemon system editor. Here you can find a netbook with the official rules of the system. - +Este é o site oficial da editoda do sistema Daemon. Aqui vc pode encontrar um netbook com as regras oficiais do sistema. + +This is the official website of the Daemon system editor. Here you can find a netbook with the official rules of the system. + https://www.daemon.com.br/home/ \ No newline at end of file diff --git a/Earthdawn (FASA Official)/Earthdawn.css b/Earthdawn (FASA Official)/Earthdawn.css index 03fa6cd972..df06d15ada 100644 --- a/Earthdawn (FASA Official)/Earthdawn.css +++ b/Earthdawn (FASA Official)/Earthdawn.css @@ -1,2537 +1,2537 @@ -/* Earthdawn.css */ -/* ############################################ css Reset ######################################################################### */ -/*v2.06 - published 220208*/ - -/* @import url('https://fonts.googleapis.com/css2?family=IM+Fell+English+SC&display=swap'); */ -@import url('https://fonts.googleapis.com/css2?family=Aladin&display=swap'); - - -input, -.charsheet input { - height: initial; -} -label, -.charsheet label { - color: initial; - display: inline-block; - font-size: inherit; - font-weight: normal; - height: auto; - line-height: 1em; - margin-bottom: initial; - padding-right: initial; - position: relative; - width: initial; -} -select, -.charsheet select { - margin: initial; - width: initial; - height: 20px; /*JBF 210317*/ - padding: 0; - font-weight: bold; - -} -textarea, -.charsheet textarea { - height: initial; - /* overflow-x: hidden; - overflow-y: auto; */ - resize: initial; - background-color: var( --bg-color ); - box-sizing: border-box; - border: 1px solid var( --outline-color ); - text-align: left; - overflow: auto; - pointer-events: initial; -} - - - - -/* ##### iconselect #### */ - -.sheet-testRepEditMode:not(:checked)~.repcontainer .sheet-iconselect-select, -.sheet-iconselect-span:not(:hover)>.sheet-iconselect-select-noedit, -.sheet-iconselect-span:not(:hover)>.sheet-iconselect-select{ - display: none; -} - -.charsheet .sheet-testRepEditMode:checked~.repcontainer .sheet-iconselect-span:hover>.sheet-iconselect-icon, -.charsheet .sheet-testRepEditMode:checked+.sheet-iconselect-span:hover>.sheet-iconselect-icon, -.charsheet .sheet-iconselect-span:hover>.sheet-iconselect-icon-noedit { - display: none; -} - -.charsheet .sheet-testRepEditMode:checked~.repcontainer .sheet-iconselect-span>.sheet-iconselect-icon, -.charsheet .sheet-testRepEditMode:checked+.sheet-iconselect-span>.sheet-iconselect-icon, -.charsheet .sheet-iconselect-span>.sheet-iconselect-icon-noedit { - background-color: var( --icon-color ); -} - - -.sheet-iconselect-icon, -.sheet-iconselect-span { - min-height: 20px; - min-width: 20px; -} -/* In order to have a correct initialization, it is absolutely necessary to have the iconselect-icon before the iconselect-select, and have the default value marked as checked/selected*/ - - -/* ############################################ Main section ####################################################################### */ -/* Colors: code description What used for. */ -.sheet-user-root { - --bg-color: rgb(255,242,201,0.15);/*Main background color ;*/ - --outline-color: #071840; /* Main border */ - --font-color: #071840; /* Color of fonts on the normal background */ - --header-font-color: white; /* Color of fonts on the header background */ - --highlight-font-color: #071840; /* Color of fonts on the icon background */ - --input-color: rgba(0, 0, 10, 0.1); /* Main section Input fields that are not disabled. */ - --hover-color: red; /* Color of active fields when hovered. */ - --hover-color-bg: rgba(255, 0, 0, 0.5); /* Color of active fields when hovered. */ - --locked-color: transparent; /* Main section Input fields that are locked */ - --control-secondary: #1473B4; /* header section background */ - --inactive-color: #1473B4; /* Color of the inactive tabs */ - --button-color: rgba(245, 245, 245, 1); /* button color */ - --icon-color: rgba(0, 0, 10, 0.1); /* actionable icons */ - -} - - - - - -xxxxx { - xxx: xx; /* * */ -} -/* For absolutely weird reason, we need this line to make the CSS work*/ - -/*.sheet-testAPI:not(:checked)~.sheet-api, Knacks tab is not inside a div */ -.sheet-testAPI:not([value="1"])~div .sheet-api, -.sheet-testAPI:not([value="1"])~div .sheet-Karma-ControlBox, -.sheet-testAPI[value="1"]~div .sheet-NoAPI, -.sheet-testCreation:not([value="1"])~div .sheet-Creation, -.sheet-testCreation[value="1"]~div .sheet-NotCreation, -.sheet-testEdition[value="-1"]~div .sheet-HideIf1879, -.sheet-testEdition:not([value="-1"])~div .sheet-HideIfNot1879, -.sheet-testEdition[value="3"]~div .sheet-HideIfEdition3, -.sheet-testEdition:not([value="3"])~div .sheet-HideIfNotEdition3, -.sheet-testEdition[value="4"]~div .sheet-HideIfEdition4, -.sheet-testEdition:not([value="4"])~div .sheet-HideIfNotEdition4, -.sheet-testPath[value="0"]~div .sheet-HideIfNotPath, -.sheet-testQuest[value="0"]~div .sheet-HideIfNotQuest, -.sheet-testNbDisc[value="0"]~div .sheet-HideIfZeroDisc, -.sheet-testNbDisc[value="1"]~div .sheet-HideIfOneDisc, -.sheet-testNbDisc[value="2"]~div .sheet-HideIfTwoDisc, -.sheet-testNbDisc[value="3"]~div .sheet-HideIfThreeDisc, -.sheet-testNPC:not([value="0"])~div .sheet-HideIfNotPC, -.sheet-testNPC[value="0"]~div .sheet-HideIfPC, -.sheet-testRace:not([value="Tskrang"])~div .sheet-HideIfNotTskrang, -.sheet-testRace:not([value="Other"])~div .sheet-HideIfNotCreature, -.sheet-testRace[value="Other"]~div .sheet-HideIfCreature, -.sheet-testStepDisplay:not([value="1"])~div .sheet-StepTotal, -.sheet-testStepDisplay[value="1"]~div .sheet-StepBase, -.sheet-testChecked:checked~.sheet-HideIfChecked, -.sheet-testChecked:not(:checked)~.sheet-HideIfNotChecked, -.sheet-testChecked:checked~div>.sheet-HideIfChecked, -.sheet-testChecked:not(:checked)~div>.sheet-HideIfNotChecked, -.sheet-testChecked:not(:checked)~span>.sheet-HideIfNotChecked, -.sheet-testChecked:checked~div>div>.sheet-HideIfChecked, -.sheet-testChecked:not(:checked)~div>div>.sheet-HideIfNotChecked, -.sheet-testChecked:checked~span>.sheet-HideIfChecked, -.sheet-testChecked:not(:checked)~.sheet-table-row>.sheet-HideIfNotChecked, -.sheet-testCloseChecked:checked+.sheet-HideIfCloseChecked, -.sheet-testCloseChecked:not(:checked)+.sheet-HideIfNotCloseChecked, -.sheet-testCloseChecked:not(:checked)+.sheet-HideIfCloseChecked+.sheet-HideIfNotCloseChecked, -.sheet-testNum[value="0"]+.sheet-HideIfZero, -.sheet-testNum:not([value="0"])+span+.sheet-HideIfNotZero, -.sheet-testNum[value="1"]+.sheet-HideIfOne, -.sheet-testNum[value="2"]+.sheet-HideIfTwo, -.sheet-testNum[value="3"]+.sheet-HideIfThree, -.sheet-testNum[value="0"]~ .sheet-HideIfZero, -.sheet-testNum[value="0"]~div .sheet-HideIfZero, -.sheet-testNum[value="1"]~div .sheet-HideIfOne, -.sheet-testNum[value="2"]~div .sheet-HideIfTwo, -.sheet-testNum[value="3"]~div .sheet-HideIfThree, -.sheet-testNum[value="0"]~ .sheet-HideIfLessThan1, -.sheet-testNum[value="0"]~div .sheet-HideIfLessThan1, -.sheet-testNum[value="1"]~div .sheet-HideIfLessThan2, -.sheet-testNum[value="2"]~div .sheet-HideIfLessThan3, -.sheet-testNum[value="3"]~div .sheet-HideIfLessThan4, -.sheet-testNum[value="4"]~div .sheet-HideIfLessThan5, -.sheet-testNum[value="5"]~div .sheet-HideIfLessThan6, -.sheet-testNum[value="6"]~div .sheet-HideIfLessThan7, -.sheet-testNum[value="7"]~div .sheet-HideIfLessThan8, -.sheet-testNum[value="8"]~div .sheet-HideIfLessThan9, -.sheet-testNum[value="9"]~div .sheet-HideIfLessThan10, -.sheet-testNum[value="10"]~div .sheet-HideIfLessThan11, -.sheet-testNum[value="11"]~div .sheet-HideIfLessThan12, -.sheet-testNum[value="12"]~div .sheet-HideIfLessThan13, -.sheet-testNum[value="13"]~div .sheet-HideIfLessThan14, -.sheet-testNum[value="14"]~div .sheet-HideIfLessThan15, -.sheet-testModType[value="(0)"]~span>.sheet-HideIfNoRoll, -.sheet-testModType[value="(0)"]~.sheet-HideIfNoRoll, -.sheet-testModType:not([value="(0)"])~span>.sheet-HideIfRoll, -.sheet-testModType:not([value="(0)"])~.sheet-HideIfRoll, -.sheet-testRecord[value="LP"]~.sheet-HideIfLP, -.sheet-testRecord[value="SP"]~.sheet-HideIfSP, -.sheet-testRecord[value="Other"]~.sheet-HideIfOther, -.sheet-testRepEditMode:checked~.repcontainer .sheet-HideIfEditMode, -.sheet-testRepEditMode:not(:checked)~.repcontainer .sheet-HideIfNotEditMode, -.sheet-testRepEditMode:checked~.sheet-HideIfEditMode, -.sheet-testRepEditMode:not(:checked)~.sheet-HideIfNotEditMode, -.sheet-testRepEditMode:checked~div>.sheet-HideIfEditMode, -.sheet-testRepEditMode:not(:checked)~div>.sheet-HideIfNotEditMode, -.sheet-testRepEditMode:checked~div>div>.sheet-HideIfEditMode, -.sheet-testRepEditMode:not(:checked)~div>div>.sheet-HideIfNotEditMode, -.sheet-testRepEditMode:checked~span>.sheet-HideIfEditMode, -.sheet-testRepEditMode:not(:checked)~span>.sheet-HideIfNotEditMode, -.sheet-testRepEditMode:checked~div>div>span>.sheet-HideIfEditMode, -.sheet-testRepEditMode:not(:checked)~div>div>span>.sheet-HideIfNotEditMode, -.sheet-testRepOption1:not(:checked)~.repcontainer .sheet-HideIfNotOption1, -.sheet-testRepOption2:not(:checked)~.repcontainer .sheet-HideIfNotOption2, -.sheet-testRepOption3:not(:checked)~.repcontainer .sheet-HideIfNotOption3, -.sheet-testRepOption4:not(:checked)~.repcontainer .sheet-HideIfNotOption4, -.sheet-testFreeOrThread[value*="-link"]+.sheet-HideIfFreeOrThread, -.sheet-testFreeOrThread:not([value*="-link"])+.sheet-HideIfNotFreeOrThread, -.sheet-testFreeOrThread:not([value*="-link"])+.sheet-HideIfFreeOrThread+.sheet-HideIfNotFreeOrThread, -.sheet-testPlaceholder:not(:placeholder-shown)~.sheet-hideIfNotPlaceholder, -.sheet-testPlaceholder:placeholder-shown~.sheet-hideIfPlaceholder, -.sheet-testPlaceholder:not(:placeholder-shown)~div .sheet-hideIfNotPlaceholder, -.sheet-testPlaceholder:not(:placeholder-shown)~span .sheet-hideIfNotPlaceholder, -.sheet-testPlaceholder:placeholder-shown~span .sheet-hideIfPlaceholder, -input[type="number"]:disabled.sheet-hidden, /* Need this bit of extra specificity here */ -.sheet-hidden { - display: none; -} - -.sheet-testCloseChecked:checked+.sheet-UnHideIfCloseChecked, -.sheet-testChecked:checked~.sheet-UnHideIfChecked, -.sheet-testDSPPath[value="81.0"]~div .sheet-UnHideIfDSPPath, -.sheet-testDSPPath[value="83.0"]~div .sheet-UnHideIfDSPPath, -.sheet-testNum:not([value="0"])+.sheet-UnhideIfNotZero, -.sheet-testNum:not([value="0"])+.sheet-testNum+.sheet-UnhideIfNotZero, -.sheet-testDevotion[value^="QD-"]+.sheet-UnhideIfDevotion -{ display: inline-block; } - -.sheet-testNum2[value="1"]~div .sheet-UnhideIf1, -.sheet-testNum2[value="2"]~div .sheet-UnhideIf2, -.sheet-testNum2[value="3"]~div .sheet-UnhideIf3, -.sheet-testNum2[value="4"]~div .sheet-UnhideIf4, -.sheet-testNum2[value="5"]~div .sheet-UnhideIf5, -.sheet-testNum2[value="6"]~div .sheet-UnhideIf6, -.sheet-testNum2[value="7"]~div .sheet-UnhideIf7, -.sheet-testNum2[value="8"]~div .sheet-UnhideIf8, -.sheet-testNum2[value="9"]~div .sheet-UnhideIf9, -.sheet-testNum2[value="10"]~div .sheet-UnhideIf10, -.sheet-testNum2[value="11"]~div .sheet-UnhideIf11, -.sheet-testNum2[value="12"]~div .sheet-UnhideIf12, -.sheet-testNum2[value="13"]~div .sheet-UnhideIf13, -.sheet-testNum2[value="14"]~div .sheet-UnhideIf14, -.sheet-testNum2[value="15"]~div .sheet-UnhideIf15 -{ display: inline-block; } - - - - - -/* ################ JBF 210104 Global formatting (inputs, select ...) ############ */ - - -input[type="text"], -input[type="number"] { - color: var( --font-color ); - background-color: var( --input-color ); - border: 1px solid transparent; - padding: 1px; - font-weight: bold; - text-align: center; -} - -input.sheet-HideSpinners::-webkit-inner-spin-button, -input.sheet-HideSpinners::-webkit-outer-spin-button, -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - opacity: 0.1; -} - -input.sheet-HideSpinners:hover::-webkit-inner-spin-button, -input.sheet-HideSpinners:hover::-webkit-outer-spin-button, -input[type="number"]:hover::-webkit-inner-spin-button, -input[type="number"]:hover::-webkit-outer-spin-button { - opacity: 1; -} - -input:hover, -input.sheet-HideSpinners:hover { - -moz-appearance: auto; - background-color: var( --hover-color-bg); - border : 1px solid var( --hover-color); -} - -input[type="number"], -input.sheet-HideSpinners { - -moz-appearance: textfield; -} - - -textarea.sheet-details { - height: 100px; - resize: vertical; - margin-bottom : 1px; -} - -textarea.sheet-details-small { - height: 50px; - resize: vertical; - margin-bottom : 1px; -} - -textarea.sheet-details-big { - height: 400px; - resize: vertical; - margin-bottom : 1px; -} - -textarea.sheet-details-oneline { - height: 25px; - resize: none; - margin-bottom : 1px; - background: var(--input-color); - -} - -textarea.sheet-textimport { - height: 23px; - width: 10em; - resize: none; - overflow: none; - margin-bottom : 0px; - background-color: var( --input-color ); - border : 1px solid var(--outline-color); -} - -span.sheet-buttonlabel, -input.sheet-buttonlabel { - background : transparent; - border-style: none; - text-align: left; - padding: 0; - margin: 0; - font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; - font-weight: normal; - color: var( --font-color ); - -} -button:hover span.sheet-buttonlabel, -button:hover input.sheet-buttonlabel { - color : var( --hover-color ); - cursor: pointer; -} - - - -select { - background-color: var( --input-color ); - border-left: none; - border-top: none; - border-right-style: none; - border-bottom: 1px solid var( --outline-color ); - text-align: center; -} - - - -[readonly], -.sheet-Locked, -input[type="text"][readonly], -input[type="number"][readonly], -input[type="number"][readonly]:hover, -input[type="number"].sheet-Locked, /* Sometime need this bit of extra specificity */ -input[type="text"].sheet-Locked, -.sheet-testKarmaAuto:not([value="1"])~div .sheet-Karma-ControlBox, -.sheet-testLocked:checked~.sheet-LockIfChecked, -.sheet-testLocked:checked~span .sheet-LockIfChecked, -.sheet-testLocked:checked~div .sheet-LockIfChecked, -.sheet-testLocked:checked~label .sheet-LockIfChecked, -.sheet-testLocked:not(:checked)~.sheet-LockIfNotChecked, -.sheet-testLocked:not(:checked)~span .sheet-LockIfNotChecked, -.sheet-testLocked:not(:checked)~label .sheet-LockIfNotChecked, -.sheet-testLocked:not(:checked)~div .sheet-LockIfNotChecked { - background-color: var( --locked-color ); - pointer-events: none; - -moz-appearance: textfield; - font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; - font-weight: normal; -} - -.sheet-testRepEditMode:checked~.repcontainer .sheet-LockIfEditMode, -.sheet-testRepEditMode:not(:checked)~.repcontainer .sheet-LockIfNotEditMode, -.sheet-testRepEditMode:checked~.sheet-LockIfEditMode, -.sheet-testRepEditMode:not(:checked)~.sheet-LockIfNotEditMode, -.sheet-testRepEditMode:checked~div>.sheet-LockIfEditMode, -.sheet-testRepEditMode:not(:checked)~div>.sheet-LockIfNotEditMode, -.sheet-testRepEditMode:checked~div>div>.sheet-LockIfEditMode, -.sheet-testRepEditMode:not(:checked)~div>div>.sheet-LockIfNotEditMode, -.sheet-testRepEditMode:not(:checked)~div>span>.sheet-LockIfNotEditMode, -.sheet-testRepEditMode:checked~span>.sheet-LockIfEditMode, -.sheet-testRepEditMode:not(:checked)~span>.sheet-LockIfNotEditMode, -.sheet-testRepEditMode:checked~div>div>span>.sheet-LockIfEditMode, -.sheet-testRepEditMode:not(:checked)~div>div>span>.sheet-LockIfNotEditMode { - background-color: var( --locked-color ); - pointer-events: none; - font-style : italic; - -moz-appearance: textfield; -} - - -.sheet-testNum[value="7"]+.sheet-UnlockIf7, -.sheet-testNum[value="99"]+.sheet-UnlockIf99, -.sheet-testLocked:checked~.sheet-UnlockIfChecked, -.sheet-testLocked:checked~span .sheet-UnlockIfChecked, -.sheet-testLocked:checked~label .sheet-UnlockIfChecked, -.sheet-testLocked:not(:checked)~.sheet-UnlockIfNotChecked, -.sheet-testLocked:not(:checked)~label .sheet-UnlockIfNotChecked, -.sheet-testLocked:not(:checked)~span .sheet-UnlockIfNotChecked { - background-color: var( --input-color ); - color: var( --font-color ); - pointer-events: initial; -} - - - -input:disabled, -input:disabled::-webkit-inner-spin-button, -input:disabled::-webkit-outer-spin-button, -input[readonly]::-webkit-inner-spin-button, -input[readonly]::-webkit-outer-spin-button, -.sheet-fakeCalc input:not(.sheet-hidden) { - pointer-events: none; - font-style: italic; - display: inline-block; - -moz-appearance: textfield; /*Was none before*/ - -webkit-appearance: none; -} - - -input.sheet-nospinner, -input.sheet-nospinner::-webkit-inner-spin-button, -input.sheet-nospinner::-webkit-outer-spin-button { - -moz-appearance: textfield; /*Was none before*/ - -webkit-appearance: none; -} - - - - -.sheet-floatRight { - float: right; - clear: right; -} - -.sheet-text-left { - text-align: left !important; -} - -.sheet-text-center { - text-align: center !important; -} - - -.sheet-fancyfont { - font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; - font-weight: normal; -} - - -.sheet-Elementalist-section, -.sheet-Illusionist-section, -.sheet-Nethermancer-section, -.sheet-Wizard-section { -} /* Need a class here just to keep .sheet-section from inheriting, even if the class is empty */ - -.sheet-label { - line-height: 10px; - font-size: 85%; - padding-right: 2em; - font-weight: bold; - text-align: center; - white-space: nowrap; -} - -.sheet-label-flex { - font-size: 85%; - font-weight: bold; -} - - - -.sheet-repeat-counter-reset { - counter-reset: sheet-rep-items; -} - -.sheet-repeat-count::before -{ - counter-increment: sheet-rep-items; - content: counter(sheet-rep-items) !important; - padding: 0.7em; -} - - -.sheet-text-button { - border-bottom: 1px solid black; - border-right: 1px solid transparent; - border-left: 1px solid transparent; - border-top: 1px solid transparent; - -} - -.sheet-text-button { - color: var( --font-color ); - background-color: var( --button-color ); -} - -.sheet-text-button-header { - color: var( --header-font-color ); - background-color: var( --outline-color ); -} - -.charsheet button[type="roll"].sheet-helpbutton { - color:black; - background-color: maroon ; - background-image: -moz-linear-gradient(top,#fff,maroon); - background-image: -ms-linear-gradient(top,#fff,maroon); - background-image: -webkit-gradient(linear,0 0,0 100%,from(#fff),to(maroon)); - background-image: -webkit-linear-gradient(top,#fff,maroon); - background-image: -o-linear-gradient(top,#fff,maroon); - background-image: linear-gradient(top,#fff,maroon); - background-repeat: repeat-x; - width: 20px; - size:130%; -} - - -/* JBF@JBF 210106 trials for transparent button */ - -.charsheet button[type="roll"], -.charsheet button[type="action"] { - border-bottom: 1px solid var( --outline-color); - border-right: 1px solid transparent; - border-left: 1px solid transparent; - border-top: 1px solid transparent; - border-radius: 5px; - margin-left: 1px; - margin-right: 1px; - background-color: var( --button-color ); - background-image: -moz-linear-gradient(top,#fff,#e6e6e6); - background-image: -ms-linear-gradient(top,#fff,#e6e6e6); - background-image: -webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6)); - background-image: -webkit-linear-gradient(top,#fff,#e6e6e6); - background-image: -o-linear-gradient(top,#fff,#e6e6e6); - background-image: linear-gradient(top,#fff,#e6e6e6); - background-repeat: repeat-x; - padding : 2px; -} - -button[type="roll"].sheet-text-button-header { - background-image: none; - background-color: var( --outline-color); - border-bottom: 1px solid white; - border-right: 1px solid white; - border-left: 1px solid white; - border-top: 1px solid white; -} - - -.charsheet button[type="roll"]:hover, -.charsheet button[type="roll"]:active, -.charsheet button[type="action"]:hover, -.charsheet button[type="action"]:active { - color: var( --hover-color ); - background-color: #e6e6e6; - background-position: 0 -15px; - background-position-x: 0px; - background-position-y: -15px; - -webkit-transition: background-position .1s linear; - -moz-transition: background-position .1s linear; - -ms-transition: background-position .1s linear; - -o-transition: background-position .1s linear; - transition: background-position .1s linear; - transition-property: background-position; - transition-duration: 0.1s; - transition-timing-function: linear; - transition-delay: 0s; - border: 1px solid red; -} - - -input[name*="combatOption"]:checked + b, -input[name*="condition"]:checked + b { - background-color: var( --outline-color ); - color: white; - border-radius: 5px; - padding-right: 5px; - padding-bottom: 1px; - padding-top: 1px; -} - - - -.charsheet button[type=roll].sheet-button-nodice:before { - content: none; -} - - -input[type="number"].sheet-attrCostsRed { - background-color: maroon; - color: white; -} - - -.sheet-testAttrCosts[value="0"]~div .sheet-attrCostsRed -{ - background-color: Green; - color: white; -} - -input[type="number"].sheet-attrCostsGreen { - background-color: green; -} - -.sheet-testAttrCosts[value="0"]~div input[type="number"].sheet-attrCostsGreen, -.sheet-testAttrCosts[value="1"]~div input[type="number"].sheet-attrCostsGreen, -.sheet-testAttrCosts[value="2"]~div input[type="number"].sheet-attrCostsGreen { - background-color: white; -} - - -/* ######## Steps and StepSpan ###### */ - -.charsheet input[type="number"].sheet-StepBig, -.sheet-StepBig { - font-size : 150%; - padding: 0; - margin-left: 0; - margin-right: -3px; - margin-bottom: -14px; - text-align: center; - width: 1.3em ; -} - -.charsheet span.sheet-stepSpan, -.sheet-stepSpan { - height: 26px; - padding-bottom: 2px ; - margin-left: 14px ; - margin-right: 19px ; - display: inline-block; - white-space: nowrap; -} - -.sheet-buffSmall { - transform: scale(0.8) ; /*JBF : transform instead of the font size adresses the spinners*/ -} - - -.charsheet input[type="number"].sheet-buffLeft, -.charsheet input[type="number"].sheet-buffRight { - vertical-align: top; - padding: 0px; - margin-top: 0px; - margin-bottom: 0px; -} - -.charsheet b.sheet-buffSignLeft, -.charsheet b.sheet-buffSignRight { - vertical-align: top; - padding: 0px; - margin-top: 0px; - margin-bottom: 0px; - width: 0.3em; - text-align: right; -} - - -.charsheet b.sheet-buffSignRight{ - margin-right: -2px; - margin-left: -1px; -} - -.charsheet input[type="number"].sheet-buffRight { - margin-left: -4px; - margin-right: -20px; - text-align: left; - width: 2.5em; -} - -.charsheet b.sheet-buffSignLeft { - margin-right: -15px; - margin-left: -2px; -} - -.charsheet input[type="number"].sheet-buffLeft { - text-align: right; - margin-left: 0px; - margin-right: -8px; - width: 1.8em; -} - -.sheet-buffRight::-webkit-inner-spin-button, -.sheet-buffRight::-webkit-outer-spin-button { - opacity: 0; -} - -.sheet-buffRight { - -moz-appearance: textfield; -} - -span:hover .sheet-buffRight::-webkit-inner-spin-button, -span:hover .sheet-buffRight::-webkit-outer-spin-button { - opacity:1; -} - -span:hover .sheet-buffRight{ - -moz-appearance: auto; -} - - -.sheet-testCloseChecked:checked+.sheet-InvisibleIfCloseChecked { - opacity: 0; -} - -.sheet-testCloseChecked:checked+.sheet-PartlyInvisibleIfCloseChecked { - color: transparent; -} - -.sheet-testCloseChecked:not(:checked)+.sheet-PartlyInvisibleIfNotCloseChecked { - color: transparent ; -} - -.sheet-redGreen ~ input, -.sheet-redGreen ~ b { - color: green; -} - - - -.sheet-redGreen[value^="-"] ~ input { - color: red; -} -.sheet-greenRed ~ input, -.sheet-greenRed ~ b { - color: red; -} -.sheet-greenRed[value^="-"] ~ input { - color: green; -} - - -.sheet-redGreen[value^="-"]~ b, -.sheet-greenRed[value^="-"]~ b, -.sheet-redGreen[value="0"] ~ input, -.sheet-greenRed[value="0"] ~ input, -.sheet-redGreen[value="0"] ~ b, -.sheet-greenRed[value="0"] ~ b { - color: transparent; -} - - -.sheet-testKarReq:not([value="0"]) ~ .sheet-Kar_0_3, -.sheet-testKarReq:not([value="0"]) ~ .sheet-Kar_0_2, -.sheet-testKarReq:not([value="1"]) ~ .sheet-Kar_1_2, -.sheet-testKarReq:not([value="1"]) ~ .sheet-Kar_1_3, -.sheet-testKarMax:not([value="2"]) ~ .sheet-Kar_1_2, -.sheet-testKarMax:not([value="2"]) ~ .sheet-Kar_0_2, -.sheet-testKarMax:not([value="3"]) ~ .sheet-Kar_1_3, -.sheet-testKarMax:not([value="3"]) ~ .sheet-Kar_0_3, -.sheet-testKarMax:not([value="0"],[value="1"],[value="2"],[value="3"]) ~ .sheet-Kar_lessthan3, -.sheet-testKarMax:not(:not([value="0"],[value="1"],[value="2"],[value="3"])) ~ .sheet-Kar_morethan3, -.sheet-testKarMax:not([value="4"]) ~ .sheet-Kar_4, -.sheet-testKarMax:not([value="5"]) ~ .sheet-Kar_5, -.sheet-testKarMax:not([value="6"]) ~ .sheet-Kar_6, -.sheet-testKarMax:not([value="7"]) ~ .sheet-Kar_7, -.sheet-testKarMax:not([value="8"]) ~ .sheet-Kar_8, -.sheet-testKarMax:not([value="9"]) ~ .sheet-Kar_9, -.sheet-testKarMax:not([value="10"]) ~ .sheet-Kar_10, -.sheet-testKarMax:not([value="11"]) ~ .sheet-Kar_11, -.sheet-testKarMax:not([value="12"]) ~ .sheet-Kar_12, -.sheet-testKarMax:not([value="13"]) ~ .sheet-Kar_13, -.sheet-testKarMax:not([value="14"]) ~ .sheet-Kar_14, -.sheet-testKarMax:not([value="15"]) ~ .sheet-Kar_15 { - display: none !important; -} - - - -/* ############################################# JBF Header Flex Containers ######################################################### */ - -.sheet-header-flex-container { - display: flex; - align-items: flex-start; - justify-content: flex-start; - flex-wrap: wrap; - overflow: hidden; -} - - -.sheet-header-box { - height: 75px; - border: 1px solid var(--outline-color); - border-radius: 10px; - display: flex; - align-items: center; - margin-right: 1px; - flex-flow: column; - opacity: 1; - overflow: hidden; - max-width: 280px; -} - -.sheet-header-modbox { - margin-top : 9px; - margin-bottom: 7px; - margin-left: 0px; - margin-right: 0px; -} - - -.sheet-header-flex-container:not(:hover) .sheet-testNum[value="0"]+.sheet-testNum[value="0"]+.sheet-header-hidden, -.sheet-header-flex-container:not(:hover) .sheet-testNum[value="0"]+.sheet-testNum[value="0"]+.sheet-testNum[value="0"]+.sheet-header-hidden { - height : 0px; - max-width: 0px; - overflow: hidden; - opacity: 0.5; - padding: 0px; - margin: 0px; - border: 1px solid transparent; -} - -.sheet-header-box, -.sheet-iconlabel-header, -.sheet-iconlabel-header-invert, -.sheet-iconlabelbig, -.sheet-header-hidden { - transition: height 0.5s, flex-grow 0.5s, min-width 0.5s, flex-basis 0.5s, width 0.5s, max-width 0.5s , margin 0.5s, padding 0.5s; - /* transition-delay: 1.5s; */ - overflow: hidden; -} - - - -.sheet-header-iconbox { - flex-grow: 1; /* it can grow */ - flex-shrink: 1; /* it can shrink */ - /* flex-basis: 30px; /* arbitrary depending on design */ */ - /* min-width: 30px; /* equal to flex-basis */ */ - /*max-width: 100%; JBF@JBF 210228 (100% - margins)/number of boxes */ - text-align: center; - transition: flex-grow, 0.5s; - transition: min-width 0.5s; - /* transition-delay: 1.5s; */ -} - -.sheet-header-flex-container:not(:hover) .sheet-header-iconbox { - /* flex-grow: 0.0000000001; /* it cant grow anymore... We want it to collapse */ */ - /* flex-basis: 30px; */ - /* width: auto; - min-width: 30px; */ - /* padding: 0px !important; */ - transition: flex-grow, 0.5s, min-width 0.5s; - /* transition-delay: 1.5s; */ -} - -.sheet-header-logo-Earthdawn { - background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Earthdawn-Logo.png); -/* background-image: url(https://s3.amazonaws.com/files.staging.d20.io/images/258659/43tgLdtfozFTvZrPGMv-uw/med.png?1539148273); */ -} -.sheet-header-logo-1879 { - background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/1879-Logo.png); -/* background-image: url(https://s3.amazonaws.com/files.d20.io/images/188531300/L18EvmQWIkcT_CKVGnPfqg/max.png?1609231596); */ -} - -.sheet-header-logo-Earthdawn, -.sheet-header-logo-1879 -{ - height: 76px; - background-repeat: no-repeat; - background-size: contain; - max-width: 200px; - width: calc(100% - 800px); /* Width of Logo =100%-2X where X = min-width of header-name*/ -} - -.sheet-testQuest:not([value="0"])~div .sheet-header-logo-1879, -.sheet-testQuest:not([value="0"])~div .sheet-header-logo-Earthdawn -{ - width: calc(100% - 1000px); /* If Questor, Logo needs to be smaller */ -} - -.sheet-testQuest:not([value="0"])~div .sheet-header-name { - min-width: min(500px, 25%); - width: calc(50% - 100px); -} - - -.sheet-header-name { - height: 70px; - border: 1px solid var(--outline-color); - border-radius: 10%; - min-width: min(400px, 25%); - width: calc(50% - 100px); - padding-top: 6px; - padding: 3px; - overflow: hidden; -} - - -/* ############################################ Colors and Margins ###################################################### */ - - -/* JBF 210103 To be identified */ -.ui-widget-content, -.charsheet { - position: absolute; - padding: 0 !important; - left: 0; - top: 46px; -} -/* JBF 210103 To be identified */ - - -.sheet-user-root { -/*Normal Background*/ -background-color: var( --bg-color ); - background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Border-left-nobottom.png),url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Border-right-nobottom.png),url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Border-left-nobottom3.png),url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Border-right-nobottom3.png); - background-repeat: no-repeat, no-repeat,no-repeat, no-repeat; - background-blend-mode: multiply, multiply,multiply, multiply; - background-position: -17px -15px,calc(100% + 23px) -10px,-17px 1356px,calc(100% + 23px) 1362px; - background-size : 250px 1372px, 250px 1372px,250px 1372px, 250px 1372px; - padding-left: 13px; - padding-right: 13px; - padding-top: 10px; - margin-top: 0px; - margin-left: 0px; - margin-right: 0px; -} - -.sheet-user-root-in { - margin-left: 0px; - margin-right: 0px; - min-width: 500px; /*JBF@JBF : to be reworked according to final layout*/ - border-left: 2px groove var( --outline-color ); - border-right: 2px groove var( --outline-color ); - border-bottom: 2px groove var( --outline-color ); - border-top: none; - background-color: var( --bg-color ); -} - - -.sheet-section { - background-color: var( --bg-color ); -} - -.sheet-content { - padding: 2px; -} - - -.sheet-bordered { - border : 1px solid var(--outline-color) !important; -} - -.sheet-bordered-bottom { - border-top: none !important; - border-left: none !important; - border-right: none !important; - border-bottom: 1px solid var(--outline-color) !important; -} - -.sheet-notbordered { - border: none !important; -} - -.sheet-header { - min-height: 30px; -} - - -.sheet-imgbox { - text-align: center; - align-items: center; - justify-content: center; - height: 50px; - width: 50px; - position: relative; -} - - -.sheet-imgbox::before { - text-align: center; - align-items: center; - justify-content: center; - content: ""; - position: absolute; - background-repeat: no-repeat; - background-size: 40px 40px; - background-position: top center; - top: 0px; - right: 0px; - bottom: 0px; - left: 0px; - height: 50px; - width: 50px; - opacity: 0.2; - z-index: 1; -} - -.sheet-imgbox-content { - z-index: 99; - position: relative; -} - - -.sheet-imgbox-defense { - /*size of your image*/ - text-align: center; - align-items: center; - justify-content: center; - vertical-align: middle; - height: 43px; - width: 43px; - padding-left: 8px; - padding-bottom: 16px; - position: relative; -} - - -.sheet-imgbox-defense::before { - text-align: center; - align-items: center; - justify-content: center; - content: ""; - position: absolute; - background-repeat: no-repeat; - background-size: 45px 45px; - background-position: 50% 25%; - top: 0px; - right: 0px; - bottom: 0px; - left: 0px; - height: 45px; - width: 45px; - opacity: 0.4; - z-index: 1; - padding-left: 8px; - padding-bottom: 20px; -} - - -.sheet-sec-border-line { - background-color: var( --bg-color ); - margin-left: -7px; - margin-right: -7px; -} - -.sheet-sec-border-line { - border-top: 2px double var( --outline-color ); - padding-top: 3px; -} - - -/*JBF@JBF to be identified, maybe dead code, and in any case shouldn't be static color*/ - -.sheet-heading { - background-color: var( --control-secondary ); - color: var( --header-font-color ); - font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; - font-weight: normal; - margin: 1px; -} - - -/* ############################################ Tables and cells #################################################### */ - -.sheet-table { - display: table; - width: 100%; -} - -.sheet-table-left { - display: table; - border-collapse: collapse; -} - -span.sheet-table-left, -.sheet-table-left .sheet-table-row span { - border-style: hidden; - border-width: 2px; - text-align: left; -} - -.sheet-table-name { - display: table-caption; - text-align: center; - font-weight: bold; - color: var( --header-font-color ); - background-color: var( --outline-color ); - width: 100%; -} - -.charsheet .sheet-headerbar, -.sheet-headerbar { - vertical-align: bottom; - justify-content: center; - align-items: center; - text-align : center; - color: var( --header-font-color ); - /* font-weight: bold; */ - background-color: var(--outline-color); - font-size: 14px; - /* font-family: Papyrus, fantasy; */ - font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; - font-weight: normal; - width: 100%; - /* margin: auto; *//* JBF@JBF 210105*/ - min-height: 21px; - display: flex; -} - -.charsheet .sheet-headerbar-flex, -.sheet-headerbar-flex { - vertical-align: bottom; - justify-content: space-between; -} - - -.sheet-creation-order { -color: yellow; -font-size: 16px; -/*text-shadow: 1px 1px white;*/ -} - -.sheet-table-header { - display: table-cell; - text-align: center; - font-style: italic; - font-weight: bold; - color: var( --header-font-color ); - vertical-align: middle; - background-color: var( --outline-color ); -} - -.sheet-table-row { - display: table-row; - vertical-align: middle; - width: 100%; -} - -.sheet-table-data { - display: table-cell; - vertical-align: middle; - text-align: center; /*JBF 20201124*/ - white-space: nowrap; -} - -hr { - border-color: black; - margin: 5px 0; -} - -.sheet-w15 { - display: table-cell; - vertical-align: middle; - text-align: left; - width: 15%; -} - -.sheet-w20 { - display: table-cell; - vertical-align: middle; - text-align: left; - width: 20%; -} -.sheet-w30 { - display: inline-block; - text-align: left; - width: 30%; -} - -.sheet-w100p { - width: 100%; -} - -/*JBF@JBF useful ???*/ -.sheet-w50 { - width: 100%; -} - - -.sheet-notes{ -width: 28%; -/* padding-left: 5px; -padding-right: 5px; */ -/* padding-bottom: 10px; */ -margin: 1%; -} - - -.sheet-flex-container { - display: flex; - align-items: flex-start; - justify-content: space-between; -} - -.sheet-flexwrap { - flex-wrap: wrap; -} - -.sheet-glossary { - /* display: flex; - align-items: flex-start; - flex-wrap: wrap; - flex-direction: column; - max-height: 150px; - height : auto; */ - display: inline-block; -} - - -.sheet-flex1 { - flex: 1; -} -/*JBF@CD -- This is a trial, but gives interesting results*/ - - -.sheet-floatRight.sheet-header-flex-container, -.sheet-floatRight.sheet-flex-container { - justify-content: flex-end; -} - -.sheet-flexCenter { - display: flex; - justify-content: center; - align-items: center; -} - -/ ############################################# Attribute Boxes ########################################################## */ - -.sheet-Attrib-container { - padding: 5px; - margin-top: 3px; - display: flex; - align-items: center; -} - -.sheet-Attrib-box { - border: 1px solid black; - border-radius: 10px; - text-align: center; - display: inline-block; - width: 130px; - margin-bottom: 3px; -} - -.sheet-Attrib-header { - display: flex; - justify-content: space-around; - align-items: flex-start; - vertical-align: top; - text-align: center; - background-color: var(--outline-color); -} - -.sheet-Defense-box { - border: 1px solid black; - border-radius: 10px; - display: flex; - margin: 3px; - align-items: center; - flex-flow: column; - width: 100px; - min-height: 80px; -} - -.sheet-Shield-box { - border: 1px solid black; - border-radius: 10px; - display: flex; - margin: 3px; - padding: 3px; - align-items: center; - flex-flow: column; -} - - - -.sheet-Attrib-rightbox { - text-align: center; - display: inline-block; -} - - -.charsheet input[type="number"].sheet-AttribValue, -.sheet-AttribValue { - background: var( --outline-color ); - border-style: none; - border-radius: 70%; - color: var( --header-font-color ); - font-weight: bold; - text-align: center; -} - -.sheet-AttribValueDiv { - margin-top: 8px; -} - - -.charsheet input[type="number"].sheet-AttribStep, -.sheet-AttribStep -{ - color: var( --highlight-font-color ); - text-shadow: 2px 2px var( --bg-color ); - font-weight:bold; - font-size: 250%; /* JBF was important */ - padding: 0; /* JBF was important */ - margin-top: 0; /* JBF was important */ - margin-bottom: 0; /* JBF was important */ - margin-left: 0; /* JBF was important */ - margin-right: -11px; /* JBF was important */ - text-align: center; /* JBF was important */ - width: 1.3em; /* JBF was important */ - font-weight: bold; - -} - -.charsheet span.sheet-AttribStepSpan, -.sheet-AttribStepSpan -{ - padding: 4px; /* JBF was important */ - -} - -/* ############################################ Formating and Length ###################################################### */ - -.sheet-fixed-width { - white-space: nowrap; - display: inline-block; -} - - -.charsheet .sheet-matrix.sheet-filter-box { - margin: 0px; - margin-bottom: 2px; - margin-right: 2px; - border-radius: 5px; - padding: 0px; - border: 1px solid black; -} - - - -.sheet-nowrap0 { - white-space: nowrap; - display: inline-block; /*JBF@CD Trial for alignment*/ - vertical-align: middle; -} - -.sheet-nowrap, -.sheet-nowrap1 { - white-space: nowrap; - padding-right: 1em; -} - -.sheet-nowrap2 { - white-space: nowrap; - padding-right: 2em; -} - -.sheet-nowrap3 { - white-space: nowrap; - padding-right: 3em; -} - -.sheet-nowrap5 { - white-space: nowrap; - padding-right: 5em; -} - -.sheet-w7 { - display: inline-block; - min-width: 7em; - padding-right: 0em; -} - -/*JBF */ -.sheet-numShorter { width: 2em !important } -.sheet-numShort { width: 3em !important } -.sheet-numLong { width: 4em !important } -.sheet-selShort { width: 5em !important } -.sheet-selLong { width: 6em !important } -.sheet-txtShort { width: 8em !important } -.sheet-txtMed { width: 9em !important } -.sheet-txtMedplus { width: 11.5em !important } -.sheet-txtLong { width: 16em !important } -.sheet-txtLonger { width: 20em !important } -.sheet-txtEvenLonger { width: 27em !important } - - -.sheet-titlespan { - margin-left: 0px; - margin-right: 0px; - text-align: center; - vertical-align: middle; -} - - -.charsheet .sheet-w25px { width: 25px; } -.charsheet .sheet-w30px { width: 30px; } -.charsheet .sheet-w50px { width: 50px; } -.charsheet .sheet-w75px { width: 75px; } -.charsheet .sheet-w100px { width: 100px; } - -.charsheet .sheet-Big { font-size: 150%;} - -.charsheet input[type="number"].sheet-Bigger, - .sheet-Bigger { - font-size: 200%; - width: 2em; - text-align: center ; -} -.sheet-small { transform: scale(0.8); /*better results ?*/} - -.charsheet input[type="number"].sheet-numHighlight, -.sheet-numHighlight { - color: var( --highlight-font-color ); - text-shadow: 2px 2px var( --bg-color ); - font-weight: bold; -} - - -.sheet-vaBottom { - vertical-align: bottom; -} - -.sheet-middle { - display: inline-block; - padding-top: 6px; -} - -.sheet-minWidth3 { - min-width: 3em; -} - - - - -/* ############################################ Variable length text boxes ########################################################## */ -/* The next few blocks are for variable length text boxes that expand as needed. sheet-label-under2 is a tall box and has labels under the text input. -The form of the html is a label or span wrapper, an input box, an span that has the invisible auto-expanding field, and an optional span that has the label. - - -To have a label in front of the expanding field, use something like this. - -*/ - -/* This is the tag that wraps the entire thing. It can be a label or a span */ -.charsheet .sheet-autoexpand-wrap { - display: inline-block; - position: relative; - width: auto; - min-width: 2em; - max-width: 50em; - margin-right: 1em; - white-space: nowrap; -} - -.charsheet .sheet-autoexpand-min4 { - min-width: 4em; - width: auto; -} - -.charsheet .sheet-autoexpand-min { - min-width: 14em; - width: auto; -} - - - -.charsheet .sheet-autoexpand-wrap:not(.sheet-label-under2) { - height: 2em; - vertical-align: middle; -} - -.charsheet .sheet-label-under:not(button), -.charsheet .sheet-label-under2 { - display: inline-block; - height: 2.75em; - vertical-align: top; -} - -/* This is the input statement that is visible. */ -.charsheet .sheet-autoexpand-wrap input { - display: block; - overflow: hidden; - width: 100%; - position: absolute; - white-space: normal; -} - -/* This is the invisible copy of the input. This css changes this invisible fields size to the length of the text in the input. The outer wrapper then changes size to match this fields length. */ -.charsheet .sheet-autoexpand-wrap span.sheet-autoexpand { - visibility: hidden; - width: 100%; - white-space: pre; /* pre-wrap; for textarea which I never got working but "pre" should also work for spans */ - word-wrap: break-word; - overflow-wrap: break-word; - overflow: hidden; - font-weight: bold; - padding-right: 2em; /* We want the text box very slightly bigger than the text. JBF@CD was 0.7 em*/ - /* also here make sure the font size is the same or slightly bigger than the input font size */ -} - -/* This is the span that holds the label that we want small at the bottom. */ -.charsheet .sheet-label-under2 span:not(.sheet-autoexpand) { - display: block; - position: relative; /*JBF@CD Changed from absolute 0 to relative -10px*/ - bottom: -13px; - line-height: .75em; - font-size: 85%; - padding-left: .25em; -} - -/* When we have the label under the field, we don't want the label to ever be longer than the field */ -.charsheet .sheet-label-under, -.charsheet .sheet-label-under2 { - overflow: hidden; -} - -.charsheet .sheet-label-under2 span, -.charsheet .sheet-label-under span, -.charsheet .sheet-label-under-select span { - line-height: 10px; - display: block; - /* font-weight: lighter; */ - font-size: 85%; - padding-left: .25em; -} - - - - - -/* ########################################### Filterboxes ####################################################### -# Filterboxes are basically repitems. Except that Filterboxes have been formated to allow certain items to be hidden -# if they don't match the requirements to be displayed. -*/ - -.charsheet .repcontainer .repitem, /* A filterbox should look exactly like a repitem. */ -.sheet-filter-box { - padding: 0px; - margin: 0px; - border: none; - border-radius: 0px; -} - - - -fieldset.repeating_spell+.repcontainer>.repitem, /* A repitem within a spell list should functionally not exist, it's place is taken by a filterbox. */ -fieldset+.repcontainer .repitem, -fieldset+.repcontainer .repitem .sheet-filter-box { - vertical-align: top; -} - -.sheet-filterSpellEffect~.repcontrol, -.sheet-testRepEditMode:not(:checked)~.repcontrol, /*hide buttons in not Edit Mode*/ -.sheet-filter-box { /* By default, display no items of a filter box */ - display: none; -} - -fieldset.sheet-filterSpellEffect+.repcontainer { - display: inline-block; -} - -.repcontainer .repitem { - overflow: hidden; -} - -fieldset+.repcontainer .repitem { - display: block; -} - -fieldset.repeating_talents+.repcontainer .repitem, /*fieldset that we want to wrap have to be specified manually*/ -fieldset.repeating_skills+.repcontainer .repitem, -fieldset.repeating_knacks+.repcontainer .repitem, -fieldset.repeating_matrix+.repcontainer .repitem, -fieldset.repeating_personality+.repcontainer .repitem, -fieldset.repeating_maneuvers+.repcontainer .repitem, -fieldset.repeating_weapons+.repcontainer .repitem { - display: inline-block; - /* padding:5px; */ -} -/* -fieldset+.repcontainer>.repitem:nth-child(2n+2){ - background:lightgrey; -} */ - -/* fieldset+.repcontainer{ - column-width:auto; -} */ - -/* Decide which specific repitems to display. */ -input.sheet-tabGrim[value="0"]~.sheet-filter-box, /* Always display all spells of circle zero, since they have just been added and have not been assigned a circle yet. */ -.sheet-tabGrim[value="0"]~fieldset.repeating_spell+.repcontainer>.repitem .sheet-filter-box, /* When tab0 is checked, display everything no matter what which of the inner boxes are checked. */ -.sheet-tabGrim~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab0:checked~.sheet-filter-box, /*always display the Circle 0 spells*/ -.sheet-tabGrim[value="1"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab1:checked~.sheet-filter-box, -.sheet-tabGrim[value="2"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab2:checked~.sheet-filter-box, -.sheet-tabGrim[value="3"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab3:checked~.sheet-filter-box, -.sheet-tabGrim[value="4"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab4:checked~.sheet-filter-box, -.sheet-tabGrim[value="5"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab5:checked~.sheet-filter-box, -.sheet-tabGrim[value="6"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab6:checked~.sheet-filter-box, -.sheet-tabGrim[value="7"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab7:checked~.sheet-filter-box, -.sheet-tabGrim[value="8"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab8:checked~.sheet-filter-box, -.sheet-tabGrim[value="9"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab9:checked~.sheet-filter-box, -.sheet-tabGrim[value="10"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab10:checked~.sheet-filter-box, -.sheet-tabGrim[value="11"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab11:not(:checked)~.sheet-filter-box, -/* fieldset.sheet-filtershortlist+.repcontainer>.repitem input.sheet-combattab:checked~.sheet-filter-box, */ -input.sheet-tabMain[value="1"]~div .sheet-section-core fieldset+.repcontainer>.repitem input.sheet-combattab~.sheet-filter-box, -input.sheet-tabMain[value="2"]~div .sheet-section-combat fieldset+.repcontainer>.repitem input.sheet-combattab:checked~.sheet-filter-box, -input.sheet-tabMain[value="3"]~div fieldset+.repcontainer>.repitem input.sheet-combattab~.sheet-filter-box, -input.sheet-tabMain[value="4"]~div fieldset+.repcontainer>.repitem input.sheet-combattab~.sheet-filter-box, -input.sheet-tabMain[value="5"]~div fieldset+.repcontainer>.repitem input.sheet-combattab~.sheet-filter-box, -input.sheet-tabMain[value="6"]~div fieldset+.repcontainer>.repitem input.sheet-combattab~.sheet-filter-box, -.sheet-section-spells fieldset:not(.sheet-filterSpellEffect)+.repcontainer>.repitem input.sheet-spelltab[value^="SPL-"]~.sheet-filter-box, -input.sheet-testSpellEffect[value="Wil"]~fieldset.sheet-filterSpellEffect+.repcontainer>.repitem input.sheet-spelltab[value="SPL-Willforce"]~.sheet-filter-box { - display: inline-block; - border: none; /*JBF*/ -} -/*JBF@JBF@CD : For Skills, Knacks and Talents, in overview, everything is displayed, and in Combat, only the checked ones)*/ - -/*JBF@JBF@CD : Do not display the spellcasting Talent twice, i.e. shown only in spell section... except in creation mode*/ -.sheet-testCreation:not([value="1"])~input.sheet-tabMain[value="1"]~div .sheet-section-core~div fieldset+.repcontainer>.repitem input.sheet-spelltab[value^="SPL-"]+input.sheet-combattab~.sheet-filter-box, -input.sheet-tabMain[value="2"]~div .sheet-section-combat~div fieldset+.repcontainer>.repitem input.sheet-spelltab[value^="SPL-"]+input.sheet-combattab:checked~.sheet-filter-box { - display: none; -} - - - /* ############################################ Tabs ################################################################### */ - - div[class^="sheet-section"] { /* Every class that starts with "sheet-section" starts out hidden */ - visibility: hidden; - opacity: 0; - max-height: 0; - overflow: hidden; - max-width: 0; - padding: 0; -} - -.sheet-tabMain.sheet-tab1 { - margin-left: 10px; -} - -input.sheet-tabMain, -input.sheet-tabSpell, -input.sheet-tabGrim, -input.sheet-tabAdjust { - width: 70px; - height: 20px; - cursor: pointer; - position: relative; - opacity: 0; - z-index: 9999; - vertical-align: middle; - margin-right: 3px; -} - -input.sheet-tabMain { - margin-right: 4px; -} - -.sheet-tabMain::before, -.sheet-tabSpell::before, -.sheet-tabGrim::before, -.sheet-tabAdjust::before { - content: attr(title); - text-align: center; - display: inline-block; - width: 100%; - height: 100%; - background-color: var( --outline-color ); - color: var( --header-font-color ); - font-weight: bold; -} - -input.sheet-tabMain+span, -input.sheet-tabSpell+span, -input.sheet-tabGrim+span, -input.sheet-tabAdjust+span, -.sheet-tabSpan { - text-align: center; - display: inline-block; - font-size: 13px; - background-color: var( --inactive-color ); - color: var( --header-font-color ); - font-weight: bold; - width: 70px; - height: 20px; - border-radius: 10px 10px 0 0; - cursor: pointer; - position: relative; - margin-left: -75px; -} - -input.sheet-tabshort { - width: 40px; -} - -input.sheet-tabshort+span{ -width: 40px; -margin-left: -45px; -} - -.sheet-tabSpell, -.sheet-tabAdjust { - width: 80px; -} - -.sheet-tabSpell+span, -.sheet-tabAdjust+span { - width: 80px; - margin-left: -85px; -} - -.sheet-sec-spacer { /* When have two tabs right under each other, space them by this much. */ - height: 3px; -} - -/* Make the selected section visible */ -input.sheet-tabMain[value="1"]~div .sheet-section-core, -input.sheet-tabMain[value="2"]~div .sheet-section-combat, -input.sheet-tabMain[value="3"]~div .sheet-section-talents, -input.sheet-tabMain[value="4"]~div .sheet-section-knacks, -input.sheet-tabMain[value="5"]~div .sheet-section-skills, -input.sheet-tabMain[value="6"]~div .sheet-section-spells, -input.sheet-tabMain[value="7"]~div .sheet-section-equipment, -input.sheet-tabMain[value="8"]~div .sheet-section-gear, -input.sheet-tabMain[value="9"]~div .sheet-section-notes, -input.sheet-tabMain[value="10"]~div .sheet-section-record, -input.sheet-tabMain[value="11"]~div .sheet-section-adjustments, -input.sheet-tabSpell[value="1"]~.sheet-section-spells-talents, -input.sheet-tabSpell[value="2"]~.sheet-section-spells-matrices, -input.sheet-tabMain[value="1"]~div .sheet-section-spells-matrices, -input.sheet-tabMain[value="2"]~div .sheet-section-spells-matrices, -input.sheet-tabMain:not([value="2"]):not([value="1"])~div input.sheet-tabSpell[value="3"]~.sheet-section-spells-grimoire, -input.sheet-tabAdjust[value="1"]~.sheet-section-adjustments-common, -input.sheet-tabAdjust[value="2"]~.sheet-section-adjustments-maneuvers, -input.sheet-tabAdjust[value="3"]~.sheet-section-adjustments-advanced, -input.sheet-tabAdjust[value="4"]~.sheet-section-adjustments-release , -input.sheet-tabAdjust[value="5"]~.sheet-section-adjustments-help { - max-height: 999999px; - max-width: 999999px; - visibility: visible; - opacity: 1; - transition: opacity 0.5s linear 0s; - overflow: hidden; -} - - -input.sheet-tabMain[value="1"] ~ .sheet-show-leftpane-tab1:not([value="1"])~div .sheet-leftpane, -input.sheet-tabMain[value="2"] ~ .sheet-show-leftpane-tab2:not([value="1"])~div .sheet-leftpane, -input.sheet-tabMain[value="3"] ~ .sheet-show-leftpane-tab3:not([value="1"])~div .sheet-leftpane, -input.sheet-tabMain[value="4"] ~ .sheet-show-leftpane-tab4:not([value="1"])~div .sheet-leftpane, -input.sheet-tabMain[value="5"] ~ .sheet-show-leftpane-tab5:not([value="1"])~div .sheet-leftpane, -input.sheet-tabMain[value="6"] ~ .sheet-show-leftpane-tab6:not([value="1"])~div .sheet-leftpane, -input.sheet-tabMain[value="7"] ~ .sheet-show-leftpane-tab7:not([value="1"])~div .sheet-leftpane, -input.sheet-tabMain[value="8"] ~ .sheet-show-leftpane-tab8:not([value="1"])~div .sheet-leftpane, -input.sheet-tabMain[value="9"] ~ .sheet-show-leftpane-tab9:not([value="1"])~div .sheet-leftpane, -input.sheet-tabMain[value="10"] ~ .sheet-show-leftpane-tab10:not([value="1"])~div .sheet-leftpane, -input.sheet-tabMain[value="11"] ~ .sheet-show-leftpane-tab11:not([value="1"])~div .sheet-leftpane, -input.sheet-tabMain[value="1"] ~ .sheet-show-middlepane-tab1:not([value="1"])~div .sheet-middlepane, -input.sheet-tabMain[value="2"] ~ .sheet-show-middlepane-tab2:not([value="1"])~div .sheet-middlepane, -input.sheet-tabMain[value="3"] ~ .sheet-show-middlepane-tab3:not([value="1"])~div .sheet-middlepane, -input.sheet-tabMain[value="4"] ~ .sheet-show-middlepane-tab4:not([value="1"])~div .sheet-middlepane, -input.sheet-tabMain[value="5"] ~ .sheet-show-middlepane-tab5:not([value="1"])~div .sheet-middlepane, -input.sheet-tabMain[value="6"] ~ .sheet-show-middlepane-tab6:not([value="1"])~div .sheet-middlepane, -input.sheet-tabMain[value="7"] ~ .sheet-show-middlepane-tab7:not([value="1"])~div .sheet-middlepane, -input.sheet-tabMain[value="8"] ~ .sheet-show-middlepane-tab8:not([value="1"])~div .sheet-middlepane, -input.sheet-tabMain[value="9"] ~ .sheet-show-middlepane-tab9:not([value="1"])~div .sheet-middlepane, -input.sheet-tabMain[value="10"] ~ .sheet-show-middlepane-tab10:not([value="1"])~div .sheet-middlepane, -input.sheet-tabMain[value="11"] ~ .sheet-show-middlepane-tab11:not([value="1"])~div .sheet-middlepane, -input.sheet-tabMain[value="1"] ~ .sheet-show-rightpane-tab1:not([value="1"])~div .sheet-rightpane, -input.sheet-tabMain[value="2"] ~ .sheet-show-rightpane-tab2:not([value="1"])~div .sheet-rightpane, -input.sheet-tabMain[value="3"] ~ .sheet-show-rightpane-tab3:not([value="1"])~div .sheet-rightpane, -input.sheet-tabMain[value="4"] ~ .sheet-show-rightpane-tab4:not([value="1"])~div .sheet-rightpane, -input.sheet-tabMain[value="5"] ~ .sheet-show-rightpane-tab5:not([value="1"])~div .sheet-rightpane, -input.sheet-tabMain[value="6"] ~ .sheet-show-rightpane-tab6:not([value="1"])~div .sheet-rightpane, -input.sheet-tabMain[value="7"] ~ .sheet-show-rightpane-tab7:not([value="1"])~div .sheet-rightpane, -input.sheet-tabMain[value="8"] ~ .sheet-show-rightpane-tab8:not([value="1"])~div .sheet-rightpane, -input.sheet-tabMain[value="9"] ~ .sheet-show-rightpane-tab9:not([value="1"])~div .sheet-rightpane, -input.sheet-tabMain[value="10"] ~ .sheet-show-rightpane-tab10:not([value="1"])~div .sheet-rightpane, -input.sheet-tabMain[value="11"] ~ .sheet-show-rightpane-tab11:not([value="1"])~div .sheet-rightpane { - display:none; -} - - -.sheet-tabMain[value="1"]~div .sheet-testRepEditMode:not(:checked) ~ .repcontainer .sheet-HideIfOverviewNoEdit, -.sheet-testCreation:not([value="1"])~.sheet-tabMain[value="1"]~div .sheet-HideIfOverviewNoCreation, -.sheet-tabMain[value="1"]~div .sheet-testRepEditMode:not(:checked) ~ .sheet-HideIfOverviewNoEdit, -.sheet-tabMain[value="1"]~div .sheet-testRepEditMode:not(:checked)~div .sheet-HideIfOverviewNoEdit, -.sheet-tabMain[value="1"]~div .sheet-HideIfOverview, -.sheet-tabMain:not([value="1"])~div .sheet-HideIfNotOverview, -.sheet-tabMain[value="2"]~div .sheet-testRepEditMode:not(:checked) ~ .repcontainer .sheet-HideIfCombatNoEdit, -.sheet-tabMain[value="2"]~div .sheet-testRepEditMode:not(:checked) ~ .sheet-HideIfCombatNoEdit, -.sheet-tabMain[value="2"]~div .sheet-testRepEditMode:not(:checked) ~ div>.sheet-HideIfCombatNoEdit, -.sheet-tabMain[value="2"]~div .sheet-HideIfCombat, -.sheet-tabMain:not([value="2"])~div .sheet-HideIfNotCombat { - display: none; -/* border: 1px yellow solid; */ -} - - -/* Highlight the selected tab */ -input.sheet-tabMain:checked + span, -input.sheet-tabSpell:checked + span, -input.sheet-tabGrim:checked + span, -input.sheet-tabAdjust:checked + span, -input.sheet-tabMain:checked + .sheet-testCloseChecked + .sheet-HideIfCloseChecked, -input.sheet-tabMain:checked + .sheet-testCloseChecked + .sheet-HideIfCloseChecked + .sheet-HideIfNotCloseChecked { - background-color: var( --outline-color ); - color: var( --header-font-color ); - border: 1px solid black; -} - -/* ############################################ JBF Icons and images ################################################### */ - -.sheet-icon-damage-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Damage-background.png);} /*License Information*/ -.sheet-icon-devotion-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Devotion.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/angel-outfit.html#download*/ -.sheet-icon-initiative-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Initiative.png); } /*License Information*/ -.sheet-icon-interdiction-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Interdiction.png); } /*License Information*/ -.sheet-icon-karma-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Karma.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/entangled-typhoon.html*/ -.sheet-icon-MA-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/MA.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-MD-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/MD.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-PA-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/PA.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/chest-armor.html#download*/ -.sheet-icon-PD-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/PD.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/swords-emblem.html*/ -.sheet-icon-recovery-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Recovery.png); } /*Creative Commons :https://game-icons.net/1x1/delapouite/caduceus.html#download*/ -.sheet-icon-SD-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/SD.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-stun-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Stun.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-wounds-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Wounds-background.png);} /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ - - -.sheet-icon-action { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action.png); } /*License Information*/ -.sheet-icon-action-free { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action-Free.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ -.sheet-icon-action-simple { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action-Simple.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ -.sheet-icon-action-standard { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action-Standard.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ -.sheet-icon-action-sustained { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action-Sustained.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ -.sheet-icon-action-white { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action-white.png); } /*License Information*/ -.sheet-icon-action-na { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action-NA.png); } /* https://findicons.com/files/icons/2610/flat_weather_icons/128/na.png */ -.sheet-icon-agressive { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Agressive.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ -.sheet-icon-ambush { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Ambush.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ -.sheet-icon-armor { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Armor.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ -.sheet-icon-ask { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Ask.png); } /*License Information*/ -.sheet-icon-attacks { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Attacks.png); } /*Creative Commons: https://game-icons.net/1x1/sbed/falling.html#download*/ -.sheet-icon-attacks-cc { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Attacks-cc.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/blade-drag.html#download*/ -.sheet-icon-blindsided { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Blindsided.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/backstab.html#download*/ -.sheet-icon-blindsiding { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Blindsiding.png); } /*Creative Commons: https://game-icons.net/1x1/darkzaitzev/hooded-assassin.html#download*/ -.sheet-icon-calledshot { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/CalledShot.png); } /*Creative Commons: https://game-icons.net/1x1/darkzaitzev/hooded-assassin.html#download*/ -.sheet-icon-charging { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Charging.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/rhinoceros-horn.html#download*/ -.sheet-icon-coin { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Coin.png); } /*Creative Commons: https://game-icons.net/1x1/darkzaitzev/hooded-assassin.html#download*/ -.sheet-icon-coin-copper { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Coin-Copper.png); } /*Creative Commons: https://game-icons.net/1x1/darkzaitzev/hooded-assassin.html#download*/ -.sheet-icon-coin-silver { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Coin-Silver.png); } /*Creative Commons: https://game-icons.net/1x1/darkzaitzev/hooded-assassin.html#download*/ -.sheet-icon-coin-gold { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Coin-Gold.png); } /*Creative Commons: https://game-icons.net/1x1/darkzaitzev/hooded-assassin.html#download*/ -.sheet-icon-cover { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Cover.png); } /*Creative Commons: https://game-icons.net/1x1/heavenly-dog/defensive-wall.html#download*/ -.sheet-icon-cover99 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Cover-99.png); } /*Creative Commons: https://game-icons.net/1x1/heavenly-dog/defensive-wall.html#download*/ -.sheet-icon-damage-cc { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Damage-cc.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/dripping-knife.html#download*/ -.sheet-icon-damage { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Damage.png); } /*Creative Commons: https://game-icons.net/1x1/sbed/falling.html#download*/ -.sheet-icon-death { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Death.png); } /*Creative Commons :https://game-icons.net/1x1/heavenly-dog/defensive-wall.html#download*/ -.sheet-icon-defenses { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Defenses.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/shield-echoes.html#download*/ -.sheet-icon-defenses-white { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Defenses-White.png); } /*Creative Commons :https://game-icons.net/1x1/heavenly-dog/defensive-wall.html#download*/ -.sheet-icon-defensive { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Defensive.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/arrows-shield.html#download*/ -.sheet-icon-defensive-exc { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Defensive-exc.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/arrows-shield.html#download*/ -.sheet-icon-devotion { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Devotion.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/angel-outfit.html#download*/ -.sheet-icon-devotion-on { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Devotion-On.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/angel-outfit.html#download*/ -.sheet-icon-devotion-ask { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Devotion-Ask.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/angel-outfit.html#download*/ -.sheet-icon-devotion2 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Devotion2.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/angel-outfit.html#download*/ -.sheet-icon-devotion3 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Devotion3.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/angel-outfit.html#download*/ -.sheet-icon-dice { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Dice.png); } /* https://static.thenounproject.com/png/1279708-200.png */ -.sheet-icon-edit { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Edit.png); } /*License Information*/ -.sheet-icon-edit-white { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Edit-White.png); } /*License Information*/ -.sheet-icon-effect { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Effect.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/star-swirl.html#download*/ -.sheet-icon-effect-white { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Effect-white.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/star-swirl.html#download*/ -.sheet-icon-entangled { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Entangled.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/fishing-net.html*/ -.sheet-icon-flying { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Flying.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/fishing-net.html*/ -.sheet-background-frame1 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame1.jpg); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-background-frame2 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame2.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-background-frame3 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame3.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-background-frame4 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame4.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-background-frame5 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame5.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-background-frame6 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame6.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-background-frame7 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame7.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-background-frame8 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame8.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-background-frame9 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame9.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-grimoire { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Grimoire.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/fishing-net.html*/ -.sheet-icon-harried { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Harried.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/screaming.html#download*/ -.sheet-icon-harried3 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Harried3.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/screaming.html#download*/ -.sheet-icon-harried4 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Harried4.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/screaming.html#download*/ -.sheet-icon-harried5 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Harried5.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/screaming.html#download*/ -.sheet-icon-impaired { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Impaired.png); } /*Creative Commons: https://game-icons.net/1x1/sbed/falling.html#download*/ -.sheet-icon-impaired4 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Impaired4.png); } /*Creative Commons: https://game-icons.net/1x1/sbed/falling.html#download*/ -.sheet-icon-initiative { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Initiative.png); } /*License Information*/ -.sheet-icon-initiative-noarmor { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Initiative-NoArmor.png);}/*https://static.thenounproject.com/png/539377-200.png */ -.sheet-icon-interdiction { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Interdiction.png); } /*License Information*/ -.sheet-icon-inventory { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Inventory.png); } /*License Information*/ -.sheet-icon-jumpup { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/JumpUp.png); } /*License Information*/ -.sheet-icon-karma { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Karma.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/entangled-typhoon.html*/ -.sheet-icon-karma2 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Karma2.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/entangled-typhoon.html*/ -.sheet-icon-karma3 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Karma3.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/entangled-typhoon.html*/ -.sheet-icon-karma-ask { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Karma-Ask.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/entangled-typhoon.html*/ -.sheet-icon-karma-on { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Karma-On.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/entangled-typhoon.html*/ -.sheet-icon-kit { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Kit.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/entangled-typhoon.html*/ -.sheet-icon-knockeddown { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Knockdown.png); } /*Creative Commons: https://game-icons.net/1x1/sbed/falling.html#download*/ -.sheet-icon-leftpane { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/LeftPane-White.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-link { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Link.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-link-out { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Link-out.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-link-in { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Link-in.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-link-in-out { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Link-In-Out.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-MA { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/MA.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-maneuver-creature { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Maneuver-Creature.png);} /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-maneuver-opponent { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Maneuver-Opponent.png);} /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-maneuver-show { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Maneuver-Show.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-matrix { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Matrix.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-matrix-attune { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Matrix-Attune.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-matrix-enhanced { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Matrix-Enhanced.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-matrix-armored { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Matrix-Armored.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-matrix-shared { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Matrix-Shared.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-MD { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/MD.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-move-based { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Move-Based.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-naked { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Naked.png); } /*https://game-icons.net/1x1/delapouite/chat-bubble.html#download*/ -.sheet-icon-naked-white { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Naked-white.png); } /*https://game-icons.net/1x1/delapouite/chat-bubble.html#download*/ -.sheet-icon-newday { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/NewDay.png); } /*https://game-icons.net/1x1/delapouite/chat-bubble.html#download*/ -.sheet-icon-notes { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Notes.png); } /*https://game-icons.net/1x1/delapouite/chat-bubble.html#download*/ -.sheet-icon-noshield { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/NoShield.png); } /*https://game-icons.net/1x1/skoll/shield-disabled.html#downloadd*/ -.sheet-icon-PA { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/PA.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/chest-armor.html#download*/ -.sheet-icon-parameter { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Parameter.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-parameter-white { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Parameter-white.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-partialcover { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/PartialCover.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-PD { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/PD.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/swords-emblem.html*/ -.sheet-icon-poisoned { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Poisoned.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-potion { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Potion.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-rangelong { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/RangeLong.png); } /*Creative Commons: https://game-icons.net/1x1/sbed/falling.html#download*/ -.sheet-icon-ration { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Ration.png); } /*Creative Commons: https://game-icons.net/1x1/sbed/falling.html#download*/ -.sheet-icon-recovery { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Recovery.png); } /*Creative Commons :https://game-icons.net/1x1/delapouite/caduceus.html#download*/ -.sheet-icon-reserved { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Reserved.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-resistance { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Resistance.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-rolltype-ask { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Rolltype-ask.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-rolltype-public { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Rolltype-Public.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-rolltype-PGM { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Rolltype-PGM.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-rolltype-GM { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Rolltype-GM.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-SD { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/SD.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-shield { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Shield.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ -.sheet-icon-split { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Split.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-stealthy { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Stealthy.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ -.sheet-icon-strain { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Strain.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-strain1 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Strain1.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-strain2 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Strain2.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-strain3 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Strain3.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-stun { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Stun.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-stun-white { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Stun-white.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-sum { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Sum.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-surprised { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Surprised.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-tail { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Tail.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-tips-edit { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Tips-Edit.gif); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-tips-mods { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Tips-Mods.gif); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-tips-tooltip { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Tips-Tooltip.gif); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-tknactn { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/TknActn.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-TN { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/TN.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-vision { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Vision.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-vision4 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Vision4.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-vision-based { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Vision-Based.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-weapon { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Weapon.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-wealth { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Wealth.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-weave { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Weave.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-weave-extra { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Weave.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ -.sheet-icon-willforce { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Willforce.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ - -/* Elsewhere in this file there are url's describing Strain.png, Frame20.png, - and two logo's that are stored on on amazon servers instead of github. - a few hundred lines down also find .sheet-rolltemplate-icon-ask and about 15 other definitions, but they all use icons already defined above. -*/ - -.sheet-frame { - background-size: 100% 100%; - /* Temporarly disabled to work on the color palette */ - /* background-size: 0% 0%; */ -} - - - - - -.sheet-frameBig { - /* background-size: 110% 110%; Temporarly disabled to work on the color palette*/ - background-size: 0% 0%; -} - -.sheet-iconlabel-white.sheet-iconpaddedright, -.sheet-iconlabel-header.sheet-iconpaddedright, -.sheet-iconpaddedright { - padding-right: 3px ; /* JBF was important*/ - margin-left: -3px ; /* JBF was important*/ - padding-top: 0px ; /* JBF was important*/ - padding-bottom: 0px ; /* JBF was important*/ - border: 1px solid transparent; - vertical-align: middle; -} -.sheet-iconlabel-white.sheet-iconpaddedleft, -.sheet-iconlabel-header.sheet-iconpaddedleft, -.sheet-iconpaddedleft { - padding-left: 3px ; /* JBF was important*/ - margin-right: -3px ; /* JBF was important*/ - padding-top: 0px ; /* JBF was important*/ - padding-bottom: 0px ; /* JBF was important*/ - vertical-align: middle; -} - -.sheet-undernumber { - padding-top: 0px; - margin-top: -4px; -} - - -.sheet-Karma-ControlBox { - white-space: nowrap; - display: inline-block; - width: 30px; - text-align: center; - vertical-align: middle; - padding: 0; - margin: 1px; -} - -/* ############################################ JBF : Icon checkboxes Management #################################### */ -.charsheet input.sheet-iconcheckbox { - display:none; -} - -.sheet-iconlabel-header-invert, -.sheet-iconlabel-invert, -.sheet-iconlabel-header, -.sheet-iconlabel { - display: inline-block; - padding: 1px; - height: 20px; - width: 20px; - margin: 0px; - vertical-align: middle; - border-radius: 5px; - opacity: 0.7; - border: 1px solid transparent; - background-color: var( --icon-color); -} - - -.sheet-iconlabel-white { - display: inline-block; - padding: 2px; - opacity: 0.5; - height: 20px; - width: 20px; - margin: 0px; - border: 1px solid transparent; - vertical-align: middle; -} - -.sheet-iconlabelsmall { - display: inline-block; - vertical-align: middle; - padding: 0px; - opacity: 0.7; - width: 15px; - margin: 0px; - border: 1px solid transparent; -} - -.sheet-iconlabelCC { - display: inline-block; - vertical-align: middle; - padding: 0px; - opacity: 1; - width: 20px; - margin: 0px; - border: 1px solid transparent; - background-color: var( --icon-color); -} - -.sheet-iconlabelbig { - display: inline-block; - vertical-align: middle; - padding: 1px; - opacity: 1; - width: 30px; - margin: 0px; - border: 1px solid transparent; - background-color: var( --icon-color); -} - -.sheet-iconstatic { - width: 20px; - text-align: center; - vertical-align: middle; - padding: 0px; - margin: 0px; -} - -.sheet-iconstaticsmall { - width: 15px; - text-align: center; - vertical-align: middle; - padding: 0px; - margin: 0px; -} - -.sheet-iconstaticBig { - width: 30px; - text-align: center; - vertical-align: middle; - padding: 0px; - margin: 0px; - margin-right: -5px; -} - -input.sheet-iconcheckbox:not(:checked) + .sheet-iconlabel-header-invert, -input.sheet-iconcheckbox:not(:checked) + .sheet-iconlabel-invert, -input.sheet-iconcheckbox:checked + .sheet-iconlabel-header, -input.sheet-iconcheckbox:checked + .sheet-iconlabelsmall, -input.sheet-iconcheckbox:checked + .sheet-iconlabel { - opacity: 1; - border: 1px solid black; -} - - - - -input.sheet-iconcheckbox:checked + .sheet-iconlabel-white, -input.sheet-iconcheckbox:not(:checked) + .sheet-iconlabelbig { - opacity: 1; - border: 1px solid transparent; -} - -input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabel-invert:hover, -input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabel-header-invert:hover, -input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabel-header:hover, -input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabelCC:hover, -input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabelbig:hover, -input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabelsmall:hover, -input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabel:hover, -input[type="radio"].sheet-iconcheckbox:not(:checked) + .sheet-iconlabel:hover { - background-color: var( --hover-color-bg ); - background-position: 0 -15px; - background-position-x: 0px; - background-position-y: -15px; - -webkit-transition: background-position .1s linear; - -moz-transition: background-position .1s linear; - -ms-transition: background-position .1s linear; - -o-transition: background-position .1s linear; - transition: background-position .1s linear; - transition-property: background-position; - transition-duration: 0.1s; - transition-timing-function: linear; - transition-delay: 0s; - border : 1px solid var( --hover-color ); -} - -input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabel-white:hover, -input[type="radio"].sheet-iconcheckbox:not(:checked) + .sheet-iconlabel-white:hover { - border : 1px solid red; - opacity: 0.8; -} - -/*JBF@JBF : logic hiding unchecked icons when the header is not hovered*/ - -.sheet-header-flex-container:not(:hover) .sheet-iconcheckbox:checked+.sheet-iconlabel-header-invert, -.sheet-header-flex-container:not(:hover) .sheet-iconcheckbox:not(:checked)+.sheet-iconlabel-header { - height: 0px; - /* width:0px; */ - border: 1px solid transparent; - background : transparent; - /* padding: 0px; */ - margin: 0px; -} - -/*JBF@JBF : logic collapsing the icon container */ -.sheet-iconlabel2 { - margin: 0px !important; - padding: 0px !important; - min-width: 0px !important; - flex-grow: 0; /* it cant grow anymore... We want it to collapse */ - flex-shrink: 1; -} - - -/* ####################################### JBF : Strain icon */ -/* JBF version with the drop of blood */ -input[type="text"].sheet-strainicon { - background: var(--locked-color); - background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Strain.png); - background-repeat: no-repeat; - width: 2.5em; - height: 2.5em; - background-position: 0px -3px; - background-size: cover; - color: var( --header-font-color ); - font-size: 11px; - font-family : initial; -} - -.sheet-info { - float: right; - margin-top: -6px; - height: 30px; - font-family: "Pictos"; - font-size: 24px; -} - - -/* ############################################ Roll Templates & colors ###################################################### */ -/* For some weird Reason, the Print format must be in between the roll templates and the API buttons. DO NOT MOVE */ - -.sheet-rolltemplate-chatrecord { -/* background-color: LightBlue; */ -} - - - -.sheet-rolltemplate-chatrecord table, -.sheet-rolltemplate-rolltargetnumber table { - width: 100%; - border: 1px solid black; - color: black; - font-size: 1em; - font-family: "Helvetica Neue", Helvetica, sans-serif; -} - -.sheet-rolltemplate-chatrecord thead, -.sheet-rolltemplate-rolltargetnumber thead { - border-bottom: 1px solid black; - line-height: 1.6em; - font-size: 1.2em; - /* font-family: Papyrus, fantasy; */ - font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; - font-weight: normal; -} - -.sheet-rolltemplate-chatrecord th { - background-color: #660066; - color: white; - padding-left: 5px; - vertical-align: middle; -} - -.sheet-rolltemplate-rolltargetnumber th { - background-color: #000066; - padding-left: 5px; - vertical-align: middle; - color: white; -} - -.sheet-rolltemplate-chatrecord td, -.sheet-rolltemplate-rolltargetnumber td { - padding: 5px; - border-bottom: 1px solid black; -} - -.sheet-rolltemplate-chatrecord tr:nth-child(odd), -.sheet-rolltemplate-rolltargetnumber tr:nth-child(odd) { - background-color: rgba(217, 217, 214, 1); -} - -.sheet-rolltemplate-chatrecord tr:nth-child(even), -.sheet-rolltemplate-rolltargetnumber tr:nth-child(even) { - background-color: rgba(233, 233, 233, 1); -} - -.sheet-rolltemplate-chatrecord td:first-child, -.sheet-rolltemplate-rolltargetnumber td:first-child { - text-align: right; - font-weight: bold; -} - - -.sheet-rolltemplate-chatrecord a[href^="!"] { - border: 0.8px; - padding: 5px; - background-color: PaleGreen; - color: black; -} - - -/* These are all tries for formatting the API roll templates*/ -.sheet-rolltemplate-sect{ - background-color: white; - background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame20.png); - background-size : 103% 103%; - background-position: 55% 53%; - border: solid 2px black; - padding: 13px; - border-radius: 5px; - overflow: hidden; - width: 90%; -} - -.sheet-rolltemplate-body { - text-align: left; - padding-left: 5px; - padding-right: 0px; - padding-bottom: 2px; - line-height: 1.5em; -} - -.sheet-rolltemplate-subheadertext { -line-height: 0.9em; -font-size: 0.9em; -font-weight: lighter; -color: black; -background: transparent; -text-align: center; -margin-top: -0.1em; -margin-bottom: 0.2em; -} - -.sheet-rolltemplate-header { - font-weight: bold; - text-align: center; - color: black; - background: white; - /* font-family: Papyrus, fantasy; */ - font-family: 'Aladin', Papyrus, "Helvetica Neue", Helvetica, sans-serif; - vertical-align: middle; - line-height: 1.2em; - font-size: 1.2em; - margin-bottom: 3px; -} - -.sheet-rolltemplate-header::before { - content: ""; - display: inline-block; - /* background: url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Long-Range.png") no-repeat; */ - background-size: 20px !important; - background-repeat: no-repeat; - width: 20px; - height: 20px; - margin: 0 6px 0 0; -} - -.sheet-rolltemplate-button { - background-color: firebrick !important; - color: white !important; - padding: 1px 8px !important; - border: 1px solid black !important; - margin: 2px 5px !important; - min-width: auto; - border-radius: 5px; -} - -.sheet-rolltemplate-icon-ask, -.sheet-rolltemplate-icon-pd, -.sheet-rolltemplate-icon-md, -.sheet-rolltemplate-icon-sd, -.sheet-rolltemplate-icon-action, -.sheet-rolltemplate-icon-attacks, -.sheet-rolltemplate-icon-attackcc, -.sheet-rolltemplate-icon-init, -.sheet-rolltemplate-icon-initrep, -.sheet-rolltemplate-icon-weave, -.sheet-rolltemplate-icon-knockdown { - color: darkgreen; - border-bottom: 4px darkgreen solid; -} - -.sheet-rolltemplate-icon-effect, -.sheet-rolltemplate-icon-damage, -.sheet-rolltemplate-icon-damagecc { - color: firebrick; - border-bottom: 4px firebrick solid; -} - -.sheet-rolltemplate-icon-recovery { - color: darkgoldenrod; - border-bottom: 4px darkgoldenrod solid; -} - - - - -.sheet-rolltemplate-icon-ask::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Ask.png);} -.sheet-rolltemplate-icon-pd::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/PD.png);} -.sheet-rolltemplate-icon-md::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/MD.png);} -.sheet-rolltemplate-icon-sd::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/SD.png);} -.sheet-rolltemplate-icon-action::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action.png);} -.sheet-rolltemplate-icon-effect::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Effect.png);} -.sheet-rolltemplate-icon-attacks::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Attacks.png);} -.sheet-rolltemplate-icon-attackcc::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Attacks-cc.png);} -.sheet-rolltemplate-icon-damage::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Damage.png);} -.sheet-rolltemplate-icon-damagecc::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Damage-cc.png);} -.sheet-rolltemplate-icon-init::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Initiative.png);} -.sheet-rolltemplate-icon-initrep::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Initiative.png);} -.sheet-rolltemplate-icon-recovery::before, -.sheet-rolltemplate-icon-recoveryrep::before{ background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Recovery.png);} -.sheet-rolltemplate-icon-weave::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Weave.png);} -.sheet-rolltemplate-icon-knockdown::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Knockdown.png);} - - - -/* ####################### Print Format ################# */ - -/* For some weird Reason, the Print format must be in between the roll templates and the API buttons. DO NOT MOVE */ - -@media print { - /* All your print styles go here */ - /* .sheet-buffSignLeft, - .sheet-buffSignRight, - .sheet-buffLeft, - .sheet-buffRight - { display: none !important; } */ - - .sheet-ShowIfPrint { - display: inline-block !important; - } - - .ui-dialog { - position: static !important; - } - - .sheet-redGreen[value^="-"]~ b, - .sheet-greenRed[value^="-"]~ b, - .sheet-redGreen[value="0"] ~ input, - .sheet-greenRed[value="0"] ~ input, - .sheet-redGreen[value="0"] ~ b, - .sheet-greenRed[value="0"] ~ b { - /* color: transparent !important; */ - } - - -/*Manage the display of the different sections*/ - - .sheet-tabGrim~fieldset.repeating_spell+.repcontainer>.repitem .sheet-filter-box /* display everything no matter what which of the inner boxes are checked. */ - { - display: block; - border: none; /*JBF*/ - } - /*JBF@JBF@CD : For Skills, Knacks and Talents, in overview, everything is displayed, and in Combat, only the checked ones)*/ - - - - input.sheet-tabMain~div .sheet-section-core, - input.sheet-tabMain~div .sheet-section-talents, - input.sheet-tabMain~div .sheet-section-knacks, - input.sheet-tabMain~div .sheet-section-skills, - input.sheet-tabMain~div .sheet-section-spells, - input.sheet-tabMain~div .sheet-section-equipment, - input.sheet-tabMain~div .sheet-section-gear, - input.sheet-tabMain~div .sheet-section-notes, - input.sheet-tabMain~div .sheet-section-record, - input.sheet-tabSpell~.sheet-section-spells-talents, - input.sheet-tabSpell~.sheet-section-spells-matrices, - input.sheet-tabSpell~.sheet-section-spells-grimoire { - max-height: 999999px; - max-width: 999999px; - visibility: visible; - opacity: 1; - transition: opacity 0.5s linear 0s; - break-after: auto; - /* border-top: 2px double var(--outline-color); */ - } - - .sheet-tabMain~div .repcontainer .sheet-HideIfOverviewNoEdit, - .sheet-tabMain~div .sheet-HideIfOverviewNoEdit, - .sheet-tabMain~div .sheet-HideIfOverview, - .sheet-tabMain~div .sheet-HideIfNotOverview, - .sheet-tabMain~div .repcontainer .sheet-HideIfCombatNoEdit, - .sheet-tabMain~div .sheet-HideIfCombatNoEdit, - .sheet-tabMain~div .sheet-HideIfCombat, - .sheet-tabMain~div .sheet-HideIfNotCombat { - display: inline-block !important; - } - - #macrobar, - #macrobar_macros, - #edit-button, - #playerzone, - .sheet-icon-link-in, - .sheet-icon-link-out, - .sheet-icon-link-in-out, - .repcontrol, - .sheet-testEdition[value="3"]~div .sheet-HideIfEdition3, - .sheet-testEdition:not([value="3"])~div .sheet-HideIfNotEdition3, - .sheet-testEdition[value="4"]~div .sheet-HideIfEdition4, - .sheet-testEdition:not([value="4"])~div .sheet-HideIfNotEdition4, - .sheet-testCloseChecked:checked+.sheet-HideIfCloseChecked, - .sheet-testCloseChecked:not(:checked)+.sheet-HideIfNotCloseChecked, - .sheet-testCloseChecked:not(:checked)+.sheet-HideIfCloseChecked+.sheet-HideIfNotCloseChecked, - .nav-tabs, - .nav, - .sheet-Creation, - .sheet-HideIfPrint, - .sheet-tabMain~div .repcontainer .sheet-HideIfOverviewNoEdit.sheet-HideIfPrint, - .sheet-tabMain~div .sheet-HideIfOverviewNoEdit.sheet-HideIfPrint, - .sheet-tabMain~div .sheet-HideIfOverview.sheet-HideIfPrint, - .sheet-tabMain~div .sheet-HideIfNotOverview.sheet-HideIfPrint, - .sheet-tabMain~div .repcontainer .sheet-HideIfCombatNoEdit.sheet-HideIfPrint, - .sheet-tabMain~div .sheet-HideIfCombatNoEdit.sheet-HideIfPrint, - .sheet-tabMain~div .sheet-HideIfCombat.sheet-HideIfPrint, - .sheet-tabMain~div .sheet-HideIfNotCombat.sheet-HideIfPrint, - .sheet-testAPI:not([value="1"])~div .sheet-api, - .sheet-testAPI:[value="1"]~div .sheet-NoAPI { - display: none !important; - } - - .sheet-headerbar { - color : white !important; - background-color : var(--outline-color) !important; - /* font-family: Papyrus, fantasy; */ - font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; - font-weight: normal; - } - - .sheet-text-button-header { - color : var(--input-color) !important; - background-color : var(--outline-color) !important; - /* font-family: Papyrus, fantasy; */ - font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; - font-weight: normal; - } - - - .sheet-leftpane, - .sheet-middlepane { - width:200px; - } - - .sheet-flex-container { - display: flex; - align-items: flex-start; - justify-content: space-between; - } - -} /* end media print */ - -/* ####################### API Format ################# */ -/* For some weird Reason, the Print format must be in between the roll templates and the API buttons. DO NOT MOVE */ -a.sheet-chatbutton, -.textchatcontainer a[href^="!"].sheet-chatbutton, -a.textchatcontainer a.sheet-chatbutton { - padding: 0px 3px !important; - border: 1px solid black !important; - border-radius: 5px; - margin: 1px 0px !important; - min-width: auto; - white-space: nowrap; - background-color: grey; - color: white; -} - -/* ########################### End ############################### */ +/* Earthdawn.css */ +/* ############################################ css Reset ######################################################################### */ +/*v2.06 - published 220208*/ + +/* @import url('https://fonts.googleapis.com/css2?family=IM+Fell+English+SC&display=swap'); */ +@import url('https://fonts.googleapis.com/css2?family=Aladin&display=swap'); + + +input, +.charsheet input { + height: initial; +} +label, +.charsheet label { + color: initial; + display: inline-block; + font-size: inherit; + font-weight: normal; + height: auto; + line-height: 1em; + margin-bottom: initial; + padding-right: initial; + position: relative; + width: initial; +} +select, +.charsheet select { + margin: initial; + width: initial; + height: 20px; /*JBF 210317*/ + padding: 0; + font-weight: bold; + +} +textarea, +.charsheet textarea { + height: initial; + /* overflow-x: hidden; + overflow-y: auto; */ + resize: initial; + background-color: var( --bg-color ); + box-sizing: border-box; + border: 1px solid var( --outline-color ); + text-align: left; + overflow: auto; + pointer-events: initial; +} + + + + +/* ##### iconselect #### */ + +.sheet-testRepEditMode:not(:checked)~.repcontainer .sheet-iconselect-select, +.sheet-iconselect-span:not(:hover)>.sheet-iconselect-select-noedit, +.sheet-iconselect-span:not(:hover)>.sheet-iconselect-select{ + display: none; +} + +.charsheet .sheet-testRepEditMode:checked~.repcontainer .sheet-iconselect-span:hover>.sheet-iconselect-icon, +.charsheet .sheet-testRepEditMode:checked+.sheet-iconselect-span:hover>.sheet-iconselect-icon, +.charsheet .sheet-iconselect-span:hover>.sheet-iconselect-icon-noedit { + display: none; +} + +.charsheet .sheet-testRepEditMode:checked~.repcontainer .sheet-iconselect-span>.sheet-iconselect-icon, +.charsheet .sheet-testRepEditMode:checked+.sheet-iconselect-span>.sheet-iconselect-icon, +.charsheet .sheet-iconselect-span>.sheet-iconselect-icon-noedit { + background-color: var( --icon-color ); +} + + +.sheet-iconselect-icon, +.sheet-iconselect-span { + min-height: 20px; + min-width: 20px; +} +/* In order to have a correct initialization, it is absolutely necessary to have the iconselect-icon before the iconselect-select, and have the default value marked as checked/selected*/ + + +/* ############################################ Main section ####################################################################### */ +/* Colors: code description What used for. */ +.sheet-user-root { + --bg-color: rgb(255,242,201,0.15);/*Main background color ;*/ + --outline-color: #071840; /* Main border */ + --font-color: #071840; /* Color of fonts on the normal background */ + --header-font-color: white; /* Color of fonts on the header background */ + --highlight-font-color: #071840; /* Color of fonts on the icon background */ + --input-color: rgba(0, 0, 10, 0.1); /* Main section Input fields that are not disabled. */ + --hover-color: red; /* Color of active fields when hovered. */ + --hover-color-bg: rgba(255, 0, 0, 0.5); /* Color of active fields when hovered. */ + --locked-color: transparent; /* Main section Input fields that are locked */ + --control-secondary: #1473B4; /* header section background */ + --inactive-color: #1473B4; /* Color of the inactive tabs */ + --button-color: rgba(245, 245, 245, 1); /* button color */ + --icon-color: rgba(0, 0, 10, 0.1); /* actionable icons */ + +} + + + + + +xxxxx { + xxx: xx; /* * */ +} +/* For absolutely weird reason, we need this line to make the CSS work*/ + +/*.sheet-testAPI:not(:checked)~.sheet-api, Knacks tab is not inside a div */ +.sheet-testAPI:not([value="1"])~div .sheet-api, +.sheet-testAPI:not([value="1"])~div .sheet-Karma-ControlBox, +.sheet-testAPI[value="1"]~div .sheet-NoAPI, +.sheet-testCreation:not([value="1"])~div .sheet-Creation, +.sheet-testCreation[value="1"]~div .sheet-NotCreation, +.sheet-testEdition[value="-1"]~div .sheet-HideIf1879, +.sheet-testEdition:not([value="-1"])~div .sheet-HideIfNot1879, +.sheet-testEdition[value="3"]~div .sheet-HideIfEdition3, +.sheet-testEdition:not([value="3"])~div .sheet-HideIfNotEdition3, +.sheet-testEdition[value="4"]~div .sheet-HideIfEdition4, +.sheet-testEdition:not([value="4"])~div .sheet-HideIfNotEdition4, +.sheet-testPath[value="0"]~div .sheet-HideIfNotPath, +.sheet-testQuest[value="0"]~div .sheet-HideIfNotQuest, +.sheet-testNbDisc[value="0"]~div .sheet-HideIfZeroDisc, +.sheet-testNbDisc[value="1"]~div .sheet-HideIfOneDisc, +.sheet-testNbDisc[value="2"]~div .sheet-HideIfTwoDisc, +.sheet-testNbDisc[value="3"]~div .sheet-HideIfThreeDisc, +.sheet-testNPC:not([value="0"])~div .sheet-HideIfNotPC, +.sheet-testNPC[value="0"]~div .sheet-HideIfPC, +.sheet-testRace:not([value="Tskrang"])~div .sheet-HideIfNotTskrang, +.sheet-testRace:not([value="Other"])~div .sheet-HideIfNotCreature, +.sheet-testRace[value="Other"]~div .sheet-HideIfCreature, +.sheet-testStepDisplay:not([value="1"])~div .sheet-StepTotal, +.sheet-testStepDisplay[value="1"]~div .sheet-StepBase, +.sheet-testChecked:checked~.sheet-HideIfChecked, +.sheet-testChecked:not(:checked)~.sheet-HideIfNotChecked, +.sheet-testChecked:checked~div>.sheet-HideIfChecked, +.sheet-testChecked:not(:checked)~div>.sheet-HideIfNotChecked, +.sheet-testChecked:not(:checked)~span>.sheet-HideIfNotChecked, +.sheet-testChecked:checked~div>div>.sheet-HideIfChecked, +.sheet-testChecked:not(:checked)~div>div>.sheet-HideIfNotChecked, +.sheet-testChecked:checked~span>.sheet-HideIfChecked, +.sheet-testChecked:not(:checked)~.sheet-table-row>.sheet-HideIfNotChecked, +.sheet-testCloseChecked:checked+.sheet-HideIfCloseChecked, +.sheet-testCloseChecked:not(:checked)+.sheet-HideIfNotCloseChecked, +.sheet-testCloseChecked:not(:checked)+.sheet-HideIfCloseChecked+.sheet-HideIfNotCloseChecked, +.sheet-testNum[value="0"]+.sheet-HideIfZero, +.sheet-testNum:not([value="0"])+span+.sheet-HideIfNotZero, +.sheet-testNum[value="1"]+.sheet-HideIfOne, +.sheet-testNum[value="2"]+.sheet-HideIfTwo, +.sheet-testNum[value="3"]+.sheet-HideIfThree, +.sheet-testNum[value="0"]~ .sheet-HideIfZero, +.sheet-testNum[value="0"]~div .sheet-HideIfZero, +.sheet-testNum[value="1"]~div .sheet-HideIfOne, +.sheet-testNum[value="2"]~div .sheet-HideIfTwo, +.sheet-testNum[value="3"]~div .sheet-HideIfThree, +.sheet-testNum[value="0"]~ .sheet-HideIfLessThan1, +.sheet-testNum[value="0"]~div .sheet-HideIfLessThan1, +.sheet-testNum[value="1"]~div .sheet-HideIfLessThan2, +.sheet-testNum[value="2"]~div .sheet-HideIfLessThan3, +.sheet-testNum[value="3"]~div .sheet-HideIfLessThan4, +.sheet-testNum[value="4"]~div .sheet-HideIfLessThan5, +.sheet-testNum[value="5"]~div .sheet-HideIfLessThan6, +.sheet-testNum[value="6"]~div .sheet-HideIfLessThan7, +.sheet-testNum[value="7"]~div .sheet-HideIfLessThan8, +.sheet-testNum[value="8"]~div .sheet-HideIfLessThan9, +.sheet-testNum[value="9"]~div .sheet-HideIfLessThan10, +.sheet-testNum[value="10"]~div .sheet-HideIfLessThan11, +.sheet-testNum[value="11"]~div .sheet-HideIfLessThan12, +.sheet-testNum[value="12"]~div .sheet-HideIfLessThan13, +.sheet-testNum[value="13"]~div .sheet-HideIfLessThan14, +.sheet-testNum[value="14"]~div .sheet-HideIfLessThan15, +.sheet-testModType[value="(0)"]~span>.sheet-HideIfNoRoll, +.sheet-testModType[value="(0)"]~.sheet-HideIfNoRoll, +.sheet-testModType:not([value="(0)"])~span>.sheet-HideIfRoll, +.sheet-testModType:not([value="(0)"])~.sheet-HideIfRoll, +.sheet-testRecord[value="LP"]~.sheet-HideIfLP, +.sheet-testRecord[value="SP"]~.sheet-HideIfSP, +.sheet-testRecord[value="Other"]~.sheet-HideIfOther, +.sheet-testRepEditMode:checked~.repcontainer .sheet-HideIfEditMode, +.sheet-testRepEditMode:not(:checked)~.repcontainer .sheet-HideIfNotEditMode, +.sheet-testRepEditMode:checked~.sheet-HideIfEditMode, +.sheet-testRepEditMode:not(:checked)~.sheet-HideIfNotEditMode, +.sheet-testRepEditMode:checked~div>.sheet-HideIfEditMode, +.sheet-testRepEditMode:not(:checked)~div>.sheet-HideIfNotEditMode, +.sheet-testRepEditMode:checked~div>div>.sheet-HideIfEditMode, +.sheet-testRepEditMode:not(:checked)~div>div>.sheet-HideIfNotEditMode, +.sheet-testRepEditMode:checked~span>.sheet-HideIfEditMode, +.sheet-testRepEditMode:not(:checked)~span>.sheet-HideIfNotEditMode, +.sheet-testRepEditMode:checked~div>div>span>.sheet-HideIfEditMode, +.sheet-testRepEditMode:not(:checked)~div>div>span>.sheet-HideIfNotEditMode, +.sheet-testRepOption1:not(:checked)~.repcontainer .sheet-HideIfNotOption1, +.sheet-testRepOption2:not(:checked)~.repcontainer .sheet-HideIfNotOption2, +.sheet-testRepOption3:not(:checked)~.repcontainer .sheet-HideIfNotOption3, +.sheet-testRepOption4:not(:checked)~.repcontainer .sheet-HideIfNotOption4, +.sheet-testFreeOrThread[value*="-link"]+.sheet-HideIfFreeOrThread, +.sheet-testFreeOrThread:not([value*="-link"])+.sheet-HideIfNotFreeOrThread, +.sheet-testFreeOrThread:not([value*="-link"])+.sheet-HideIfFreeOrThread+.sheet-HideIfNotFreeOrThread, +.sheet-testPlaceholder:not(:placeholder-shown)~.sheet-hideIfNotPlaceholder, +.sheet-testPlaceholder:placeholder-shown~.sheet-hideIfPlaceholder, +.sheet-testPlaceholder:not(:placeholder-shown)~div .sheet-hideIfNotPlaceholder, +.sheet-testPlaceholder:not(:placeholder-shown)~span .sheet-hideIfNotPlaceholder, +.sheet-testPlaceholder:placeholder-shown~span .sheet-hideIfPlaceholder, +input[type="number"]:disabled.sheet-hidden, /* Need this bit of extra specificity here */ +.sheet-hidden { + display: none; +} + +.sheet-testCloseChecked:checked+.sheet-UnHideIfCloseChecked, +.sheet-testChecked:checked~.sheet-UnHideIfChecked, +.sheet-testDSPPath[value="81.0"]~div .sheet-UnHideIfDSPPath, +.sheet-testDSPPath[value="83.0"]~div .sheet-UnHideIfDSPPath, +.sheet-testNum:not([value="0"])+.sheet-UnhideIfNotZero, +.sheet-testNum:not([value="0"])+.sheet-testNum+.sheet-UnhideIfNotZero, +.sheet-testDevotion[value^="QD-"]+.sheet-UnhideIfDevotion +{ display: inline-block; } + +.sheet-testNum2[value="1"]~div .sheet-UnhideIf1, +.sheet-testNum2[value="2"]~div .sheet-UnhideIf2, +.sheet-testNum2[value="3"]~div .sheet-UnhideIf3, +.sheet-testNum2[value="4"]~div .sheet-UnhideIf4, +.sheet-testNum2[value="5"]~div .sheet-UnhideIf5, +.sheet-testNum2[value="6"]~div .sheet-UnhideIf6, +.sheet-testNum2[value="7"]~div .sheet-UnhideIf7, +.sheet-testNum2[value="8"]~div .sheet-UnhideIf8, +.sheet-testNum2[value="9"]~div .sheet-UnhideIf9, +.sheet-testNum2[value="10"]~div .sheet-UnhideIf10, +.sheet-testNum2[value="11"]~div .sheet-UnhideIf11, +.sheet-testNum2[value="12"]~div .sheet-UnhideIf12, +.sheet-testNum2[value="13"]~div .sheet-UnhideIf13, +.sheet-testNum2[value="14"]~div .sheet-UnhideIf14, +.sheet-testNum2[value="15"]~div .sheet-UnhideIf15 +{ display: inline-block; } + + + + + +/* ################ JBF 210104 Global formatting (inputs, select ...) ############ */ + + +input[type="text"], +input[type="number"] { + color: var( --font-color ); + background-color: var( --input-color ); + border: 1px solid transparent; + padding: 1px; + font-weight: bold; + text-align: center; +} + +input.sheet-HideSpinners::-webkit-inner-spin-button, +input.sheet-HideSpinners::-webkit-outer-spin-button, +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + opacity: 0.1; +} + +input.sheet-HideSpinners:hover::-webkit-inner-spin-button, +input.sheet-HideSpinners:hover::-webkit-outer-spin-button, +input[type="number"]:hover::-webkit-inner-spin-button, +input[type="number"]:hover::-webkit-outer-spin-button { + opacity: 1; +} + +input:hover, +input.sheet-HideSpinners:hover { + -moz-appearance: auto; + background-color: var( --hover-color-bg); + border : 1px solid var( --hover-color); +} + +input[type="number"], +input.sheet-HideSpinners { + -moz-appearance: textfield; +} + + +textarea.sheet-details { + height: 100px; + resize: vertical; + margin-bottom : 1px; +} + +textarea.sheet-details-small { + height: 50px; + resize: vertical; + margin-bottom : 1px; +} + +textarea.sheet-details-big { + height: 400px; + resize: vertical; + margin-bottom : 1px; +} + +textarea.sheet-details-oneline { + height: 25px; + resize: none; + margin-bottom : 1px; + background: var(--input-color); + +} + +textarea.sheet-textimport { + height: 23px; + width: 10em; + resize: none; + overflow: none; + margin-bottom : 0px; + background-color: var( --input-color ); + border : 1px solid var(--outline-color); +} + +span.sheet-buttonlabel, +input.sheet-buttonlabel { + background : transparent; + border-style: none; + text-align: left; + padding: 0; + margin: 0; + font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; + font-weight: normal; + color: var( --font-color ); + +} +button:hover span.sheet-buttonlabel, +button:hover input.sheet-buttonlabel { + color : var( --hover-color ); + cursor: pointer; +} + + + +select { + background-color: var( --input-color ); + border-left: none; + border-top: none; + border-right-style: none; + border-bottom: 1px solid var( --outline-color ); + text-align: center; +} + + + +[readonly], +.sheet-Locked, +input[type="text"][readonly], +input[type="number"][readonly], +input[type="number"][readonly]:hover, +input[type="number"].sheet-Locked, /* Sometime need this bit of extra specificity */ +input[type="text"].sheet-Locked, +.sheet-testKarmaAuto:not([value="1"])~div .sheet-Karma-ControlBox, +.sheet-testLocked:checked~.sheet-LockIfChecked, +.sheet-testLocked:checked~span .sheet-LockIfChecked, +.sheet-testLocked:checked~div .sheet-LockIfChecked, +.sheet-testLocked:checked~label .sheet-LockIfChecked, +.sheet-testLocked:not(:checked)~.sheet-LockIfNotChecked, +.sheet-testLocked:not(:checked)~span .sheet-LockIfNotChecked, +.sheet-testLocked:not(:checked)~label .sheet-LockIfNotChecked, +.sheet-testLocked:not(:checked)~div .sheet-LockIfNotChecked { + background-color: var( --locked-color ); + pointer-events: none; + -moz-appearance: textfield; + font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; + font-weight: normal; +} + +.sheet-testRepEditMode:checked~.repcontainer .sheet-LockIfEditMode, +.sheet-testRepEditMode:not(:checked)~.repcontainer .sheet-LockIfNotEditMode, +.sheet-testRepEditMode:checked~.sheet-LockIfEditMode, +.sheet-testRepEditMode:not(:checked)~.sheet-LockIfNotEditMode, +.sheet-testRepEditMode:checked~div>.sheet-LockIfEditMode, +.sheet-testRepEditMode:not(:checked)~div>.sheet-LockIfNotEditMode, +.sheet-testRepEditMode:checked~div>div>.sheet-LockIfEditMode, +.sheet-testRepEditMode:not(:checked)~div>div>.sheet-LockIfNotEditMode, +.sheet-testRepEditMode:not(:checked)~div>span>.sheet-LockIfNotEditMode, +.sheet-testRepEditMode:checked~span>.sheet-LockIfEditMode, +.sheet-testRepEditMode:not(:checked)~span>.sheet-LockIfNotEditMode, +.sheet-testRepEditMode:checked~div>div>span>.sheet-LockIfEditMode, +.sheet-testRepEditMode:not(:checked)~div>div>span>.sheet-LockIfNotEditMode { + background-color: var( --locked-color ); + pointer-events: none; + font-style : italic; + -moz-appearance: textfield; +} + + +.sheet-testNum[value="7"]+.sheet-UnlockIf7, +.sheet-testNum[value="99"]+.sheet-UnlockIf99, +.sheet-testLocked:checked~.sheet-UnlockIfChecked, +.sheet-testLocked:checked~span .sheet-UnlockIfChecked, +.sheet-testLocked:checked~label .sheet-UnlockIfChecked, +.sheet-testLocked:not(:checked)~.sheet-UnlockIfNotChecked, +.sheet-testLocked:not(:checked)~label .sheet-UnlockIfNotChecked, +.sheet-testLocked:not(:checked)~span .sheet-UnlockIfNotChecked { + background-color: var( --input-color ); + color: var( --font-color ); + pointer-events: initial; +} + + + +input:disabled, +input:disabled::-webkit-inner-spin-button, +input:disabled::-webkit-outer-spin-button, +input[readonly]::-webkit-inner-spin-button, +input[readonly]::-webkit-outer-spin-button, +.sheet-fakeCalc input:not(.sheet-hidden) { + pointer-events: none; + font-style: italic; + display: inline-block; + -moz-appearance: textfield; /*Was none before*/ + -webkit-appearance: none; +} + + +input.sheet-nospinner, +input.sheet-nospinner::-webkit-inner-spin-button, +input.sheet-nospinner::-webkit-outer-spin-button { + -moz-appearance: textfield; /*Was none before*/ + -webkit-appearance: none; +} + + + + +.sheet-floatRight { + float: right; + clear: right; +} + +.sheet-text-left { + text-align: left !important; +} + +.sheet-text-center { + text-align: center !important; +} + + +.sheet-fancyfont { + font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; + font-weight: normal; +} + + +.sheet-Elementalist-section, +.sheet-Illusionist-section, +.sheet-Nethermancer-section, +.sheet-Wizard-section { +} /* Need a class here just to keep .sheet-section from inheriting, even if the class is empty */ + +.sheet-label { + line-height: 10px; + font-size: 85%; + padding-right: 2em; + font-weight: bold; + text-align: center; + white-space: nowrap; +} + +.sheet-label-flex { + font-size: 85%; + font-weight: bold; +} + + + +.sheet-repeat-counter-reset { + counter-reset: sheet-rep-items; +} + +.sheet-repeat-count::before +{ + counter-increment: sheet-rep-items; + content: counter(sheet-rep-items) !important; + padding: 0.7em; +} + + +.sheet-text-button { + border-bottom: 1px solid black; + border-right: 1px solid transparent; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + +} + +.sheet-text-button { + color: var( --font-color ); + background-color: var( --button-color ); +} + +.sheet-text-button-header { + color: var( --header-font-color ); + background-color: var( --outline-color ); +} + +.charsheet button[type="roll"].sheet-helpbutton { + color:black; + background-color: maroon ; + background-image: -moz-linear-gradient(top,#fff,maroon); + background-image: -ms-linear-gradient(top,#fff,maroon); + background-image: -webkit-gradient(linear,0 0,0 100%,from(#fff),to(maroon)); + background-image: -webkit-linear-gradient(top,#fff,maroon); + background-image: -o-linear-gradient(top,#fff,maroon); + background-image: linear-gradient(top,#fff,maroon); + background-repeat: repeat-x; + width: 20px; + size:130%; +} + + +/* JBF@JBF 210106 trials for transparent button */ + +.charsheet button[type="roll"], +.charsheet button[type="action"] { + border-bottom: 1px solid var( --outline-color); + border-right: 1px solid transparent; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-radius: 5px; + margin-left: 1px; + margin-right: 1px; + background-color: var( --button-color ); + background-image: -moz-linear-gradient(top,#fff,#e6e6e6); + background-image: -ms-linear-gradient(top,#fff,#e6e6e6); + background-image: -webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6)); + background-image: -webkit-linear-gradient(top,#fff,#e6e6e6); + background-image: -o-linear-gradient(top,#fff,#e6e6e6); + background-image: linear-gradient(top,#fff,#e6e6e6); + background-repeat: repeat-x; + padding : 2px; +} + +button[type="roll"].sheet-text-button-header { + background-image: none; + background-color: var( --outline-color); + border-bottom: 1px solid white; + border-right: 1px solid white; + border-left: 1px solid white; + border-top: 1px solid white; +} + + +.charsheet button[type="roll"]:hover, +.charsheet button[type="roll"]:active, +.charsheet button[type="action"]:hover, +.charsheet button[type="action"]:active { + color: var( --hover-color ); + background-color: #e6e6e6; + background-position: 0 -15px; + background-position-x: 0px; + background-position-y: -15px; + -webkit-transition: background-position .1s linear; + -moz-transition: background-position .1s linear; + -ms-transition: background-position .1s linear; + -o-transition: background-position .1s linear; + transition: background-position .1s linear; + transition-property: background-position; + transition-duration: 0.1s; + transition-timing-function: linear; + transition-delay: 0s; + border: 1px solid red; +} + + +input[name*="combatOption"]:checked + b, +input[name*="condition"]:checked + b { + background-color: var( --outline-color ); + color: white; + border-radius: 5px; + padding-right: 5px; + padding-bottom: 1px; + padding-top: 1px; +} + + + +.charsheet button[type=roll].sheet-button-nodice:before { + content: none; +} + + +input[type="number"].sheet-attrCostsRed { + background-color: maroon; + color: white; +} + + +.sheet-testAttrCosts[value="0"]~div .sheet-attrCostsRed +{ + background-color: Green; + color: white; +} + +input[type="number"].sheet-attrCostsGreen { + background-color: green; +} + +.sheet-testAttrCosts[value="0"]~div input[type="number"].sheet-attrCostsGreen, +.sheet-testAttrCosts[value="1"]~div input[type="number"].sheet-attrCostsGreen, +.sheet-testAttrCosts[value="2"]~div input[type="number"].sheet-attrCostsGreen { + background-color: white; +} + + +/* ######## Steps and StepSpan ###### */ + +.charsheet input[type="number"].sheet-StepBig, +.sheet-StepBig { + font-size : 150%; + padding: 0; + margin-left: 0; + margin-right: -3px; + margin-bottom: -14px; + text-align: center; + width: 1.3em ; +} + +.charsheet span.sheet-stepSpan, +.sheet-stepSpan { + height: 26px; + padding-bottom: 2px ; + margin-left: 14px ; + margin-right: 19px ; + display: inline-block; + white-space: nowrap; +} + +.sheet-buffSmall { + transform: scale(0.8) ; /*JBF : transform instead of the font size adresses the spinners*/ +} + + +.charsheet input[type="number"].sheet-buffLeft, +.charsheet input[type="number"].sheet-buffRight { + vertical-align: top; + padding: 0px; + margin-top: 0px; + margin-bottom: 0px; +} + +.charsheet b.sheet-buffSignLeft, +.charsheet b.sheet-buffSignRight { + vertical-align: top; + padding: 0px; + margin-top: 0px; + margin-bottom: 0px; + width: 0.3em; + text-align: right; +} + + +.charsheet b.sheet-buffSignRight{ + margin-right: -2px; + margin-left: -1px; +} + +.charsheet input[type="number"].sheet-buffRight { + margin-left: -4px; + margin-right: -20px; + text-align: left; + width: 2.5em; +} + +.charsheet b.sheet-buffSignLeft { + margin-right: -15px; + margin-left: -2px; +} + +.charsheet input[type="number"].sheet-buffLeft { + text-align: right; + margin-left: 0px; + margin-right: -8px; + width: 1.8em; +} + +.sheet-buffRight::-webkit-inner-spin-button, +.sheet-buffRight::-webkit-outer-spin-button { + opacity: 0; +} + +.sheet-buffRight { + -moz-appearance: textfield; +} + +span:hover .sheet-buffRight::-webkit-inner-spin-button, +span:hover .sheet-buffRight::-webkit-outer-spin-button { + opacity:1; +} + +span:hover .sheet-buffRight{ + -moz-appearance: auto; +} + + +.sheet-testCloseChecked:checked+.sheet-InvisibleIfCloseChecked { + opacity: 0; +} + +.sheet-testCloseChecked:checked+.sheet-PartlyInvisibleIfCloseChecked { + color: transparent; +} + +.sheet-testCloseChecked:not(:checked)+.sheet-PartlyInvisibleIfNotCloseChecked { + color: transparent ; +} + +.sheet-redGreen ~ input, +.sheet-redGreen ~ b { + color: green; +} + + + +.sheet-redGreen[value^="-"] ~ input { + color: red; +} +.sheet-greenRed ~ input, +.sheet-greenRed ~ b { + color: red; +} +.sheet-greenRed[value^="-"] ~ input { + color: green; +} + + +.sheet-redGreen[value^="-"]~ b, +.sheet-greenRed[value^="-"]~ b, +.sheet-redGreen[value="0"] ~ input, +.sheet-greenRed[value="0"] ~ input, +.sheet-redGreen[value="0"] ~ b, +.sheet-greenRed[value="0"] ~ b { + color: transparent; +} + + +.sheet-testKarReq:not([value="0"]) ~ .sheet-Kar_0_3, +.sheet-testKarReq:not([value="0"]) ~ .sheet-Kar_0_2, +.sheet-testKarReq:not([value="1"]) ~ .sheet-Kar_1_2, +.sheet-testKarReq:not([value="1"]) ~ .sheet-Kar_1_3, +.sheet-testKarMax:not([value="2"]) ~ .sheet-Kar_1_2, +.sheet-testKarMax:not([value="2"]) ~ .sheet-Kar_0_2, +.sheet-testKarMax:not([value="3"]) ~ .sheet-Kar_1_3, +.sheet-testKarMax:not([value="3"]) ~ .sheet-Kar_0_3, +.sheet-testKarMax:not([value="0"],[value="1"],[value="2"],[value="3"]) ~ .sheet-Kar_lessthan3, +.sheet-testKarMax:not(:not([value="0"],[value="1"],[value="2"],[value="3"])) ~ .sheet-Kar_morethan3, +.sheet-testKarMax:not([value="4"]) ~ .sheet-Kar_4, +.sheet-testKarMax:not([value="5"]) ~ .sheet-Kar_5, +.sheet-testKarMax:not([value="6"]) ~ .sheet-Kar_6, +.sheet-testKarMax:not([value="7"]) ~ .sheet-Kar_7, +.sheet-testKarMax:not([value="8"]) ~ .sheet-Kar_8, +.sheet-testKarMax:not([value="9"]) ~ .sheet-Kar_9, +.sheet-testKarMax:not([value="10"]) ~ .sheet-Kar_10, +.sheet-testKarMax:not([value="11"]) ~ .sheet-Kar_11, +.sheet-testKarMax:not([value="12"]) ~ .sheet-Kar_12, +.sheet-testKarMax:not([value="13"]) ~ .sheet-Kar_13, +.sheet-testKarMax:not([value="14"]) ~ .sheet-Kar_14, +.sheet-testKarMax:not([value="15"]) ~ .sheet-Kar_15 { + display: none !important; +} + + + +/* ############################################# JBF Header Flex Containers ######################################################### */ + +.sheet-header-flex-container { + display: flex; + align-items: flex-start; + justify-content: flex-start; + flex-wrap: wrap; + overflow: hidden; +} + + +.sheet-header-box { + height: 75px; + border: 1px solid var(--outline-color); + border-radius: 10px; + display: flex; + align-items: center; + margin-right: 1px; + flex-flow: column; + opacity: 1; + overflow: hidden; + max-width: 280px; +} + +.sheet-header-modbox { + margin-top : 9px; + margin-bottom: 7px; + margin-left: 0px; + margin-right: 0px; +} + + +.sheet-header-flex-container:not(:hover) .sheet-testNum[value="0"]+.sheet-testNum[value="0"]+.sheet-header-hidden, +.sheet-header-flex-container:not(:hover) .sheet-testNum[value="0"]+.sheet-testNum[value="0"]+.sheet-testNum[value="0"]+.sheet-header-hidden { + height : 0px; + max-width: 0px; + overflow: hidden; + opacity: 0.5; + padding: 0px; + margin: 0px; + border: 1px solid transparent; +} + +.sheet-header-box, +.sheet-iconlabel-header, +.sheet-iconlabel-header-invert, +.sheet-iconlabelbig, +.sheet-header-hidden { + transition: height 0.5s, flex-grow 0.5s, min-width 0.5s, flex-basis 0.5s, width 0.5s, max-width 0.5s , margin 0.5s, padding 0.5s; + /* transition-delay: 1.5s; */ + overflow: hidden; +} + + + +.sheet-header-iconbox { + flex-grow: 1; /* it can grow */ + flex-shrink: 1; /* it can shrink */ + /* flex-basis: 30px; /* arbitrary depending on design */ */ + /* min-width: 30px; /* equal to flex-basis */ */ + /*max-width: 100%; JBF@JBF 210228 (100% - margins)/number of boxes */ + text-align: center; + transition: flex-grow, 0.5s; + transition: min-width 0.5s; + /* transition-delay: 1.5s; */ +} + +.sheet-header-flex-container:not(:hover) .sheet-header-iconbox { + /* flex-grow: 0.0000000001; /* it cant grow anymore... We want it to collapse */ */ + /* flex-basis: 30px; */ + /* width: auto; + min-width: 30px; */ + /* padding: 0px !important; */ + transition: flex-grow, 0.5s, min-width 0.5s; + /* transition-delay: 1.5s; */ +} + +.sheet-header-logo-Earthdawn { + background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Earthdawn-Logo.png); +/* background-image: url(https://s3.amazonaws.com/files.staging.d20.io/images/258659/43tgLdtfozFTvZrPGMv-uw/med.png?1539148273); */ +} +.sheet-header-logo-1879 { + background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/1879-Logo.png); +/* background-image: url(https://s3.amazonaws.com/files.d20.io/images/188531300/L18EvmQWIkcT_CKVGnPfqg/max.png?1609231596); */ +} + +.sheet-header-logo-Earthdawn, +.sheet-header-logo-1879 +{ + height: 76px; + background-repeat: no-repeat; + background-size: contain; + max-width: 200px; + width: calc(100% - 800px); /* Width of Logo =100%-2X where X = min-width of header-name*/ +} + +.sheet-testQuest:not([value="0"])~div .sheet-header-logo-1879, +.sheet-testQuest:not([value="0"])~div .sheet-header-logo-Earthdawn +{ + width: calc(100% - 1000px); /* If Questor, Logo needs to be smaller */ +} + +.sheet-testQuest:not([value="0"])~div .sheet-header-name { + min-width: min(500px, 25%); + width: calc(50% - 100px); +} + + +.sheet-header-name { + height: 70px; + border: 1px solid var(--outline-color); + border-radius: 10%; + min-width: min(400px, 25%); + width: calc(50% - 100px); + padding-top: 6px; + padding: 3px; + overflow: hidden; +} + + +/* ############################################ Colors and Margins ###################################################### */ + + +/* JBF 210103 To be identified */ +.ui-widget-content, +.charsheet { + position: absolute; + padding: 0 !important; + left: 0; + top: 46px; +} +/* JBF 210103 To be identified */ + + +.sheet-user-root { +/*Normal Background*/ +background-color: var( --bg-color ); + background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Border-left-nobottom.png),url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Border-right-nobottom.png),url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Border-left-nobottom3.png),url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Border-right-nobottom3.png); + background-repeat: no-repeat, no-repeat,no-repeat, no-repeat; + background-blend-mode: multiply, multiply,multiply, multiply; + background-position: -17px -15px,calc(100% + 23px) -10px,-17px 1356px,calc(100% + 23px) 1362px; + background-size : 250px 1372px, 250px 1372px,250px 1372px, 250px 1372px; + padding-left: 13px; + padding-right: 13px; + padding-top: 10px; + margin-top: 0px; + margin-left: 0px; + margin-right: 0px; +} + +.sheet-user-root-in { + margin-left: 0px; + margin-right: 0px; + min-width: 500px; /*JBF@JBF : to be reworked according to final layout*/ + border-left: 2px groove var( --outline-color ); + border-right: 2px groove var( --outline-color ); + border-bottom: 2px groove var( --outline-color ); + border-top: none; + background-color: var( --bg-color ); +} + + +.sheet-section { + background-color: var( --bg-color ); +} + +.sheet-content { + padding: 2px; +} + + +.sheet-bordered { + border : 1px solid var(--outline-color) !important; +} + +.sheet-bordered-bottom { + border-top: none !important; + border-left: none !important; + border-right: none !important; + border-bottom: 1px solid var(--outline-color) !important; +} + +.sheet-notbordered { + border: none !important; +} + +.sheet-header { + min-height: 30px; +} + + +.sheet-imgbox { + text-align: center; + align-items: center; + justify-content: center; + height: 50px; + width: 50px; + position: relative; +} + + +.sheet-imgbox::before { + text-align: center; + align-items: center; + justify-content: center; + content: ""; + position: absolute; + background-repeat: no-repeat; + background-size: 40px 40px; + background-position: top center; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; + height: 50px; + width: 50px; + opacity: 0.2; + z-index: 1; +} + +.sheet-imgbox-content { + z-index: 99; + position: relative; +} + + +.sheet-imgbox-defense { + /*size of your image*/ + text-align: center; + align-items: center; + justify-content: center; + vertical-align: middle; + height: 43px; + width: 43px; + padding-left: 8px; + padding-bottom: 16px; + position: relative; +} + + +.sheet-imgbox-defense::before { + text-align: center; + align-items: center; + justify-content: center; + content: ""; + position: absolute; + background-repeat: no-repeat; + background-size: 45px 45px; + background-position: 50% 25%; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; + height: 45px; + width: 45px; + opacity: 0.4; + z-index: 1; + padding-left: 8px; + padding-bottom: 20px; +} + + +.sheet-sec-border-line { + background-color: var( --bg-color ); + margin-left: -7px; + margin-right: -7px; +} + +.sheet-sec-border-line { + border-top: 2px double var( --outline-color ); + padding-top: 3px; +} + + +/*JBF@JBF to be identified, maybe dead code, and in any case shouldn't be static color*/ + +.sheet-heading { + background-color: var( --control-secondary ); + color: var( --header-font-color ); + font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; + font-weight: normal; + margin: 1px; +} + + +/* ############################################ Tables and cells #################################################### */ + +.sheet-table { + display: table; + width: 100%; +} + +.sheet-table-left { + display: table; + border-collapse: collapse; +} + +span.sheet-table-left, +.sheet-table-left .sheet-table-row span { + border-style: hidden; + border-width: 2px; + text-align: left; +} + +.sheet-table-name { + display: table-caption; + text-align: center; + font-weight: bold; + color: var( --header-font-color ); + background-color: var( --outline-color ); + width: 100%; +} + +.charsheet .sheet-headerbar, +.sheet-headerbar { + vertical-align: bottom; + justify-content: center; + align-items: center; + text-align : center; + color: var( --header-font-color ); + /* font-weight: bold; */ + background-color: var(--outline-color); + font-size: 14px; + /* font-family: Papyrus, fantasy; */ + font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; + font-weight: normal; + width: 100%; + /* margin: auto; *//* JBF@JBF 210105*/ + min-height: 21px; + display: flex; +} + +.charsheet .sheet-headerbar-flex, +.sheet-headerbar-flex { + vertical-align: bottom; + justify-content: space-between; +} + + +.sheet-creation-order { +color: yellow; +font-size: 16px; +/*text-shadow: 1px 1px white;*/ +} + +.sheet-table-header { + display: table-cell; + text-align: center; + font-style: italic; + font-weight: bold; + color: var( --header-font-color ); + vertical-align: middle; + background-color: var( --outline-color ); +} + +.sheet-table-row { + display: table-row; + vertical-align: middle; + width: 100%; +} + +.sheet-table-data { + display: table-cell; + vertical-align: middle; + text-align: center; /*JBF 20201124*/ + white-space: nowrap; +} + +hr { + border-color: black; + margin: 5px 0; +} + +.sheet-w15 { + display: table-cell; + vertical-align: middle; + text-align: left; + width: 15%; +} + +.sheet-w20 { + display: table-cell; + vertical-align: middle; + text-align: left; + width: 20%; +} +.sheet-w30 { + display: inline-block; + text-align: left; + width: 30%; +} + +.sheet-w100p { + width: 100%; +} + +/*JBF@JBF useful ???*/ +.sheet-w50 { + width: 100%; +} + + +.sheet-notes{ +width: 28%; +/* padding-left: 5px; +padding-right: 5px; */ +/* padding-bottom: 10px; */ +margin: 1%; +} + + +.sheet-flex-container { + display: flex; + align-items: flex-start; + justify-content: space-between; +} + +.sheet-flexwrap { + flex-wrap: wrap; +} + +.sheet-glossary { + /* display: flex; + align-items: flex-start; + flex-wrap: wrap; + flex-direction: column; + max-height: 150px; + height : auto; */ + display: inline-block; +} + + +.sheet-flex1 { + flex: 1; +} +/*JBF@CD -- This is a trial, but gives interesting results*/ + + +.sheet-floatRight.sheet-header-flex-container, +.sheet-floatRight.sheet-flex-container { + justify-content: flex-end; +} + +.sheet-flexCenter { + display: flex; + justify-content: center; + align-items: center; +} + +/ ############################################# Attribute Boxes ########################################################## */ + +.sheet-Attrib-container { + padding: 5px; + margin-top: 3px; + display: flex; + align-items: center; +} + +.sheet-Attrib-box { + border: 1px solid black; + border-radius: 10px; + text-align: center; + display: inline-block; + width: 130px; + margin-bottom: 3px; +} + +.sheet-Attrib-header { + display: flex; + justify-content: space-around; + align-items: flex-start; + vertical-align: top; + text-align: center; + background-color: var(--outline-color); +} + +.sheet-Defense-box { + border: 1px solid black; + border-radius: 10px; + display: flex; + margin: 3px; + align-items: center; + flex-flow: column; + width: 100px; + min-height: 80px; +} + +.sheet-Shield-box { + border: 1px solid black; + border-radius: 10px; + display: flex; + margin: 3px; + padding: 3px; + align-items: center; + flex-flow: column; +} + + + +.sheet-Attrib-rightbox { + text-align: center; + display: inline-block; +} + + +.charsheet input[type="number"].sheet-AttribValue, +.sheet-AttribValue { + background: var( --outline-color ); + border-style: none; + border-radius: 70%; + color: var( --header-font-color ); + font-weight: bold; + text-align: center; +} + +.sheet-AttribValueDiv { + margin-top: 8px; +} + + +.charsheet input[type="number"].sheet-AttribStep, +.sheet-AttribStep +{ + color: var( --highlight-font-color ); + text-shadow: 2px 2px var( --bg-color ); + font-weight:bold; + font-size: 250%; /* JBF was important */ + padding: 0; /* JBF was important */ + margin-top: 0; /* JBF was important */ + margin-bottom: 0; /* JBF was important */ + margin-left: 0; /* JBF was important */ + margin-right: -11px; /* JBF was important */ + text-align: center; /* JBF was important */ + width: 1.3em; /* JBF was important */ + font-weight: bold; + +} + +.charsheet span.sheet-AttribStepSpan, +.sheet-AttribStepSpan +{ + padding: 4px; /* JBF was important */ + +} + +/* ############################################ Formating and Length ###################################################### */ + +.sheet-fixed-width { + white-space: nowrap; + display: inline-block; +} + + +.charsheet .sheet-matrix.sheet-filter-box { + margin: 0px; + margin-bottom: 2px; + margin-right: 2px; + border-radius: 5px; + padding: 0px; + border: 1px solid black; +} + + + +.sheet-nowrap0 { + white-space: nowrap; + display: inline-block; /*JBF@CD Trial for alignment*/ + vertical-align: middle; +} + +.sheet-nowrap, +.sheet-nowrap1 { + white-space: nowrap; + padding-right: 1em; +} + +.sheet-nowrap2 { + white-space: nowrap; + padding-right: 2em; +} + +.sheet-nowrap3 { + white-space: nowrap; + padding-right: 3em; +} + +.sheet-nowrap5 { + white-space: nowrap; + padding-right: 5em; +} + +.sheet-w7 { + display: inline-block; + min-width: 7em; + padding-right: 0em; +} + +/*JBF */ +.sheet-numShorter { width: 2em !important } +.sheet-numShort { width: 3em !important } +.sheet-numLong { width: 4em !important } +.sheet-selShort { width: 5em !important } +.sheet-selLong { width: 6em !important } +.sheet-txtShort { width: 8em !important } +.sheet-txtMed { width: 9em !important } +.sheet-txtMedplus { width: 11.5em !important } +.sheet-txtLong { width: 16em !important } +.sheet-txtLonger { width: 20em !important } +.sheet-txtEvenLonger { width: 27em !important } + + +.sheet-titlespan { + margin-left: 0px; + margin-right: 0px; + text-align: center; + vertical-align: middle; +} + + +.charsheet .sheet-w25px { width: 25px; } +.charsheet .sheet-w30px { width: 30px; } +.charsheet .sheet-w50px { width: 50px; } +.charsheet .sheet-w75px { width: 75px; } +.charsheet .sheet-w100px { width: 100px; } + +.charsheet .sheet-Big { font-size: 150%;} + +.charsheet input[type="number"].sheet-Bigger, + .sheet-Bigger { + font-size: 200%; + width: 2em; + text-align: center ; +} +.sheet-small { transform: scale(0.8); /*better results ?*/} + +.charsheet input[type="number"].sheet-numHighlight, +.sheet-numHighlight { + color: var( --highlight-font-color ); + text-shadow: 2px 2px var( --bg-color ); + font-weight: bold; +} + + +.sheet-vaBottom { + vertical-align: bottom; +} + +.sheet-middle { + display: inline-block; + padding-top: 6px; +} + +.sheet-minWidth3 { + min-width: 3em; +} + + + + +/* ############################################ Variable length text boxes ########################################################## */ +/* The next few blocks are for variable length text boxes that expand as needed. sheet-label-under2 is a tall box and has labels under the text input. +The form of the html is a label or span wrapper, an input box, an span that has the invisible auto-expanding field, and an optional span that has the label. + + +To have a label in front of the expanding field, use something like this. + +*/ + +/* This is the tag that wraps the entire thing. It can be a label or a span */ +.charsheet .sheet-autoexpand-wrap { + display: inline-block; + position: relative; + width: auto; + min-width: 2em; + max-width: 50em; + margin-right: 1em; + white-space: nowrap; +} + +.charsheet .sheet-autoexpand-min4 { + min-width: 4em; + width: auto; +} + +.charsheet .sheet-autoexpand-min { + min-width: 14em; + width: auto; +} + + + +.charsheet .sheet-autoexpand-wrap:not(.sheet-label-under2) { + height: 2em; + vertical-align: middle; +} + +.charsheet .sheet-label-under:not(button), +.charsheet .sheet-label-under2 { + display: inline-block; + height: 2.75em; + vertical-align: top; +} + +/* This is the input statement that is visible. */ +.charsheet .sheet-autoexpand-wrap input { + display: block; + overflow: hidden; + width: 100%; + position: absolute; + white-space: normal; +} + +/* This is the invisible copy of the input. This css changes this invisible fields size to the length of the text in the input. The outer wrapper then changes size to match this fields length. */ +.charsheet .sheet-autoexpand-wrap span.sheet-autoexpand { + visibility: hidden; + width: 100%; + white-space: pre; /* pre-wrap; for textarea which I never got working but "pre" should also work for spans */ + word-wrap: break-word; + overflow-wrap: break-word; + overflow: hidden; + font-weight: bold; + padding-right: 2em; /* We want the text box very slightly bigger than the text. JBF@CD was 0.7 em*/ + /* also here make sure the font size is the same or slightly bigger than the input font size */ +} + +/* This is the span that holds the label that we want small at the bottom. */ +.charsheet .sheet-label-under2 span:not(.sheet-autoexpand) { + display: block; + position: relative; /*JBF@CD Changed from absolute 0 to relative -10px*/ + bottom: -13px; + line-height: .75em; + font-size: 85%; + padding-left: .25em; +} + +/* When we have the label under the field, we don't want the label to ever be longer than the field */ +.charsheet .sheet-label-under, +.charsheet .sheet-label-under2 { + overflow: hidden; +} + +.charsheet .sheet-label-under2 span, +.charsheet .sheet-label-under span, +.charsheet .sheet-label-under-select span { + line-height: 10px; + display: block; + /* font-weight: lighter; */ + font-size: 85%; + padding-left: .25em; +} + + + + + +/* ########################################### Filterboxes ####################################################### +# Filterboxes are basically repitems. Except that Filterboxes have been formated to allow certain items to be hidden +# if they don't match the requirements to be displayed. +*/ + +.charsheet .repcontainer .repitem, /* A filterbox should look exactly like a repitem. */ +.sheet-filter-box { + padding: 0px; + margin: 0px; + border: none; + border-radius: 0px; +} + + + +fieldset.repeating_spell+.repcontainer>.repitem, /* A repitem within a spell list should functionally not exist, it's place is taken by a filterbox. */ +fieldset+.repcontainer .repitem, +fieldset+.repcontainer .repitem .sheet-filter-box { + vertical-align: top; +} + +.sheet-filterSpellEffect~.repcontrol, +.sheet-testRepEditMode:not(:checked)~.repcontrol, /*hide buttons in not Edit Mode*/ +.sheet-filter-box { /* By default, display no items of a filter box */ + display: none; +} + +fieldset.sheet-filterSpellEffect+.repcontainer { + display: inline-block; +} + +.repcontainer .repitem { + overflow: hidden; +} + +fieldset+.repcontainer .repitem { + display: block; +} + +fieldset.repeating_talents+.repcontainer .repitem, /*fieldset that we want to wrap have to be specified manually*/ +fieldset.repeating_skills+.repcontainer .repitem, +fieldset.repeating_knacks+.repcontainer .repitem, +fieldset.repeating_matrix+.repcontainer .repitem, +fieldset.repeating_personality+.repcontainer .repitem, +fieldset.repeating_maneuvers+.repcontainer .repitem, +fieldset.repeating_weapons+.repcontainer .repitem { + display: inline-block; + /* padding:5px; */ +} +/* +fieldset+.repcontainer>.repitem:nth-child(2n+2){ + background:lightgrey; +} */ + +/* fieldset+.repcontainer{ + column-width:auto; +} */ + +/* Decide which specific repitems to display. */ +input.sheet-tabGrim[value="0"]~.sheet-filter-box, /* Always display all spells of circle zero, since they have just been added and have not been assigned a circle yet. */ +.sheet-tabGrim[value="0"]~fieldset.repeating_spell+.repcontainer>.repitem .sheet-filter-box, /* When tab0 is checked, display everything no matter what which of the inner boxes are checked. */ +.sheet-tabGrim~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab0:checked~.sheet-filter-box, /*always display the Circle 0 spells*/ +.sheet-tabGrim[value="1"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab1:checked~.sheet-filter-box, +.sheet-tabGrim[value="2"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab2:checked~.sheet-filter-box, +.sheet-tabGrim[value="3"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab3:checked~.sheet-filter-box, +.sheet-tabGrim[value="4"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab4:checked~.sheet-filter-box, +.sheet-tabGrim[value="5"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab5:checked~.sheet-filter-box, +.sheet-tabGrim[value="6"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab6:checked~.sheet-filter-box, +.sheet-tabGrim[value="7"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab7:checked~.sheet-filter-box, +.sheet-tabGrim[value="8"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab8:checked~.sheet-filter-box, +.sheet-tabGrim[value="9"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab9:checked~.sheet-filter-box, +.sheet-tabGrim[value="10"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab10:checked~.sheet-filter-box, +.sheet-tabGrim[value="11"]~fieldset.repeating_spell+.repcontainer>.repitem input.sheet-grim-tab11:not(:checked)~.sheet-filter-box, +/* fieldset.sheet-filtershortlist+.repcontainer>.repitem input.sheet-combattab:checked~.sheet-filter-box, */ +input.sheet-tabMain[value="1"]~div .sheet-section-core fieldset+.repcontainer>.repitem input.sheet-combattab~.sheet-filter-box, +input.sheet-tabMain[value="2"]~div .sheet-section-combat fieldset+.repcontainer>.repitem input.sheet-combattab:checked~.sheet-filter-box, +input.sheet-tabMain[value="3"]~div fieldset+.repcontainer>.repitem input.sheet-combattab~.sheet-filter-box, +input.sheet-tabMain[value="4"]~div fieldset+.repcontainer>.repitem input.sheet-combattab~.sheet-filter-box, +input.sheet-tabMain[value="5"]~div fieldset+.repcontainer>.repitem input.sheet-combattab~.sheet-filter-box, +input.sheet-tabMain[value="6"]~div fieldset+.repcontainer>.repitem input.sheet-combattab~.sheet-filter-box, +.sheet-section-spells fieldset:not(.sheet-filterSpellEffect)+.repcontainer>.repitem input.sheet-spelltab[value^="SPL-"]~.sheet-filter-box, +input.sheet-testSpellEffect[value="Wil"]~fieldset.sheet-filterSpellEffect+.repcontainer>.repitem input.sheet-spelltab[value="SPL-Willforce"]~.sheet-filter-box { + display: inline-block; + border: none; /*JBF*/ +} +/*JBF@JBF@CD : For Skills, Knacks and Talents, in overview, everything is displayed, and in Combat, only the checked ones)*/ + +/*JBF@JBF@CD : Do not display the spellcasting Talent twice, i.e. shown only in spell section... except in creation mode*/ +.sheet-testCreation:not([value="1"])~input.sheet-tabMain[value="1"]~div .sheet-section-core~div fieldset+.repcontainer>.repitem input.sheet-spelltab[value^="SPL-"]+input.sheet-combattab~.sheet-filter-box, +input.sheet-tabMain[value="2"]~div .sheet-section-combat~div fieldset+.repcontainer>.repitem input.sheet-spelltab[value^="SPL-"]+input.sheet-combattab:checked~.sheet-filter-box { + display: none; +} + + + /* ############################################ Tabs ################################################################### */ + + div[class^="sheet-section"] { /* Every class that starts with "sheet-section" starts out hidden */ + visibility: hidden; + opacity: 0; + max-height: 0; + overflow: hidden; + max-width: 0; + padding: 0; +} + +.sheet-tabMain.sheet-tab1 { + margin-left: 10px; +} + +input.sheet-tabMain, +input.sheet-tabSpell, +input.sheet-tabGrim, +input.sheet-tabAdjust { + width: 70px; + height: 20px; + cursor: pointer; + position: relative; + opacity: 0; + z-index: 9999; + vertical-align: middle; + margin-right: 3px; +} + +input.sheet-tabMain { + margin-right: 4px; +} + +.sheet-tabMain::before, +.sheet-tabSpell::before, +.sheet-tabGrim::before, +.sheet-tabAdjust::before { + content: attr(title); + text-align: center; + display: inline-block; + width: 100%; + height: 100%; + background-color: var( --outline-color ); + color: var( --header-font-color ); + font-weight: bold; +} + +input.sheet-tabMain+span, +input.sheet-tabSpell+span, +input.sheet-tabGrim+span, +input.sheet-tabAdjust+span, +.sheet-tabSpan { + text-align: center; + display: inline-block; + font-size: 13px; + background-color: var( --inactive-color ); + color: var( --header-font-color ); + font-weight: bold; + width: 70px; + height: 20px; + border-radius: 10px 10px 0 0; + cursor: pointer; + position: relative; + margin-left: -75px; +} + +input.sheet-tabshort { + width: 40px; +} + +input.sheet-tabshort+span{ +width: 40px; +margin-left: -45px; +} + +.sheet-tabSpell, +.sheet-tabAdjust { + width: 80px; +} + +.sheet-tabSpell+span, +.sheet-tabAdjust+span { + width: 80px; + margin-left: -85px; +} + +.sheet-sec-spacer { /* When have two tabs right under each other, space them by this much. */ + height: 3px; +} + +/* Make the selected section visible */ +input.sheet-tabMain[value="1"]~div .sheet-section-core, +input.sheet-tabMain[value="2"]~div .sheet-section-combat, +input.sheet-tabMain[value="3"]~div .sheet-section-talents, +input.sheet-tabMain[value="4"]~div .sheet-section-knacks, +input.sheet-tabMain[value="5"]~div .sheet-section-skills, +input.sheet-tabMain[value="6"]~div .sheet-section-spells, +input.sheet-tabMain[value="7"]~div .sheet-section-equipment, +input.sheet-tabMain[value="8"]~div .sheet-section-gear, +input.sheet-tabMain[value="9"]~div .sheet-section-notes, +input.sheet-tabMain[value="10"]~div .sheet-section-record, +input.sheet-tabMain[value="11"]~div .sheet-section-adjustments, +input.sheet-tabSpell[value="1"]~.sheet-section-spells-talents, +input.sheet-tabSpell[value="2"]~.sheet-section-spells-matrices, +input.sheet-tabMain[value="1"]~div .sheet-section-spells-matrices, +input.sheet-tabMain[value="2"]~div .sheet-section-spells-matrices, +input.sheet-tabMain:not([value="2"]):not([value="1"])~div input.sheet-tabSpell[value="3"]~.sheet-section-spells-grimoire, +input.sheet-tabAdjust[value="1"]~.sheet-section-adjustments-common, +input.sheet-tabAdjust[value="2"]~.sheet-section-adjustments-maneuvers, +input.sheet-tabAdjust[value="3"]~.sheet-section-adjustments-advanced, +input.sheet-tabAdjust[value="4"]~.sheet-section-adjustments-release , +input.sheet-tabAdjust[value="5"]~.sheet-section-adjustments-help { + max-height: 999999px; + max-width: 999999px; + visibility: visible; + opacity: 1; + transition: opacity 0.5s linear 0s; + overflow: hidden; +} + + +input.sheet-tabMain[value="1"] ~ .sheet-show-leftpane-tab1:not([value="1"])~div .sheet-leftpane, +input.sheet-tabMain[value="2"] ~ .sheet-show-leftpane-tab2:not([value="1"])~div .sheet-leftpane, +input.sheet-tabMain[value="3"] ~ .sheet-show-leftpane-tab3:not([value="1"])~div .sheet-leftpane, +input.sheet-tabMain[value="4"] ~ .sheet-show-leftpane-tab4:not([value="1"])~div .sheet-leftpane, +input.sheet-tabMain[value="5"] ~ .sheet-show-leftpane-tab5:not([value="1"])~div .sheet-leftpane, +input.sheet-tabMain[value="6"] ~ .sheet-show-leftpane-tab6:not([value="1"])~div .sheet-leftpane, +input.sheet-tabMain[value="7"] ~ .sheet-show-leftpane-tab7:not([value="1"])~div .sheet-leftpane, +input.sheet-tabMain[value="8"] ~ .sheet-show-leftpane-tab8:not([value="1"])~div .sheet-leftpane, +input.sheet-tabMain[value="9"] ~ .sheet-show-leftpane-tab9:not([value="1"])~div .sheet-leftpane, +input.sheet-tabMain[value="10"] ~ .sheet-show-leftpane-tab10:not([value="1"])~div .sheet-leftpane, +input.sheet-tabMain[value="11"] ~ .sheet-show-leftpane-tab11:not([value="1"])~div .sheet-leftpane, +input.sheet-tabMain[value="1"] ~ .sheet-show-middlepane-tab1:not([value="1"])~div .sheet-middlepane, +input.sheet-tabMain[value="2"] ~ .sheet-show-middlepane-tab2:not([value="1"])~div .sheet-middlepane, +input.sheet-tabMain[value="3"] ~ .sheet-show-middlepane-tab3:not([value="1"])~div .sheet-middlepane, +input.sheet-tabMain[value="4"] ~ .sheet-show-middlepane-tab4:not([value="1"])~div .sheet-middlepane, +input.sheet-tabMain[value="5"] ~ .sheet-show-middlepane-tab5:not([value="1"])~div .sheet-middlepane, +input.sheet-tabMain[value="6"] ~ .sheet-show-middlepane-tab6:not([value="1"])~div .sheet-middlepane, +input.sheet-tabMain[value="7"] ~ .sheet-show-middlepane-tab7:not([value="1"])~div .sheet-middlepane, +input.sheet-tabMain[value="8"] ~ .sheet-show-middlepane-tab8:not([value="1"])~div .sheet-middlepane, +input.sheet-tabMain[value="9"] ~ .sheet-show-middlepane-tab9:not([value="1"])~div .sheet-middlepane, +input.sheet-tabMain[value="10"] ~ .sheet-show-middlepane-tab10:not([value="1"])~div .sheet-middlepane, +input.sheet-tabMain[value="11"] ~ .sheet-show-middlepane-tab11:not([value="1"])~div .sheet-middlepane, +input.sheet-tabMain[value="1"] ~ .sheet-show-rightpane-tab1:not([value="1"])~div .sheet-rightpane, +input.sheet-tabMain[value="2"] ~ .sheet-show-rightpane-tab2:not([value="1"])~div .sheet-rightpane, +input.sheet-tabMain[value="3"] ~ .sheet-show-rightpane-tab3:not([value="1"])~div .sheet-rightpane, +input.sheet-tabMain[value="4"] ~ .sheet-show-rightpane-tab4:not([value="1"])~div .sheet-rightpane, +input.sheet-tabMain[value="5"] ~ .sheet-show-rightpane-tab5:not([value="1"])~div .sheet-rightpane, +input.sheet-tabMain[value="6"] ~ .sheet-show-rightpane-tab6:not([value="1"])~div .sheet-rightpane, +input.sheet-tabMain[value="7"] ~ .sheet-show-rightpane-tab7:not([value="1"])~div .sheet-rightpane, +input.sheet-tabMain[value="8"] ~ .sheet-show-rightpane-tab8:not([value="1"])~div .sheet-rightpane, +input.sheet-tabMain[value="9"] ~ .sheet-show-rightpane-tab9:not([value="1"])~div .sheet-rightpane, +input.sheet-tabMain[value="10"] ~ .sheet-show-rightpane-tab10:not([value="1"])~div .sheet-rightpane, +input.sheet-tabMain[value="11"] ~ .sheet-show-rightpane-tab11:not([value="1"])~div .sheet-rightpane { + display:none; +} + + +.sheet-tabMain[value="1"]~div .sheet-testRepEditMode:not(:checked) ~ .repcontainer .sheet-HideIfOverviewNoEdit, +.sheet-testCreation:not([value="1"])~.sheet-tabMain[value="1"]~div .sheet-HideIfOverviewNoCreation, +.sheet-tabMain[value="1"]~div .sheet-testRepEditMode:not(:checked) ~ .sheet-HideIfOverviewNoEdit, +.sheet-tabMain[value="1"]~div .sheet-testRepEditMode:not(:checked)~div .sheet-HideIfOverviewNoEdit, +.sheet-tabMain[value="1"]~div .sheet-HideIfOverview, +.sheet-tabMain:not([value="1"])~div .sheet-HideIfNotOverview, +.sheet-tabMain[value="2"]~div .sheet-testRepEditMode:not(:checked) ~ .repcontainer .sheet-HideIfCombatNoEdit, +.sheet-tabMain[value="2"]~div .sheet-testRepEditMode:not(:checked) ~ .sheet-HideIfCombatNoEdit, +.sheet-tabMain[value="2"]~div .sheet-testRepEditMode:not(:checked) ~ div>.sheet-HideIfCombatNoEdit, +.sheet-tabMain[value="2"]~div .sheet-HideIfCombat, +.sheet-tabMain:not([value="2"])~div .sheet-HideIfNotCombat { + display: none; +/* border: 1px yellow solid; */ +} + + +/* Highlight the selected tab */ +input.sheet-tabMain:checked + span, +input.sheet-tabSpell:checked + span, +input.sheet-tabGrim:checked + span, +input.sheet-tabAdjust:checked + span, +input.sheet-tabMain:checked + .sheet-testCloseChecked + .sheet-HideIfCloseChecked, +input.sheet-tabMain:checked + .sheet-testCloseChecked + .sheet-HideIfCloseChecked + .sheet-HideIfNotCloseChecked { + background-color: var( --outline-color ); + color: var( --header-font-color ); + border: 1px solid black; +} + +/* ############################################ JBF Icons and images ################################################### */ + +.sheet-icon-damage-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Damage-background.png);} /*License Information*/ +.sheet-icon-devotion-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Devotion.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/angel-outfit.html#download*/ +.sheet-icon-initiative-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Initiative.png); } /*License Information*/ +.sheet-icon-interdiction-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Interdiction.png); } /*License Information*/ +.sheet-icon-karma-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Karma.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/entangled-typhoon.html*/ +.sheet-icon-MA-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/MA.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-MD-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/MD.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-PA-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/PA.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/chest-armor.html#download*/ +.sheet-icon-PD-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/PD.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/swords-emblem.html*/ +.sheet-icon-recovery-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Recovery.png); } /*Creative Commons :https://game-icons.net/1x1/delapouite/caduceus.html#download*/ +.sheet-icon-SD-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/SD.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-stun-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Stun.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-wounds-background::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Wounds-background.png);} /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ + + +.sheet-icon-action { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action.png); } /*License Information*/ +.sheet-icon-action-free { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action-Free.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ +.sheet-icon-action-simple { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action-Simple.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ +.sheet-icon-action-standard { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action-Standard.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ +.sheet-icon-action-sustained { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action-Sustained.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ +.sheet-icon-action-white { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action-white.png); } /*License Information*/ +.sheet-icon-action-na { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action-NA.png); } /* https://findicons.com/files/icons/2610/flat_weather_icons/128/na.png */ +.sheet-icon-agressive { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Agressive.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ +.sheet-icon-ambush { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Ambush.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ +.sheet-icon-armor { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Armor.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ +.sheet-icon-ask { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Ask.png); } /*License Information*/ +.sheet-icon-attacks { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Attacks.png); } /*Creative Commons: https://game-icons.net/1x1/sbed/falling.html#download*/ +.sheet-icon-attacks-cc { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Attacks-cc.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/blade-drag.html#download*/ +.sheet-icon-blindsided { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Blindsided.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/backstab.html#download*/ +.sheet-icon-blindsiding { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Blindsiding.png); } /*Creative Commons: https://game-icons.net/1x1/darkzaitzev/hooded-assassin.html#download*/ +.sheet-icon-calledshot { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/CalledShot.png); } /*Creative Commons: https://game-icons.net/1x1/darkzaitzev/hooded-assassin.html#download*/ +.sheet-icon-charging { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Charging.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/rhinoceros-horn.html#download*/ +.sheet-icon-coin { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Coin.png); } /*Creative Commons: https://game-icons.net/1x1/darkzaitzev/hooded-assassin.html#download*/ +.sheet-icon-coin-copper { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Coin-Copper.png); } /*Creative Commons: https://game-icons.net/1x1/darkzaitzev/hooded-assassin.html#download*/ +.sheet-icon-coin-silver { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Coin-Silver.png); } /*Creative Commons: https://game-icons.net/1x1/darkzaitzev/hooded-assassin.html#download*/ +.sheet-icon-coin-gold { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Coin-Gold.png); } /*Creative Commons: https://game-icons.net/1x1/darkzaitzev/hooded-assassin.html#download*/ +.sheet-icon-cover { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Cover.png); } /*Creative Commons: https://game-icons.net/1x1/heavenly-dog/defensive-wall.html#download*/ +.sheet-icon-cover99 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Cover-99.png); } /*Creative Commons: https://game-icons.net/1x1/heavenly-dog/defensive-wall.html#download*/ +.sheet-icon-damage-cc { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Damage-cc.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/dripping-knife.html#download*/ +.sheet-icon-damage { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Damage.png); } /*Creative Commons: https://game-icons.net/1x1/sbed/falling.html#download*/ +.sheet-icon-death { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Death.png); } /*Creative Commons :https://game-icons.net/1x1/heavenly-dog/defensive-wall.html#download*/ +.sheet-icon-defenses { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Defenses.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/shield-echoes.html#download*/ +.sheet-icon-defenses-white { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Defenses-White.png); } /*Creative Commons :https://game-icons.net/1x1/heavenly-dog/defensive-wall.html#download*/ +.sheet-icon-defensive { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Defensive.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/arrows-shield.html#download*/ +.sheet-icon-defensive-exc { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Defensive-exc.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/arrows-shield.html#download*/ +.sheet-icon-devotion { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Devotion.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/angel-outfit.html#download*/ +.sheet-icon-devotion-on { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Devotion-On.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/angel-outfit.html#download*/ +.sheet-icon-devotion-ask { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Devotion-Ask.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/angel-outfit.html#download*/ +.sheet-icon-devotion2 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Devotion2.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/angel-outfit.html#download*/ +.sheet-icon-devotion3 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Devotion3.png); } /*Creative Commons :https://game-icons.net/1x1/lorc/angel-outfit.html#download*/ +.sheet-icon-dice { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Dice.png); } /* https://static.thenounproject.com/png/1279708-200.png */ +.sheet-icon-edit { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Edit.png); } /*License Information*/ +.sheet-icon-edit-white { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Edit-White.png); } /*License Information*/ +.sheet-icon-effect { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Effect.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/star-swirl.html#download*/ +.sheet-icon-effect-white { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Effect-white.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/star-swirl.html#download*/ +.sheet-icon-entangled { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Entangled.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/fishing-net.html*/ +.sheet-icon-flying { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Flying.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/fishing-net.html*/ +.sheet-background-frame1 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame1.jpg); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-background-frame2 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame2.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-background-frame3 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame3.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-background-frame4 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame4.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-background-frame5 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame5.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-background-frame6 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame6.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-background-frame7 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame7.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-background-frame8 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame8.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-background-frame9 { background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame9.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-grimoire { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Grimoire.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/fishing-net.html*/ +.sheet-icon-harried { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Harried.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/screaming.html#download*/ +.sheet-icon-harried3 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Harried3.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/screaming.html#download*/ +.sheet-icon-harried4 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Harried4.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/screaming.html#download*/ +.sheet-icon-harried5 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Harried5.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/screaming.html#download*/ +.sheet-icon-impaired { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Impaired.png); } /*Creative Commons: https://game-icons.net/1x1/sbed/falling.html#download*/ +.sheet-icon-impaired4 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Impaired4.png); } /*Creative Commons: https://game-icons.net/1x1/sbed/falling.html#download*/ +.sheet-icon-initiative { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Initiative.png); } /*License Information*/ +.sheet-icon-initiative-noarmor { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Initiative-NoArmor.png);}/*https://static.thenounproject.com/png/539377-200.png */ +.sheet-icon-interdiction { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Interdiction.png); } /*License Information*/ +.sheet-icon-inventory { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Inventory.png); } /*License Information*/ +.sheet-icon-jumpup { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/JumpUp.png); } /*License Information*/ +.sheet-icon-karma { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Karma.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/entangled-typhoon.html*/ +.sheet-icon-karma2 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Karma2.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/entangled-typhoon.html*/ +.sheet-icon-karma3 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Karma3.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/entangled-typhoon.html*/ +.sheet-icon-karma-ask { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Karma-Ask.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/entangled-typhoon.html*/ +.sheet-icon-karma-on { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Karma-On.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/entangled-typhoon.html*/ +.sheet-icon-kit { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Kit.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/entangled-typhoon.html*/ +.sheet-icon-knockeddown { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Knockdown.png); } /*Creative Commons: https://game-icons.net/1x1/sbed/falling.html#download*/ +.sheet-icon-leftpane { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/LeftPane-White.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-link { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Link.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-link-out { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Link-out.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-link-in { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Link-in.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-link-in-out { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Link-In-Out.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-MA { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/MA.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-maneuver-creature { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Maneuver-Creature.png);} /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-maneuver-opponent { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Maneuver-Opponent.png);} /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-maneuver-show { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Maneuver-Show.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-matrix { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Matrix.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-matrix-attune { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Matrix-Attune.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-matrix-enhanced { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Matrix-Enhanced.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-matrix-armored { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Matrix-Armored.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-matrix-shared { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Matrix-Shared.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-MD { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/MD.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-move-based { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Move-Based.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-naked { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Naked.png); } /*https://game-icons.net/1x1/delapouite/chat-bubble.html#download*/ +.sheet-icon-naked-white { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Naked-white.png); } /*https://game-icons.net/1x1/delapouite/chat-bubble.html#download*/ +.sheet-icon-newday { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/NewDay.png); } /*https://game-icons.net/1x1/delapouite/chat-bubble.html#download*/ +.sheet-icon-notes { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Notes.png); } /*https://game-icons.net/1x1/delapouite/chat-bubble.html#download*/ +.sheet-icon-noshield { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/NoShield.png); } /*https://game-icons.net/1x1/skoll/shield-disabled.html#downloadd*/ +.sheet-icon-PA { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/PA.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/chest-armor.html#download*/ +.sheet-icon-parameter { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Parameter.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-parameter-white { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Parameter-white.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-partialcover { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/PartialCover.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-PD { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/PD.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/swords-emblem.html*/ +.sheet-icon-poisoned { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Poisoned.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-potion { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Potion.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-rangelong { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/RangeLong.png); } /*Creative Commons: https://game-icons.net/1x1/sbed/falling.html#download*/ +.sheet-icon-ration { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Ration.png); } /*Creative Commons: https://game-icons.net/1x1/sbed/falling.html#download*/ +.sheet-icon-recovery { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Recovery.png); } /*Creative Commons :https://game-icons.net/1x1/delapouite/caduceus.html#download*/ +.sheet-icon-reserved { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Reserved.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-resistance { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Resistance.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-rolltype-ask { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Rolltype-ask.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-rolltype-public { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Rolltype-Public.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-rolltype-PGM { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Rolltype-PGM.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-rolltype-GM { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Rolltype-GM.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-SD { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/SD.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-shield { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Shield.png); } /*Creative Commons : https://game-icons.net/1x1/lorc/fist.html#download*/ +.sheet-icon-split { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Split.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-stealthy { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Stealthy.png); } /*Creative Commons: https://game-icons.net/1x1/lorc/bolt-shield.html#download*/ +.sheet-icon-strain { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Strain.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-strain1 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Strain1.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-strain2 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Strain2.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-strain3 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Strain3.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-stun { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Stun.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-stun-white { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Stun-white.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-sum { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Sum.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-surprised { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Surprised.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-tail { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Tail.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-tips-edit { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Tips-Edit.gif); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-tips-mods { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Tips-Mods.gif); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-tips-tooltip { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Tips-Tooltip.gif); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-tknactn { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/TknActn.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-TN { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/TN.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-vision { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Vision.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-vision4 { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Vision4.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-vision-based { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Vision-Based.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-weapon { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Weapon.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-wealth { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Wealth.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-weave { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Weave.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-weave-extra { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Weave.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ +.sheet-icon-willforce { content: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Willforce.png); } /*Creative Commons: https://game-icons.net/1x1/delapouite/knocked-out-stars.html#download*/ + +/* Elsewhere in this file there are url's describing Strain.png, Frame20.png, + and two logo's that are stored on on amazon servers instead of github. + a few hundred lines down also find .sheet-rolltemplate-icon-ask and about 15 other definitions, but they all use icons already defined above. +*/ + +.sheet-frame { + background-size: 100% 100%; + /* Temporarly disabled to work on the color palette */ + /* background-size: 0% 0%; */ +} + + + + + +.sheet-frameBig { + /* background-size: 110% 110%; Temporarly disabled to work on the color palette*/ + background-size: 0% 0%; +} + +.sheet-iconlabel-white.sheet-iconpaddedright, +.sheet-iconlabel-header.sheet-iconpaddedright, +.sheet-iconpaddedright { + padding-right: 3px ; /* JBF was important*/ + margin-left: -3px ; /* JBF was important*/ + padding-top: 0px ; /* JBF was important*/ + padding-bottom: 0px ; /* JBF was important*/ + border: 1px solid transparent; + vertical-align: middle; +} +.sheet-iconlabel-white.sheet-iconpaddedleft, +.sheet-iconlabel-header.sheet-iconpaddedleft, +.sheet-iconpaddedleft { + padding-left: 3px ; /* JBF was important*/ + margin-right: -3px ; /* JBF was important*/ + padding-top: 0px ; /* JBF was important*/ + padding-bottom: 0px ; /* JBF was important*/ + vertical-align: middle; +} + +.sheet-undernumber { + padding-top: 0px; + margin-top: -4px; +} + + +.sheet-Karma-ControlBox { + white-space: nowrap; + display: inline-block; + width: 30px; + text-align: center; + vertical-align: middle; + padding: 0; + margin: 1px; +} + +/* ############################################ JBF : Icon checkboxes Management #################################### */ +.charsheet input.sheet-iconcheckbox { + display:none; +} + +.sheet-iconlabel-header-invert, +.sheet-iconlabel-invert, +.sheet-iconlabel-header, +.sheet-iconlabel { + display: inline-block; + padding: 1px; + height: 20px; + width: 20px; + margin: 0px; + vertical-align: middle; + border-radius: 5px; + opacity: 0.7; + border: 1px solid transparent; + background-color: var( --icon-color); +} + + +.sheet-iconlabel-white { + display: inline-block; + padding: 2px; + opacity: 0.5; + height: 20px; + width: 20px; + margin: 0px; + border: 1px solid transparent; + vertical-align: middle; +} + +.sheet-iconlabelsmall { + display: inline-block; + vertical-align: middle; + padding: 0px; + opacity: 0.7; + width: 15px; + margin: 0px; + border: 1px solid transparent; +} + +.sheet-iconlabelCC { + display: inline-block; + vertical-align: middle; + padding: 0px; + opacity: 1; + width: 20px; + margin: 0px; + border: 1px solid transparent; + background-color: var( --icon-color); +} + +.sheet-iconlabelbig { + display: inline-block; + vertical-align: middle; + padding: 1px; + opacity: 1; + width: 30px; + margin: 0px; + border: 1px solid transparent; + background-color: var( --icon-color); +} + +.sheet-iconstatic { + width: 20px; + text-align: center; + vertical-align: middle; + padding: 0px; + margin: 0px; +} + +.sheet-iconstaticsmall { + width: 15px; + text-align: center; + vertical-align: middle; + padding: 0px; + margin: 0px; +} + +.sheet-iconstaticBig { + width: 30px; + text-align: center; + vertical-align: middle; + padding: 0px; + margin: 0px; + margin-right: -5px; +} + +input.sheet-iconcheckbox:not(:checked) + .sheet-iconlabel-header-invert, +input.sheet-iconcheckbox:not(:checked) + .sheet-iconlabel-invert, +input.sheet-iconcheckbox:checked + .sheet-iconlabel-header, +input.sheet-iconcheckbox:checked + .sheet-iconlabelsmall, +input.sheet-iconcheckbox:checked + .sheet-iconlabel { + opacity: 1; + border: 1px solid black; +} + + + + +input.sheet-iconcheckbox:checked + .sheet-iconlabel-white, +input.sheet-iconcheckbox:not(:checked) + .sheet-iconlabelbig { + opacity: 1; + border: 1px solid transparent; +} + +input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabel-invert:hover, +input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabel-header-invert:hover, +input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabel-header:hover, +input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabelCC:hover, +input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabelbig:hover, +input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabelsmall:hover, +input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabel:hover, +input[type="radio"].sheet-iconcheckbox:not(:checked) + .sheet-iconlabel:hover { + background-color: var( --hover-color-bg ); + background-position: 0 -15px; + background-position-x: 0px; + background-position-y: -15px; + -webkit-transition: background-position .1s linear; + -moz-transition: background-position .1s linear; + -ms-transition: background-position .1s linear; + -o-transition: background-position .1s linear; + transition: background-position .1s linear; + transition-property: background-position; + transition-duration: 0.1s; + transition-timing-function: linear; + transition-delay: 0s; + border : 1px solid var( --hover-color ); +} + +input[type="checkbox"].sheet-iconcheckbox + .sheet-iconlabel-white:hover, +input[type="radio"].sheet-iconcheckbox:not(:checked) + .sheet-iconlabel-white:hover { + border : 1px solid red; + opacity: 0.8; +} + +/*JBF@JBF : logic hiding unchecked icons when the header is not hovered*/ + +.sheet-header-flex-container:not(:hover) .sheet-iconcheckbox:checked+.sheet-iconlabel-header-invert, +.sheet-header-flex-container:not(:hover) .sheet-iconcheckbox:not(:checked)+.sheet-iconlabel-header { + height: 0px; + /* width:0px; */ + border: 1px solid transparent; + background : transparent; + /* padding: 0px; */ + margin: 0px; +} + +/*JBF@JBF : logic collapsing the icon container */ +.sheet-iconlabel2 { + margin: 0px !important; + padding: 0px !important; + min-width: 0px !important; + flex-grow: 0; /* it cant grow anymore... We want it to collapse */ + flex-shrink: 1; +} + + +/* ####################################### JBF : Strain icon */ +/* JBF version with the drop of blood */ +input[type="text"].sheet-strainicon { + background: var(--locked-color); + background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Strain.png); + background-repeat: no-repeat; + width: 2.5em; + height: 2.5em; + background-position: 0px -3px; + background-size: cover; + color: var( --header-font-color ); + font-size: 11px; + font-family : initial; +} + +.sheet-info { + float: right; + margin-top: -6px; + height: 30px; + font-family: "Pictos"; + font-size: 24px; +} + + +/* ############################################ Roll Templates & colors ###################################################### */ +/* For some weird Reason, the Print format must be in between the roll templates and the API buttons. DO NOT MOVE */ + +.sheet-rolltemplate-chatrecord { +/* background-color: LightBlue; */ +} + + + +.sheet-rolltemplate-chatrecord table, +.sheet-rolltemplate-rolltargetnumber table { + width: 100%; + border: 1px solid black; + color: black; + font-size: 1em; + font-family: "Helvetica Neue", Helvetica, sans-serif; +} + +.sheet-rolltemplate-chatrecord thead, +.sheet-rolltemplate-rolltargetnumber thead { + border-bottom: 1px solid black; + line-height: 1.6em; + font-size: 1.2em; + /* font-family: Papyrus, fantasy; */ + font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; + font-weight: normal; +} + +.sheet-rolltemplate-chatrecord th { + background-color: #660066; + color: white; + padding-left: 5px; + vertical-align: middle; +} + +.sheet-rolltemplate-rolltargetnumber th { + background-color: #000066; + padding-left: 5px; + vertical-align: middle; + color: white; +} + +.sheet-rolltemplate-chatrecord td, +.sheet-rolltemplate-rolltargetnumber td { + padding: 5px; + border-bottom: 1px solid black; +} + +.sheet-rolltemplate-chatrecord tr:nth-child(odd), +.sheet-rolltemplate-rolltargetnumber tr:nth-child(odd) { + background-color: rgba(217, 217, 214, 1); +} + +.sheet-rolltemplate-chatrecord tr:nth-child(even), +.sheet-rolltemplate-rolltargetnumber tr:nth-child(even) { + background-color: rgba(233, 233, 233, 1); +} + +.sheet-rolltemplate-chatrecord td:first-child, +.sheet-rolltemplate-rolltargetnumber td:first-child { + text-align: right; + font-weight: bold; +} + + +.sheet-rolltemplate-chatrecord a[href^="!"] { + border: 0.8px; + padding: 5px; + background-color: PaleGreen; + color: black; +} + + +/* These are all tries for formatting the API roll templates*/ +.sheet-rolltemplate-sect{ + background-color: white; + background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Frame20.png); + background-size : 103% 103%; + background-position: 55% 53%; + border: solid 2px black; + padding: 13px; + border-radius: 5px; + overflow: hidden; + width: 90%; +} + +.sheet-rolltemplate-body { + text-align: left; + padding-left: 5px; + padding-right: 0px; + padding-bottom: 2px; + line-height: 1.5em; +} + +.sheet-rolltemplate-subheadertext { +line-height: 0.9em; +font-size: 0.9em; +font-weight: lighter; +color: black; +background: transparent; +text-align: center; +margin-top: -0.1em; +margin-bottom: 0.2em; +} + +.sheet-rolltemplate-header { + font-weight: bold; + text-align: center; + color: black; + background: white; + /* font-family: Papyrus, fantasy; */ + font-family: 'Aladin', Papyrus, "Helvetica Neue", Helvetica, sans-serif; + vertical-align: middle; + line-height: 1.2em; + font-size: 1.2em; + margin-bottom: 3px; +} + +.sheet-rolltemplate-header::before { + content: ""; + display: inline-block; + /* background: url("https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Long-Range.png") no-repeat; */ + background-size: 20px !important; + background-repeat: no-repeat; + width: 20px; + height: 20px; + margin: 0 6px 0 0; +} + +.sheet-rolltemplate-button { + background-color: firebrick !important; + color: white !important; + padding: 1px 8px !important; + border: 1px solid black !important; + margin: 2px 5px !important; + min-width: auto; + border-radius: 5px; +} + +.sheet-rolltemplate-icon-ask, +.sheet-rolltemplate-icon-pd, +.sheet-rolltemplate-icon-md, +.sheet-rolltemplate-icon-sd, +.sheet-rolltemplate-icon-action, +.sheet-rolltemplate-icon-attacks, +.sheet-rolltemplate-icon-attackcc, +.sheet-rolltemplate-icon-init, +.sheet-rolltemplate-icon-initrep, +.sheet-rolltemplate-icon-weave, +.sheet-rolltemplate-icon-knockdown { + color: darkgreen; + border-bottom: 4px darkgreen solid; +} + +.sheet-rolltemplate-icon-effect, +.sheet-rolltemplate-icon-damage, +.sheet-rolltemplate-icon-damagecc { + color: firebrick; + border-bottom: 4px firebrick solid; +} + +.sheet-rolltemplate-icon-recovery { + color: darkgoldenrod; + border-bottom: 4px darkgoldenrod solid; +} + + + + +.sheet-rolltemplate-icon-ask::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Ask.png);} +.sheet-rolltemplate-icon-pd::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/PD.png);} +.sheet-rolltemplate-icon-md::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/MD.png);} +.sheet-rolltemplate-icon-sd::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/SD.png);} +.sheet-rolltemplate-icon-action::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Action.png);} +.sheet-rolltemplate-icon-effect::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Effect.png);} +.sheet-rolltemplate-icon-attacks::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Attacks.png);} +.sheet-rolltemplate-icon-attackcc::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Attacks-cc.png);} +.sheet-rolltemplate-icon-damage::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Damage.png);} +.sheet-rolltemplate-icon-damagecc::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Damage-cc.png);} +.sheet-rolltemplate-icon-init::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Initiative.png);} +.sheet-rolltemplate-icon-initrep::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Initiative.png);} +.sheet-rolltemplate-icon-recovery::before, +.sheet-rolltemplate-icon-recoveryrep::before{ background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Recovery.png);} +.sheet-rolltemplate-icon-weave::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Weave.png);} +.sheet-rolltemplate-icon-knockdown::before { background-image: url(https://raw.githubusercontent.com/roll20/roll20-character-sheets/master/Earthdawn%20%28FASA%20Official%29/Images/Knockdown.png);} + + + +/* ####################### Print Format ################# */ + +/* For some weird Reason, the Print format must be in between the roll templates and the API buttons. DO NOT MOVE */ + +@media print { + /* All your print styles go here */ + /* .sheet-buffSignLeft, + .sheet-buffSignRight, + .sheet-buffLeft, + .sheet-buffRight + { display: none !important; } */ + + .sheet-ShowIfPrint { + display: inline-block !important; + } + + .ui-dialog { + position: static !important; + } + + .sheet-redGreen[value^="-"]~ b, + .sheet-greenRed[value^="-"]~ b, + .sheet-redGreen[value="0"] ~ input, + .sheet-greenRed[value="0"] ~ input, + .sheet-redGreen[value="0"] ~ b, + .sheet-greenRed[value="0"] ~ b { + /* color: transparent !important; */ + } + + +/*Manage the display of the different sections*/ + + .sheet-tabGrim~fieldset.repeating_spell+.repcontainer>.repitem .sheet-filter-box /* display everything no matter what which of the inner boxes are checked. */ + { + display: block; + border: none; /*JBF*/ + } + /*JBF@JBF@CD : For Skills, Knacks and Talents, in overview, everything is displayed, and in Combat, only the checked ones)*/ + + + + input.sheet-tabMain~div .sheet-section-core, + input.sheet-tabMain~div .sheet-section-talents, + input.sheet-tabMain~div .sheet-section-knacks, + input.sheet-tabMain~div .sheet-section-skills, + input.sheet-tabMain~div .sheet-section-spells, + input.sheet-tabMain~div .sheet-section-equipment, + input.sheet-tabMain~div .sheet-section-gear, + input.sheet-tabMain~div .sheet-section-notes, + input.sheet-tabMain~div .sheet-section-record, + input.sheet-tabSpell~.sheet-section-spells-talents, + input.sheet-tabSpell~.sheet-section-spells-matrices, + input.sheet-tabSpell~.sheet-section-spells-grimoire { + max-height: 999999px; + max-width: 999999px; + visibility: visible; + opacity: 1; + transition: opacity 0.5s linear 0s; + break-after: auto; + /* border-top: 2px double var(--outline-color); */ + } + + .sheet-tabMain~div .repcontainer .sheet-HideIfOverviewNoEdit, + .sheet-tabMain~div .sheet-HideIfOverviewNoEdit, + .sheet-tabMain~div .sheet-HideIfOverview, + .sheet-tabMain~div .sheet-HideIfNotOverview, + .sheet-tabMain~div .repcontainer .sheet-HideIfCombatNoEdit, + .sheet-tabMain~div .sheet-HideIfCombatNoEdit, + .sheet-tabMain~div .sheet-HideIfCombat, + .sheet-tabMain~div .sheet-HideIfNotCombat { + display: inline-block !important; + } + + #macrobar, + #macrobar_macros, + #edit-button, + #playerzone, + .sheet-icon-link-in, + .sheet-icon-link-out, + .sheet-icon-link-in-out, + .repcontrol, + .sheet-testEdition[value="3"]~div .sheet-HideIfEdition3, + .sheet-testEdition:not([value="3"])~div .sheet-HideIfNotEdition3, + .sheet-testEdition[value="4"]~div .sheet-HideIfEdition4, + .sheet-testEdition:not([value="4"])~div .sheet-HideIfNotEdition4, + .sheet-testCloseChecked:checked+.sheet-HideIfCloseChecked, + .sheet-testCloseChecked:not(:checked)+.sheet-HideIfNotCloseChecked, + .sheet-testCloseChecked:not(:checked)+.sheet-HideIfCloseChecked+.sheet-HideIfNotCloseChecked, + .nav-tabs, + .nav, + .sheet-Creation, + .sheet-HideIfPrint, + .sheet-tabMain~div .repcontainer .sheet-HideIfOverviewNoEdit.sheet-HideIfPrint, + .sheet-tabMain~div .sheet-HideIfOverviewNoEdit.sheet-HideIfPrint, + .sheet-tabMain~div .sheet-HideIfOverview.sheet-HideIfPrint, + .sheet-tabMain~div .sheet-HideIfNotOverview.sheet-HideIfPrint, + .sheet-tabMain~div .repcontainer .sheet-HideIfCombatNoEdit.sheet-HideIfPrint, + .sheet-tabMain~div .sheet-HideIfCombatNoEdit.sheet-HideIfPrint, + .sheet-tabMain~div .sheet-HideIfCombat.sheet-HideIfPrint, + .sheet-tabMain~div .sheet-HideIfNotCombat.sheet-HideIfPrint, + .sheet-testAPI:not([value="1"])~div .sheet-api, + .sheet-testAPI:[value="1"]~div .sheet-NoAPI { + display: none !important; + } + + .sheet-headerbar { + color : white !important; + background-color : var(--outline-color) !important; + /* font-family: Papyrus, fantasy; */ + font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; + font-weight: normal; + } + + .sheet-text-button-header { + color : var(--input-color) !important; + background-color : var(--outline-color) !important; + /* font-family: Papyrus, fantasy; */ + font-family: 'Aladin', "Helvetica Neue", Helvetica, sans-serif; + font-weight: normal; + } + + + .sheet-leftpane, + .sheet-middlepane { + width:200px; + } + + .sheet-flex-container { + display: flex; + align-items: flex-start; + justify-content: space-between; + } + +} /* end media print */ + +/* ####################### API Format ################# */ +/* For some weird Reason, the Print format must be in between the roll templates and the API buttons. DO NOT MOVE */ +a.sheet-chatbutton, +.textchatcontainer a[href^="!"].sheet-chatbutton, +a.textchatcontainer a.sheet-chatbutton { + padding: 0px 3px !important; + border: 1px solid black !important; + border-radius: 5px; + margin: 1px 0px !important; + min-width: auto; + white-space: nowrap; + background-color: grey; + color: white; +} + +/* ########################### End ############################### */ diff --git a/Earthdawn (FASA Official)/Earthdawn.html b/Earthdawn (FASA Official)/Earthdawn.html index 76887f0227..1ca6eab9ce 100644 --- a/Earthdawn (FASA Official)/Earthdawn.html +++ b/Earthdawn (FASA Official)/Earthdawn.html @@ -1,17155 +1,17155 @@ - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -
-
- - -
-
- - - - - -
- -
-
-
-
- -
-
- / - - -
-
-
- -
- - -
- - -
- -
-
- - - -
-
- - - - -
- -
-
-
-
- -
-
- / - -
-
-
-
- -
- - -
- -
-
- - - -
-
-
- - - -
- -
-
-
-
- -
-
- / - -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- - - -
-
-
Wounds
-
-
-
- - -
-
- Tr: -
-
-
- - - - - -
-
Wnd Tres
-
- - - - - - + - - - -
-
- - - - -
-
- - Damage -
-
-
- -
- -
-
-
- -
-
-
- -
- -
-
-
- - - - -
-
- - Stun
-
-
- -
- - -
-
-
- - - -
-
- - -
-
- - - API - NoAPI - - - - - - - - - - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - -
-
-
- - - -
- - - -
-
- - - -
-
- - -
-
- - - -
-
- - - -
-
- - -
-
- - - - -
-
- - - -
-
- - -
-
- - - -
-
- - - -
-
- - - - -
- -
- Aggr. : - - - Def. : - - - Called Shot : - - - Tail Atk : - - - Blindsiding : - - - KndDown : - - - Harried : - - - Blindsided : - - - Surprised : - - - Uncon. : - - - Dead : - - - - Diving/Charging : - - - - Ambushing : - - -
-
- - - -
- -
- Warning - Sheet was in API mode, but API not responding. Sheet is in NoAPI Mode until API is restarted.
- If you still use the API, restart it.
- If you stopped using the API, click the following button. - -
-
- - - - -
- Overview - Combat - - - Talents - Powers - - Knacks - Skills - - Spell - Equipment - - Notes - Legend - Parameters -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-
-
- -
-
- Attributes -
- -
-
- -
- 2- Generate Attributes. -
-
- Attribute Points:
- Karma Points :   
- Spend Attributes points or set the Step -
- -
- - - -
-
- -
Race: - -
-
+ Creation Pts:
-
- = -
-
-
-
-
- - - - - - - - - - - - - - -
-
- - - - - + - - - - - + - - - - - - - - - + - - - - - - - - -
- -
- -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
LP Incr.:
-
- -
-
-
-
-
- - - -
-
- -
Race: - -
-
+ Creation Pts:
-
- = -
-
-
-
-
- - - - - - - - - - - - - - -
-
- - - - - + - - - - - + - - - - - - - - + - - - - - - -
- -
- -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
LP Incr.:
-
- -
-
-
-
-
- - - -
-
- -
Race: - -
-
+ Creation Pts:
-
- = -
-
-
-
-
- - - - - - - - - - - - - - -
-
- - - - - + - - - - - + - - - - - - - - + - - - - - - -
- -
- -
-
-
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
LP Incr.:
-
- -
-
-
-
-
- - - -
-
- -
Race: - -
-
+ Creation Pts:
-
- = -
-
-
-
-
- - - - - - - - - - - - - -
-
- - - - - + - - - - - + - - - - - - - - + - - - - - - -
-
- -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
LP Incr.:
-
- -
-
-
-
-
- - - -
-
- -
Race: - -
-
+ Creation Pts:
-
- = -
-
-
-
-
- - - - - - - - - - - - - - -
-
- - - - - + - - - - - + - - - - - - - - + - - - - - - -
- -
- -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
LP Incr.:
-
- -
-
-
-
-
- - -
-
- -
Race: - -
-
+ Creation Pts:
-
- = -
-
-
-
-
- - - - - - - - - - - - - - -
-
- - - - - + - - - - - + - - - - - - - - + - - - - - - -
- -
- -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
LP Incr.:
-
- -
-
-
-
-
-
-
- - - -
-
- 3- Characteristics. -
-
- Automatically Calculated -
-
Defenses - -
- -
-
- - -
- - - -
-
-
Phys. Def.
-
-
- - - - + - - - - - - - - - - + - - - -
-
-
-
- - - : - - - PD-B: - - - - - - - -
-
-
Myst. Def.
-
-
- - - - + - - - - - - - + - - - -
-
-
-
- - - : - - - MD-B: - - - - - - - - - - -
-
Soc. Def.
-
-
- - - - + - - - - - - - - - + - - - -
-
-
- - - : - - - SD-B: - - - - - - - -
- - -
Armor
-
- - - -
-
-
Phys. Arm.
-
-
- - - - + - - - - - - - + - - - -
-
-
-
- - - : - - - - - -
-
-
Myst. Arm.
-
-
- - - - + - - - - - - - + - - - -
-
-
-
- - : - - - -
- - - - -
Others
-
- - -
-
-
- - -
-
-
- - - - + - - - - - - - + - - - -
-
-
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
-
- - -
-
-
- - - -
-
- Modifiers -
- -
-
- - - - -
-
Actions
-
- - - - + - - - - - - + - - - -
-
- - - - - -
-
Effects
-
- - - - + - - - - - - + - - - -
-
- - - - - -
-
Defenses
-
- - - - + - - - - - - + - - - -
-
- - - - - - -
- -
Attacks
-
Attacks-CC
-
- - - - - + - - - - - - - + - - - - - - - - + - - - - - - - + - - - -
-
- - -
- Atk Bonus die: - -
- - - - - -
- -
Damage
-
Damage-CC
-
- - - - - + - - - - - - - + - - - - - - - - + - - - - - - - + - - - -
-
- -
- Dmg Bonus die: - -
- - - - - -
-
Target #s
-
- - - - + - - - - - - + - - - -
-
-
-
- - - -
-
- Steps -
-
-
 1 
D4-2
 16 
D12+D8+D6
-
 2 
D4-1
 17 
D12+2D8
-
 3 
D4
 18 
D12+D10+D8
-
 4 
D6
 19 
D20+2D6
-
 5 
D8
 20 
D20+D8+D6
-
 6 
D10
  21 
D20+2D8
-
 7 
D12
  22 
D20+D10+D8
-
 8 
2D6
  23 
D20+2D10
-
 9 
D8+D6
  24 
D20+D12+D10
-
 10 
2D8
  25 
D20+2D12
-
 11 
D10+D8
  26 
D20+D12+2D6
-
 12 
2D10
  27 
D20+D12+D8+D6
-
 13 
D12+D10
  28 
D20+D12+2D8
-
 14 
2D12
  29 
D20+D12+D10+D8
-
 15 
D12+2D6
  30 
2D20+2D6
-
-
-
- - - - -
- - -
- - -
0- Choose between Building a Hero (Select PC) / or creating a Foe (Select NPC, or Mook)
-
- PC? - - - -
To Import a Creature and/or a Mask from Book copy and Paste description (starting with name) into this tiny text box. Note that for Spirits, it is important to set the Discipline to Spirit and Circle to the SR first.
- Creature : -
- Mask:       -
-
- - -
-
- - - -
- Overview -
- - -
-
-
- - - -
- -
-
- - - -
- Combat -
- -
-
-
- - - - -
-
Header Parameters
-
- Karma: Auto Mode : - - -
-
- - Damage - Stun: - - - Wound Treshold : - -
-
- - Combat Options and Situation Modifiers : - -
-
Left Panes Parameters
-
-
- - Attributes - Effect and Action Toggle: - - -
-
- - Defenses - Natural Value toggle - -
-
- -
Overview Combat Section Parameters
-
-
- - Overview - Misc Pools and Movement - -
-
- - Combat - Misc Pools and Movement - -
-
-
- - - - -
-
1- Choose a Race and Discipline
-
Racial Abilities will be automatically added
-
- - -
- -  Discipline / Other  -  Circle  - Durability -
- - - - - - - - - - - - - - - - -
- -
- - -   -   - - - - - - - - - - - - - - - - - - - - - -
- -
- - Base Discipline : - - -
- -
-
- - -
- -  Discipline / Other  - Circle - -
- -
- - - - - -   - - - - - - - - - - - - - - - - -
-
- - -
- - Race - - - Karma - -
- - -
- - - Flight: - - - -
- - Movement -
- - - - - - - - -
- - -
- - Passion:  - -
- -
- -
- - Passion:  - -
- -
-
- - -
-
Health Adjustments
-
-
For NPCs, you can here set some adjustment to the health values - Note that to manually set attributes, you can enter a temporary buff and use the function "Set Adjustments" that will transfer the temporary buff as permanent adjustment
-
-
- Unconscious Rating: - - Death Rating: - - Wound Threshold: - - - Recovery Tests/day:  - - Recovery Step: - -
-
-
-
-
- - - - - -
- -
-
-
- Creature & Opponent Maneuvers : -
-
- - - Hardened Armor - - - - Grab and Bite - - - - Hamstring - - - - Overrun - - - - Pounce - - - - Squeeze the Life - - - - Fury - - - - Resist Pain - - - - Willful - - - - Ambush - - - - Dive/Charge - -
-
- - - Clip the Wing - - - - Crack the Shell - - - - Defang - - - - Enrage - - - - Provoke - - - - Pry Loose - -
- -
-
- - - - - - - - - - - -
- -
- -
-
-
- - -
- -
-
Movement
-
- - - - + - - - - - - - - - - - - - - + - - - -
-
- - - - -
-
- -
-
Flying Alt.
-
- -
-
-   -
-
- - - -
- - - - -
- - - - - - + - - - -
-
- - - - - - + - - - -
-
- - -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
- - -
Weapons and Attacks
- - -
-
- -
-
- Nb Actions: - - - - - - - - - - - - + - - - - - - - + - - - - -
- - -
- -
- - - - - - - - - - - - - - - - - - - + - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- - - - -
-
- Talents, Knacks and Skills - Powers -
-
- - - - -
- -
-
- - - -
- -
Talents
-
Powers
- -
- i - - -
-
- -
4- Assign Talent Ranks
- -
Add below the Talents of your discipline, and spend 8 Ranks. Remaining Points : - -
-
- - -
- - -
-
- - - -
- Knacks -
- i - - -
-
-
- - -
- -
-
- - - -
- Skills -
- i - - -
-
- -
- - - - -
-
Repeating Sections Parameters
-
- Modifier Exceptions : - - -
-
- After roll parameters : - - -
-
- Links : - - -
-
- Special : - - -
- Use All Talents to Advance (PG p453) : - - -
-
-
- - - -
- -
- - - - - - -
- -
-
-  Talent Name  -  Power Name   -  Type  - -  Rank  -  Rank  -  Attribute  -  Step  -  Target  -  Origin  - Actn - Stn - Kma - DP -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
- - - - - - - - - - - - - -
- If you have a PDF copy of the book, you can copy an entire Talent or Questor Devotion description (starting with the name, - and including everything) and paste it into this tiny text box. It will be parsed and whatever fields - can be set based upon the text will be. You will still need to manually set some of the fields, most importantly "Modifiers". - You can also just type the Talent Name, and it will just be Autofilled with settings from the database. - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - + - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - -v - -v - h-v - h - h - h - h+1 - h+1 - h+1 - -N - -N - -N - - 2 - 5 - 6 - 10 - - - - - - - - - - - - - - - - - - - - - - - - -Nat - -Nat - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- Import : - -
- -
- - - - - - - -
- -
- - Max Karma Allowed - - - - Karma Required: - - - - - Max DP Allowed - - - - - - - DP Required: - - - - -
- - -
- - - - - - - - Visibility : - - - - Default - - - - - - - - - - - - - - Result Mods : - - -
-
- - -
- Modifiers Exceptions - - Move Based : - - - Vision Based : - - - - Defensive : - - - Resistance : - - -
- - -
- Special: - - -
- - -
- - Link : - - - - - - - -
- -
- After roll parameters - - - - - - - - : - - - - - -
-
-
- - - -
- -
- -
-
-
-
- - - - -
-
- - - - - - -
- -
- Knack Summary Report - - Hide : - - - Use Current Ranks and Circle : - - - Use Substitution Ranks and Circle : - - - - -
-
- -
- -
- - - - -
-  Knack Name  -  Power Name   -  Type  -  Rank  -  Rank  -  Attribute  -  Step  -  Target  -  Origin  - Actn - Stn - Kma - DP -
- - -
- -
- -
- - - - - - - - - - -
- - If you have a PDF copy of the book, you can copy an entire Knack or Questor Devotion description (starting with the name, and including everything) and paste it into this tiny text box. It will be parsed and whatever fields can be set based upon the text will be. You will still need to manually set some of the fields, most importaintly "Modifiers". - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - + - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - -v - -v - h-v - h - h - h - h+1 - +1 - +1 - -N - -N - -N - - 2 - 5 - 6 - 10 - - - - - - - - - - - - - - - - - - - - - - - - -Nat - -Nat - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - Max Karma Allowed : - - - - Karma Required : - - - - - Max DP Allowed : : - - - - - - DP Required : - - - -
- - -
- - - - - Requirements Rank: - - - -
- -
- - Link : - - - - - - - - -
- - - - - Visibility : - - - - Default - - - - - - - - - - - - - - Result Mods : - - -
-
- - -
- Modifiers Exceptions - - Move Based : - - - Vision Based : - - - - Defensive : - - - Resistance : - - -
- - -
- Special: - - -
- - -
- After roll parameters - - - - - - : - - - -
-
-
- - -
- -
- -
-
-
-
- - - - -
- -
5- Assign Skill Ranks
- -
2 Rks Knowledge, 1 Rk Artisan, 2 Rks Speak Language, 1Rk R/W Language, 8 Rks Others . Remaining : - -
- - - -
- - - - - - -
- Type -  Skill Name  -  Power Name   -  Type  -  Rank  -  Rank  -  Attribute  -  Step  -  Target  -  Origin  - Actn - Stn - Kma - DP -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - If you have a PDF copy of the book, you can copy an entire Skill or Questor Devotion description (starting with the name, and including everything) and paste it into this tiny text box. It will be parsed and whatever fields can be set based upon the text will be. You will still need to manually set some of the fields, most importaintly "Modifiers". - You can also just type the Skill Name, and it will just be Autofilled with settings from the database. - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - + - - - - - - - - - + - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - -v - -v - h-v - h - h - h - h+1 - +1 - +1 - -N - -N - -N - - 2 - 5 - 6 - 10 - - - - - - - - - - - - - - - - - - - - - - -Nat - -Nat - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- -
- - Max Karma Allowed : - - - - Karma Required : - - - - - Max DP Allowed : - - - - - - DP Required : - - - - -
- - -
- - - - - - Visibility : - - - - Default - - - - - - - - - - - Result Mods : - - -
-
- - - -
- Modifiers Exceptions - - Move Based : - - - Vision Based : - - - - Defensive : - - - Resistance : - - -
- - -
- Special: - - -
- - -
- - - Link : - - - - - - - - - - -
- - -
- After roll parameters - - - - - - : - - - - -
-
-
- - - -
- -
- -
-
-
- - - -
-
- Languages Known -
- i -
-
- - -
-
- - Skill - Talent -
-
- - - - -    - - - - - - - -       - - Speak : -   / - - - - Read/Write : - / - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -   Speak : -               - - -         Read/Write :               - - - - Speak : -      - - -    Read/Write :    - -
-
-
- - - - - -
- -
-
- - - -
- -
Spells
-
Spellcasting Talents
-
- - i - - -
-
-
4b- Spells, Spell Talents, and Matrixes
- -
As a spellcaster, you have 2 Free Matrixes that do not count for your 8 Talent points. Go to your Grimoire (click Spell Tab, and then Grimoire subtab), choose - - Spells of Circle 1 and 2 -
- - -
- - - - - -
-  Talent Name  -  Power Name   -  Rank  -  Step  -  Target  - Stn - Kma - DP -
- - -
- - -
- -
- -
- - - - - - - - - - - - + - - - - - - - - + - - - - - - - - - - - + - - - - - - - + - - - - - - - - - - - - - - - - - - -v - -v - h-v - h - h - h - h+1 - h+1 - h+1 - -N - -N - -N - - 2 - 5 - 6 - 10 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - - -
-
-
- Active Spell Sequence -
- i -
-
- -
- -
- Type - - Spell Name - - Sequence - Range - Duration - Description -
- -
- - - Mat. - G/R - Grim. - Raw - - - - - - - - - - - - - - - + - - - - - - - - Starting - Weaving - Woven - Cast. Fail. - Cast - Finished - - - - - - - - - - - - - - - -
- Extra Threads : - - - - -
- - -
- - - - Difficulties - Weave/Reattune/Dispell/Sense: - - - - Difficulties - Weave/Reattune/Dispell/Disbelieve/Sense - - - -
-
-
-
- - - -
- - Matrix - Grimoire -
- - -
- - - -
-
-
- Spell Matrices -
- - i -
-
- - -
- - - - -
- Matrix - Origin - Rank - D.Rat. -
-
- Mat. - - Spell Name -
- -
- - -
- - - - - - - - - - - - - - - - - - (p) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Link : - - - - - -
- - -
- - -
- -
- - -
- - -
-
- - -
- -
-
-
- - - - -
- -
-
-
-
Grimoire -
- -
-
-
-
- All - In Matrix - Cir. 1 - Cir. 2 - Cir. 3 - Cir. 4 - Cir. 5 - Cir. 6 - Cir. 7 - Cir. 8 - Warden - Master -
- - - - - - Matrix - - Circle - Disc. - - Name - - - Target - Range - Duration - Duration - Duration - Description - - -
-
- - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- If you have a PDF copy of the book, you can copy an entire Spell description (starting with the name, - and including everything) and paste it into this tiny text box. It will be parsed and whatever fields - can be set based upon the text will be. You will still need to manually set some of the fields. -
- - - - - - + - - - - - - - - - + - - - - - - - - - - - h - h+1 - - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - Efct Armor - - - - - Extra Success - - - - - - - -
- - -
- -
- After roll parameters - - - - - - - - -
-
- - -
- -
-
-
-
-
-
-
- - -
- - - -
-
- -
- - -
-
- - - -
- Inventory -
-
- -
-
- Carried/Capacity: - / - -
-
- : - - : - - : - -
-
- - -
- - -
Notes
-
- Est. other weight: - - - -
-
-
- - -
- -
-
Equipment -
- - -
-
- - - -
-
Equipment and Inventory Parameters
-
- Container Management : - - -
-
- Blood Magic : - - -
-
- Mounts & Companions : - - -
-
- LifeStyle : - - -
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Name - - - Phys - - Myst - IP - -
- - - - - - - - - - - - - - - - - -
- Weight : - - - Notes : -
- -
-
- -
- - - - - - - - - - - - - - - - - - - -
- Weight : - - - - Shatter : - - - Notes : -
- -
-
- -
- - - Size Restrictions: - - -
- - -           - Weapon - Weapon - Dmg - Dmg - Step - Size - Stn - Kma - DP - - - -
-
- - - - - - - - - - - - - - - -     - - - - - - - + - - - - - - - + - - - - - - - - - + - - - - - - + - - - - - - - - - + - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - Weight : - - Max Karma : - - - Max DP : - - -
- -
- Ammo Qty : - Un Wgt : - Range : - -
- -
- Link : - - - - - - - - - - -
-
- -
-
-
-
- - - -
-
- Thread Items and Woven Threads -
- -
-
-
- -

Note that most of these will require adjusting entries either in stats, talents, or miscellaneous adjustments on the last tab.

-  Items  -  Rank  -  Tier  -  Effects  -
- - - - - - - - - - - - - - - - - - - -
- Ranks known (Item History) : - - - -
- - - - -
-
- - - # - Key/Test Knowledge - Done - Rank Effect -
-
- - -
- - - - 1- - - - - - - - - - -
- -
- - - - 2- - - - - - - - - - - -
- - - - 3- - - - - - - - - - - -
- - - - 4- - - - - - - - - - - -
- - - - 5- - - - - - - - - - - -
- - - - 6- - - - - - - - - - - -
- - - - 7- - - - - - - - - - - -
- - - - 8- - - - - - - - - - - -
- - - - 9- - - - - - - - - - - -
- - - - 10- - - - - - - - - - - -
- - - - 11- - - - - - - - - - - -
- - - - 12- - - - - - - - - - - -
- - - - 13- - - - - - - - - - - -
- - - - 14- - - - - - - - - - - -
- - - - 15- - - - - - - - - - -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- - -
-
- - - -
-
-
- Blood Magic : -
- -
-
-
- -  Items     -  Dmg        -  Effects  -
- - - - - - - - - - - - -
-
-
- - - -
-
Mounts and other Animals -
- -
-
-
- - Name - Animal - Speed - Carry - Feed - Stable - Weight -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - - -
- Equipment Weight: - - - -
Lifestyle
- Lifestyle - - - LS Adjust: - - - Prepaid Through: - - -
-
-
-
- - - - -
-
Miscellaneous
- -
6- Racial Abilities
-
Automatically Determined by your Race.
-
- - - - - -
- -
- -
- - -
7- Equip Your Character
-
Basic Equipment and silver as per the Player Guide p72 has been initialized in the Equipment tab. Don't forget to pick Artisan's kit per your artisan skill
-
8- Flesh Out your character
-
Describe how he looks, and his personally traits
- - -
- -
-
Movement
-
- - - - + - - - - - - - - - - - - - - + - - - -
-
- - - - -
-
- -
-
Flying Alt.
-
- -
-
-   -
-
- - - -
- - - - -
- - - - - - + - - - -
-
- - - - - - + - - - -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
- -
- - - - -
- -
-
- - - -
Notes
-
- -
- Age:  - - - Sex:  - - - - - Weight:  - - - Hair:  - - - Eyes:  - - - Skin:  - - - -
- Lgd Status:  - - - Renown:  - - - Reputation:  - - -
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Personality traits : -
-
- - - -
-
- - -
- Attitude : - -
- - -
- -
-
-
- -
-
-
- -
-
-
-
- - -
- Earthdawn® by FASA Character sheet and associated API.
- Earthdawn® is the sole property of FASA Corporation, and is protected by copyright, trademark, and other intellectual property laws. - You are granted a limited, revocable, non-sub-licensable right to access and use this character sheet and associated API solely for personal and non-commercial use. - This character sheet is compatible with the Earthdawn® game from FASA Games, Inc. and the Roll20 Earthdawn® Compendium (Forthcoming). - Any information copied into this character sheet maintains its original sources copyright, whether it was copied from the Compendium, or copied or typed in by the user, or by any other means.
- Any use of FASA Games, Inc.’s Intellectual Property other than as specifically authorized by FASA Games, Inc. is strictly prohibited and will terminate the rights granted herein.
- Earthdawn® is a registered trademark of FASA Corporation. Earthdawn® and all associated trademarks, copyrights, and logos are used under license from FASA Corporation. Copyright © 1993-2020 FASA Corporation
- Roll20 character sheet & API by Christopher D. Dickey and Jean-Baptiste Faure. Approved by FASA. -
-
- - - - -
-
-
-
-
-
9- Link your Token
-
- With the API, most of the functions of the sheet can be accessed directly from the Token on the map. Karma, Damage and Wounds appear as bars, status and options, and general modifiers appear as markers icons on the token, and your most common actions appear as Token Action buttons when the token is selected. - In order for those functions to work properly, you need to link the character sheet with a token on the map, by selecting this token, and pressing the button below -
- -
-
- 9- - 10- - Play the Game ! -
-
- If you created the character per the Rules, click here to exit creation and store the Free Ranks for Legend Point Tracking. - -
- Or Here if you just want to exit without saving the LP Offset (you will have to set it manually) - -
-
- - - - -
- -
-
- - - -
- Legend -
- - i -
-
- - - -
-
Legend Parameters
- - Display - Calculated Mode : - - - - Transaction Mode : - - -
-
- - : - - : - - : - - -
- - - -
-
Calculated Legend Point Tracking
-
- Legend Points - Career : - - - - - + Creation : - - - - + Spells : - - - - - Cost : - - = - - - - Current Calc : - - - - i - -
-
- The Calculated Mode needs to offset the calculation by the LP equivalent of the free Talents, Skills and Spells at creation. If the character has been imported from older version or if there has been an issue at creation, you may need to set manually the Offset. Click the following button to reset the Creation offset so that Current calculated value matches the Current value from Transaction modes. Note that for Spellcaster this will be dependant on the option for Spells Costs. Set the option first. -
-
- - Attributes - - cost LP - - - - - Spells - - cost LP - - -
-
- Extra Cost : - - - -
-
- 2nd Discipline was started when lowest circle was - - and - - Discipline Talents had to be purchased at Rank 1 - -
-
- 3rd Discipline was started when lowest circle was - - and - - Discipline Talents had to be purchased at Rank 1 - -
-
- 4th Discipline was started when lowest circle was - - and - - Discipline Talents had to be purchased at Rank 1 - -
- - -
-
-
- - - -
-
Transaction Legend Point Tracking
-
- Legend Points - Career : - - - Current : - - - i -
-
- - -
-
Journal Entries
-
- - i - Date Throalic: - - - -
- Transaction - - - - Amount : - LP: - - - SP: - - - - - - - - - - - - -
-
-
- - - - -
- -
-
- - - -
- Parameters
-
-
-
- Character - Maneuvers - Sheet - R.Notes - Help -
- - - - - -
-
Character Adjustments
- i -
- PC / NPC? - - -
- - -
-
- Attributes : - Dex - Str - Tou - Per - Wil - Cha - Init. - Recov. - Knockd. -
- -
- Value: - - - - - - -
- -
- Step: - - - - - - - - - -
- -
- Maximum Karma Allowed : - - - - - - - - -
- -
Maximum DP Allowed: - - - - - - - - -
- -
- Visibility : - - - - - - Default - - - - - - - - - - - - - - - - - - - Default - - - - - - - - - - - - - - - - - - - - - Default - - - - - - - - - - - - - - - - - - - - - Default - - - - - - - - - - - - - - - - - - - - - Default - - - - - - - - - - - - - - - - - - - - - Default - - - - - - - - - - - - - - -
-
-
- - -
-
- Defense&Armor: - PD - MD - SD - PA - MA -
-
- Natural - - - - - -
-
- Normal - - - - - -
-
-
- -
-
- Health Ratings : - Unc. - Death. - Wound Tr. - Recov./day - Durability -
-
- - - - - - -
-
-
- -
-
- Discipline Adjust : - PD - MD - SD - PA - MA - Init. - Recov. -
-
- - - - - - - - -
-
-
- Custom Karma Ablities -
- -
- -
- - -
-
- Misc : - IP - Karma Pool - Karma Mod Adjust - Karma Step - Karma Ritual - DP Step - Carry - Movement - - Fly Mov - Reknown - Reputation -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
-
- Parameters : - Bonus - Penalty - Strain -
-
- Defensive Stance - - - - -
-
- Agressive Attack - - - - - - -
-
- - -
- Masks: -
- -
- - -
- Document every permanent or semi-permanent adjustment here. You or your GM should be able to glance at these notes and know why every adjustment has been made. Example typical entry might be "MD +3: +1 Wiz 2nd, +2 Group thread". -
- -
-
- - - -
-
Special Maneuvers
- -
- For creatures, document here the special maneuvers that the creature have. This will control how control icons will be displayed, and how maneuver options are offered in combat -
- - - Creature Maneuvers -
- - Hardened Armor - - - Grab and Bite - - - Hamstring - - - Overrun - - - Pounce - - - Squeeze the Life - -
-
- - Fury - - - Resist Pain - - - Willful - - - Ambush - - - Dive/Charge - -
- - - Opponent Maneuvers -
-
- - Clip the Wing - - - Crack the Shell - - - Defang - - - Enrage - - - Provoke - - - Pry Loose - -
-
- - - Custom Maneuvers -
- -
-
- - - - - - - - - - - -
- -
- -
-
-
- - - Horror Powers -
- - Corrupt Karma - - - - - - Cursed Luck - - - - - - - - - -
-
- - -
-
Sheet and API parameters
-
- Sheet Options -
- - - - - - - -
- - - - - - - - - - - -
-
- - Special Functions -
- - - - - - - - - - - - - - - - - -
Copy and Paste creature description (starting with name) into this tiny text box. - -
-
- - -
Copy and Paste mask (starting with mask name) into this tiny text box. - -
-
-
- Test worker thread - Change this one. - - - See if this one changes. - - - - - -
-
- General Information -
- - Last User : - - - - Edition : - - - - Sheet Version : - -
-
- - -
-
Release Notes
-
- This section will sometimes give important instructions about actions that must be taken to keep the character sheet working correctly with the new version.
- -
-
- - - -
-
Help and Tips
-
-
- There is a Wiki for this character sheet. Press the red question mark in the upper right of the header and then open the wiki in a new tab. - The section below shows tutorial videos of some basic operation with the Character sheet. -
-
-
-
Show Tooltips
-
-
-
-
-
- Add Modifiers -
-
- -
-
-
-
Edit Fields
-
- -
-
-
-
- - -
General Icons
-
- i - - - : Base/Final Step - - - : Edit - - - : Details - - - : Parameters - - - : Links - - - : Karma - - - : Devotion - - - : Physical Defense - - - : Physical Armor - - - : Mystic Defense - - - : Mystic Armor - - - : Social Defense - - - : Initiative - - - : Target Number - - - : Action Test - - - : Effect Test - - - : Defenses - - - : Attack - - - : Attack Close Combat - - - : Damage - - - : Damage Close Combat - - - : Action - Simple - - - : Action - Standard - - - : Action - Free - - - : Action - Sustained - - - - : Spell Matrix - - - : Spell Thread - -
- - -
Combat Options, Status, and Modifiers
- i -
- - : Option Agressive Attack - - - : Option Defensive Stance - - - : Option Called Shot - - - : Option Split Movement - - - : Target in Partial Cover - - - : Option Reserved Action - - - : Character Knocked Down - - - : Range - Long - - - : No Shield - - - : Blindsided - - - Surprised - - - : Blindsiding(Target Blindsided) - - - : Movement Impaired - - - : Entangled - Grappled - - - : Darkness - - - : Harried - - - : Cover - - - : Option Tail Attack (T'Skrang) - - - : Poisoned - - - : Unconscious - - - : Dying - - - : Strain per turn - - - : Creature Ambushing - - - : Creature Diving/Charging - - - : Creature Maneuver - - - : Opponent Maneuver - -
- -
-
- -
-
-
-
- - - - - - - - - - - - {{#header}}{{/header}} - - {{#miscval}}{{/miscval}} - {{#refund}}{{/refund}} - {{#throalic}}{{/throalic}} - {{#lp}}{{/lp}} - {{#sp}}{{/sp}} - {{#time}}{{/time}} - {{#note}}{{/note}} - -
{{header}}
{{misclabel}}:{{miscval}}
Refund
Throalic Date:{{throalic}}
LP:{{lp}}
Silver:{{sp}}
Time:{{time}}
Note:{{note}}
- {{#button1}}    To record {{button1}}{{/button1}} -
- - - - - {{#header}}{{/header}} - - {{#Step}}{{/Step}} - {{#target_number}}{{/target_number}} - - {{#Text}}{{/Text}} - -
{{header}}
Step + bonus:{{Step}}
- Target - {{#target_name}}'{{target_name}}'{{/target_name}} - {{#target_defense}}{{target_defense}}{{/target_defense}} - TN# {{target_number}}
Result:{{Result}} - {{#target_number}} - {{#rollLess() Result target_number}}Failed{{/rollLess() Result target_number}} - {{#^rollLess() Result target_number}}Success{{/^rollLess() Result target_number}} - {{/target_number}} -
Text:{{Text}}
-
- - - - + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + +
+
+ + + + + +
+ +
+
+
+
+ +
+
+ / + + +
+
+
+ +
+ + +
+ + +
+ +
+
+ + + +
+
+ + + + +
+ +
+
+
+
+ +
+
+ / + +
+
+
+
+ +
+ + +
+ +
+
+ + + +
+
+
+ + + +
+ +
+
+
+
+ +
+
+ / + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+
Wounds
+
+
+
+ + +
+
+ Tr: +
+
+
+ + + + + +
+
Wnd Tres
+
+ + + + + + + + + + +
+
+ + + + +
+
+ + Damage +
+
+
+ +
+ +
+
+
+ +
+
+
+ +
+ +
+
+
+ + + + +
+
+ + Stun
+
+
+ +
+ + +
+
+
+ + + +
+
+ + +
+
+ + + API + NoAPI + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + +
+
+
+ + + +
+ + + +
+
+ + + +
+
+ + +
+
+ + + +
+
+ + + +
+
+ + +
+
+ + + + +
+
+ + + +
+
+ + +
+
+ + + +
+
+ + + +
+
+ + + + +
+ +
+ Aggr. : + + + Def. : + + + Called Shot : + + + Tail Atk : + + + Blindsiding : + + + KndDown : + + + Harried : + + + Blindsided : + + + Surprised : + + + Uncon. : + + + Dead : + + + + Diving/Charging : + + + + Ambushing : + + +
+
+ + + +
+ +
+ Warning - Sheet was in API mode, but API not responding. Sheet is in NoAPI Mode until API is restarted.
+ If you still use the API, restart it.
+ If you stopped using the API, click the following button. + +
+
+ + + + +
+ Overview + Combat + + + Talents + Powers + + Knacks + Skills + + Spell + Equipment + + Notes + Legend + Parameters +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+
+
+ +
+
+ Attributes +
+ +
+
+ +
+ 2- Generate Attributes. +
+
+ Attribute Points:
+ Karma Points :   
+ Spend Attributes points or set the Step +
+ +
+ + + +
+
+ +
Race: + +
+
+ Creation Pts:
+
+ = +
+
+
+
+
+ + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
LP Incr.:
+
+ +
+
+
+
+
+ + + +
+
+ +
Race: + +
+
+ Creation Pts:
+
+ = +
+
+
+
+
+ + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
LP Incr.:
+
+ +
+
+
+
+
+ + + +
+
+ +
Race: + +
+
+ Creation Pts:
+
+ = +
+
+
+
+
+ + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
LP Incr.:
+
+ +
+
+
+
+
+ + + +
+
+ +
Race: + +
+
+ Creation Pts:
+
+ = +
+
+
+
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
LP Incr.:
+
+ +
+
+
+
+
+ + + +
+
+ +
Race: + +
+
+ Creation Pts:
+
+ = +
+
+
+
+
+ + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
LP Incr.:
+
+ +
+
+
+
+
+ + +
+
+ +
Race: + +
+
+ Creation Pts:
+
+ = +
+
+
+
+
+ + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
LP Incr.:
+
+ +
+
+
+
+
+
+
+ + + +
+
+ 3- Characteristics. +
+
+ Automatically Calculated +
+
Defenses + +
+ +
+
+ + +
+ + + +
+
+
Phys. Def.
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + : + + + PD-B: + + + + + + + +
+
+
Myst. Def.
+
+
+ + + + + + + + + + + + + + + + +
+
+
+
+ + + : + + + MD-B: + + + + + + + + + + +
+
Soc. Def.
+
+
+ + + + + + + + + + + + + + + + + + +
+
+
+ + + : + + + SD-B: + + + + + + + +
+ + +
Armor
+
+ + + +
+
+
Phys. Arm.
+
+
+ + + + + + + + + + + + + + + + +
+
+
+
+ + + : + + + + + +
+
+
Myst. Arm.
+
+
+ + + + + + + + + + + + + + + + +
+
+
+
+ + : + + + +
+ + + + +
Others
+
+ + +
+
+
+ + +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+
+ + +
+
+
+ + + +
+
+ Modifiers +
+ +
+
+ + + + +
+
Actions
+
+ + + + + + + + + + + + + + + +
+
+ + + + + +
+
Effects
+
+ + + + + + + + + + + + + + + +
+
+ + + + + +
+
Defenses
+
+ + + + + + + + + + + + + + + +
+
+ + + + + + +
+ +
Attacks
+
Attacks-CC
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ Atk Bonus die: + +
+ + + + + +
+ +
Damage
+
Damage-CC
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ Dmg Bonus die: + +
+ + + + + +
+
Target #s
+
+ + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+ Steps +
+
+
 1 
D4-2
 16 
D12+D8+D6
+
 2 
D4-1
 17 
D12+2D8
+
 3 
D4
 18 
D12+D10+D8
+
 4 
D6
 19 
D20+2D6
+
 5 
D8
 20 
D20+D8+D6
+
 6 
D10
  21 
D20+2D8
+
 7 
D12
  22 
D20+D10+D8
+
 8 
2D6
  23 
D20+2D10
+
 9 
D8+D6
  24 
D20+D12+D10
+
 10 
2D8
  25 
D20+2D12
+
 11 
D10+D8
  26 
D20+D12+2D6
+
 12 
2D10
  27 
D20+D12+D8+D6
+
 13 
D12+D10
  28 
D20+D12+2D8
+
 14 
2D12
  29 
D20+D12+D10+D8
+
 15 
D12+2D6
  30 
2D20+2D6
+
+
+
+ + + + +
+ + +
+ + +
0- Choose between Building a Hero (Select PC) / or creating a Foe (Select NPC, or Mook)
+
+ PC? + + + +
To Import a Creature and/or a Mask from Book copy and Paste description (starting with name) into this tiny text box. Note that for Spirits, it is important to set the Discipline to Spirit and Circle to the SR first.
+ Creature : +
+ Mask:       +
+
+ + +
+
+ + + +
+ Overview +
+ + +
+
+
+ + + +
+ +
+
+ + + +
+ Combat +
+ +
+
+
+ + + + +
+
Header Parameters
+
+ Karma: Auto Mode : + + +
+
+ + Damage - Stun: + + + Wound Treshold : + +
+
+ + Combat Options and Situation Modifiers : + +
+
Left Panes Parameters
+
+
+ + Attributes - Effect and Action Toggle: + + +
+
+ + Defenses - Natural Value toggle + +
+
+ +
Overview Combat Section Parameters
+
+
+ + Overview - Misc Pools and Movement + +
+
+ + Combat - Misc Pools and Movement + +
+
+
+ + + + +
+
1- Choose a Race and Discipline
+
Racial Abilities will be automatically added
+
+ + +
+ +  Discipline / Other  +  Circle  + Durability +
+ + + + + + + + + + + + + + + + +
+ +
+ + +   +   + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + Base Discipline : + + +
+ +
+
+ + +
+ +  Discipline / Other  + Circle + +
+ +
+ + + + + +   + + + + + + + + + + + + + + + + +
+
+ + +
+ + Race + + + Karma + +
+ + +
+ + + Flight: + + + +
+ + Movement +
+ + + + + + + + +
+ + +
+ + Passion:  + +
+ +
+ +
+ + Passion:  + +
+ +
+
+ + +
+
Health Adjustments
+
+
For NPCs, you can here set some adjustment to the health values - Note that to manually set attributes, you can enter a temporary buff and use the function "Set Adjustments" that will transfer the temporary buff as permanent adjustment
+
+
+ Unconscious Rating: + + Death Rating: + + Wound Threshold: + + + Recovery Tests/day:  + + Recovery Step: + +
+
+
+
+
+ + + + + +
+ +
+
+
+ Creature & Opponent Maneuvers : +
+
+ + + Hardened Armor + + + + Grab and Bite + + + + Hamstring + + + + Overrun + + + + Pounce + + + + Squeeze the Life + + + + Fury + + + + Resist Pain + + + + Willful + + + + Ambush + + + + Dive/Charge + +
+
+ + + Clip the Wing + + + + Crack the Shell + + + + Defang + + + + Enrage + + + + Provoke + + + + Pry Loose + +
+ +
+
+ + + + + + + + + + + +
+ +
+ +
+
+
+ + +
+ +
+
Movement
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ +
+
Flying Alt.
+
+ +
+
+   +
+
+ + + +
+ + + + +
+ + + + + + + + + + +
+
+ + + + + + + + + + +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ + +
Weapons and Attacks
+ + +
+
+ +
+
+ Nb Actions: + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + +
+
+ Talents, Knacks and Skills + Powers +
+
+ + + + +
+ +
+
+ + + +
+ +
Talents
+
Powers
+ +
+ i + + +
+
+ +
4- Assign Talent Ranks
+ +
Add below the Talents of your discipline, and spend 8 Ranks. Remaining Points : + +
+
+ + +
+ + +
+
+ + + +
+ Knacks +
+ i + + +
+
+
+ + +
+ +
+
+ + + +
+ Skills +
+ i + + +
+
+ +
+ + + + +
+
Repeating Sections Parameters
+
+ Modifier Exceptions : + + +
+
+ After roll parameters : + + +
+
+ Links : + + +
+
+ Special : + + +
+ Use All Talents to Advance (PG p453) : + + +
+
+
+ + + +
+ +
+ + + + + + +
+ +
+
+  Talent Name  +  Power Name   +  Type  + +  Rank  +  Rank  +  Attribute  +  Step  +  Target  +  Origin  + Actn + Stn + Kma + DP +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + + + + + + + + + + + + +
+ If you have a PDF copy of the book, you can copy an entire Talent or Questor Devotion description (starting with the name, + and including everything) and paste it into this tiny text box. It will be parsed and whatever fields + can be set based upon the text will be. You will still need to manually set some of the fields, most importantly "Modifiers". + You can also just type the Talent Name, and it will just be Autofilled with settings from the database. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -v + -v + h-v + h + h + h + h+1 + h+1 + h+1 + -N + -N + -N + + 2 + 5 + 6 + 10 + + + + + + + + + + + + + + + + + + + + + + + + -Nat + -Nat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ Import : + +
+ +
+ + + + + + + +
+ +
+ + Max Karma Allowed + + + + Karma Required: + + + + + Max DP Allowed + + + + + + + DP Required: + + + + +
+ + +
+ + + + + + + + Visibility : + + + + Default + + + + + + + + + + + + + + Result Mods : + + +
+
+ + +
+ Modifiers Exceptions - + Move Based : + + + Vision Based : + + + + Defensive : + + + Resistance : + + +
+ + +
+ Special: + + +
+ + +
+ + Link : + + + + + + + +
+ +
+ After roll parameters - + + + + + + + : + + + + + +
+
+
+ + + +
+ +
+ +
+
+
+
+ + + + +
+
+ + + + + + +
+ +
+ Knack Summary Report - + Hide : + + + Use Current Ranks and Circle : + + + Use Substitution Ranks and Circle : + + + + +
+
+ +
+ +
+ + + + +
+  Knack Name  +  Power Name   +  Type  +  Rank  +  Rank  +  Attribute  +  Step  +  Target  +  Origin  + Actn + Stn + Kma + DP +
+ + +
+ +
+ +
+ + + + + + + + + + +
+ + If you have a PDF copy of the book, you can copy an entire Knack or Questor Devotion description (starting with the name, and including everything) and paste it into this tiny text box. It will be parsed and whatever fields can be set based upon the text will be. You will still need to manually set some of the fields, most importaintly "Modifiers". + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -v + -v + h-v + h + h + h + h+1 + +1 + +1 + -N + -N + -N + + 2 + 5 + 6 + 10 + + + + + + + + + + + + + + + + + + + + + + + + -Nat + -Nat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ +
+ + Max Karma Allowed : + + + + Karma Required : + + + + + Max DP Allowed : : + + + + + + DP Required : + + + +
+ + +
+ + + + + Requirements Rank: + + + +
+ +
+ + Link : + + + + + + + + +
+ + + + + Visibility : + + + + Default + + + + + + + + + + + + + + Result Mods : + + +
+
+ + +
+ Modifiers Exceptions - + Move Based : + + + Vision Based : + + + + Defensive : + + + Resistance : + + +
+ + +
+ Special: + + +
+ + +
+ After roll parameters - + + + + + : + + + +
+
+
+ + +
+ +
+ +
+
+
+
+ + + + +
+ +
5- Assign Skill Ranks
+ +
2 Rks Knowledge, 1 Rk Artisan, 2 Rks Speak Language, 1Rk R/W Language, 8 Rks Others . Remaining : + +
+ + + +
+ + + + + + +
+ Type +  Skill Name  +  Power Name   +  Type  +  Rank  +  Rank  +  Attribute  +  Step  +  Target  +  Origin  + Actn + Stn + Kma + DP +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + If you have a PDF copy of the book, you can copy an entire Skill or Questor Devotion description (starting with the name, and including everything) and paste it into this tiny text box. It will be parsed and whatever fields can be set based upon the text will be. You will still need to manually set some of the fields, most importaintly "Modifiers". + You can also just type the Skill Name, and it will just be Autofilled with settings from the database. + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -v + -v + h-v + h + h + h + h+1 + +1 + +1 + -N + -N + -N + + 2 + 5 + 6 + 10 + + + + + + + + + + + + + + + + + + + + + + -Nat + -Nat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+ + Max Karma Allowed : + + + + Karma Required : + + + + + Max DP Allowed : + + + + + + DP Required : + + + + +
+ + +
+ + + + + + Visibility : + + + + Default + + + + + + + + + + + Result Mods : + + +
+
+ + + +
+ Modifiers Exceptions - + Move Based : + + + Vision Based : + + + + Defensive : + + + Resistance : + + +
+ + +
+ Special: + + +
+ + +
+ + + Link : + + + + + + + + + + +
+ + +
+ After roll parameters - + + + + + : + + + + +
+
+
+ + + +
+ +
+ +
+
+
+ + + +
+
+ Languages Known +
+ i +
+
+ + +
+
+ + Skill + Talent +
+
+ + + + +    + + + + + + + +       + + Speak : +   / + + + + Read/Write : + / + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +   Speak : +               + + +         Read/Write :               + + + + Speak : +      + + +    Read/Write :    + +
+
+
+ + + + + +
+ +
+
+ + + +
+ +
Spells
+
Spellcasting Talents
+
+ + i + + +
+
+
4b- Spells, Spell Talents, and Matrixes
+ +
As a spellcaster, you have 2 Free Matrixes that do not count for your 8 Talent points. Go to your Grimoire (click Spell Tab, and then Grimoire subtab), choose + + Spells of Circle 1 and 2 +
+ + +
+ + + + + +
+  Talent Name  +  Power Name   +  Rank  +  Step  +  Target  + Stn + Kma + DP +
+ + +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -v + -v + h-v + h + h + h + h+1 + h+1 + h+1 + -N + -N + -N + + 2 + 5 + 6 + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ + + + +
+
+
+ Active Spell Sequence +
+ i +
+
+ +
+ +
+ Type + + Spell Name + + Sequence + Range + Duration + Description +
+ +
+ + + Mat. + G/R + Grim. + Raw + + + + + + + + + + + + + + + + + + + + + + + + Starting + Weaving + Woven + Cast. Fail. + Cast + Finished + + + + + + + + + + + + + + + +
+ Extra Threads : + + + + +
+ + +
+ + + + Difficulties - Weave/Reattune/Dispell/Sense: + + + + Difficulties - Weave/Reattune/Dispell/Disbelieve/Sense + + + +
+
+
+
+ + + +
+ + Matrix + Grimoire +
+ + +
+ + + +
+
+
+ Spell Matrices +
+ + i +
+
+ + +
+ + + + +
+ Matrix + Origin + Rank + D.Rat. +
+
+ Mat. + + Spell Name +
+ +
+ + +
+ + + + + + + + + + + + + + + + + + (p) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Link : + + + + + +
+ + +
+ + +
+ +
+ + +
+ + +
+
+ + +
+ +
+
+
+ + + + +
+ +
+
+
+
Grimoire +
+ +
+
+
+
+ All + In Matrix + Cir. 1 + Cir. 2 + Cir. 3 + Cir. 4 + Cir. 5 + Cir. 6 + Cir. 7 + Cir. 8 + Warden + Master +
+ + + + + + Matrix + + Circle + Disc. + + Name + + + Target + Range + Duration + Duration + Duration + Description + + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ If you have a PDF copy of the book, you can copy an entire Spell description (starting with the name, + and including everything) and paste it into this tiny text box. It will be parsed and whatever fields + can be set based upon the text will be. You will still need to manually set some of the fields. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + h + h+1 + + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + Efct Armor + + + + + Extra Success + + + + + + + +
+ + +
+ +
+ After roll parameters - + + + + + + + +
+
+ + +
+ +
+
+
+
+
+
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + + +
+ Inventory +
+
+ +
+
+ Carried/Capacity: + / + +
+
+ : + + : + + : + +
+
+ + +
+ + +
Notes
+
+ Est. other weight: + + + +
+
+
+ + +
+ +
+
Equipment +
+ + +
+
+ + + +
+
Equipment and Inventory Parameters
+
+ Container Management : + + +
+
+ Blood Magic : + + +
+
+ Mounts & Companions : + + +
+
+ LifeStyle : + + +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name + + + Phys + + Myst + IP + +
+ + + + + + + + + + + + + + + + + +
+ Weight : + + + Notes : +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ Weight : + + + + Shatter : + + + Notes : +
+ +
+
+ +
+ + + Size Restrictions: + + +
+ + +           + Weapon + Weapon + Dmg + Dmg + Step + Size + Stn + Kma + DP + + + +
+
+ + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + Weight : + + Max Karma : + + + Max DP : + + +
+ +
+ Ammo Qty : + Un Wgt : + Range : + +
+ +
+ Link : + + + + + + + + + + +
+
+ +
+
+
+
+ + + +
+
+ Thread Items and Woven Threads +
+ +
+
+
+ +

Note that most of these will require adjusting entries either in stats, talents, or miscellaneous adjustments on the last tab.

+  Items  +  Rank  +  Tier  +  Effects  +
+ + + + + + + + + + + + + + + + + + + +
+ Ranks known (Item History) : + + + +
+ + + + +
+
+ + + # + Key/Test Knowledge + Done + Rank Effect +
+
+ + +
+ + + + 1- + + + + + + + + + +
+ +
+ + + + 2- + + + + + + + + + + +
+ + + + 3- + + + + + + + + + + +
+ + + + 4- + + + + + + + + + + +
+ + + + 5- + + + + + + + + + + +
+ + + + 6- + + + + + + + + + + +
+ + + + 7- + + + + + + + + + + +
+ + + + 8- + + + + + + + + + + +
+ + + + 9- + + + + + + + + + + +
+ + + + 10- + + + + + + + + + + +
+ + + + 11- + + + + + + + + + + +
+ + + + 12- + + + + + + + + + + +
+ + + + 13- + + + + + + + + + + +
+ + + + 14- + + + + + + + + + + +
+ + + + 15- + + + + + + + + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + +
+
+ + + +
+
+
+ Blood Magic : +
+ +
+
+
+ +  Items     +  Dmg        +  Effects  +
+ + + + + + + + + + + + +
+
+
+ + + +
+
Mounts and other Animals +
+ +
+
+
+ + Name + Animal + Speed + Carry + Feed + Stable + Weight +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+ Equipment Weight: + + + +
Lifestyle
+ Lifestyle + + + LS Adjust: + + + Prepaid Through: + + +
+
+
+
+ + + + +
+
Miscellaneous
+ +
6- Racial Abilities
+
Automatically Determined by your Race.
+
+ + + + + +
+ +
+ +
+ + +
7- Equip Your Character
+
Basic Equipment and silver as per the Player Guide p72 has been initialized in the Equipment tab. Don't forget to pick Artisan's kit per your artisan skill
+
8- Flesh Out your character
+
Describe how he looks, and his personally traits
+ + +
+ +
+
Movement
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ +
+
Flying Alt.
+
+ +
+
+   +
+
+ + + +
+ + + + +
+ + + + + + + + + + +
+
+ + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + + + +
+ +
+
+ + + +
Notes
+
+ +
+ Age:  + + + Sex:  + + + + + Weight:  + + + Hair:  + + + Eyes:  + + + Skin:  + + + +
+ Lgd Status:  + + + Renown:  + + + Reputation:  + + +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Personality traits : +
+
+ + + +
+
+ + +
+ Attitude : + +
+ + +
+ +
+
+
+ +
+
+
+ +
+
+
+
+ + +
+ Earthdawn® by FASA Character sheet and associated API.
+ Earthdawn® is the sole property of FASA Corporation, and is protected by copyright, trademark, and other intellectual property laws. + You are granted a limited, revocable, non-sub-licensable right to access and use this character sheet and associated API solely for personal and non-commercial use. + This character sheet is compatible with the Earthdawn® game from FASA Games, Inc. and the Roll20 Earthdawn® Compendium (Forthcoming). + Any information copied into this character sheet maintains its original sources copyright, whether it was copied from the Compendium, or copied or typed in by the user, or by any other means.
+ Any use of FASA Games, Inc.’s Intellectual Property other than as specifically authorized by FASA Games, Inc. is strictly prohibited and will terminate the rights granted herein.
+ Earthdawn® is a registered trademark of FASA Corporation. Earthdawn® and all associated trademarks, copyrights, and logos are used under license from FASA Corporation. Copyright © 1993-2020 FASA Corporation
+ Roll20 character sheet & API by Christopher D. Dickey and Jean-Baptiste Faure. Approved by FASA. +
+
+ + + + +
+
+
+
+
+
9- Link your Token
+
+ With the API, most of the functions of the sheet can be accessed directly from the Token on the map. Karma, Damage and Wounds appear as bars, status and options, and general modifiers appear as markers icons on the token, and your most common actions appear as Token Action buttons when the token is selected. + In order for those functions to work properly, you need to link the character sheet with a token on the map, by selecting this token, and pressing the button below +
+ +
+
+ 9- + 10- + Play the Game ! +
+
+ If you created the character per the Rules, click here to exit creation and store the Free Ranks for Legend Point Tracking. + +
+ Or Here if you just want to exit without saving the LP Offset (you will have to set it manually) + +
+
+ + + + +
+ +
+
+ + + +
+ Legend +
+ + i +
+
+ + + +
+
Legend Parameters
+ + Display - Calculated Mode : + + + + Transaction Mode : + + +
+
+ + : + + : + + : + + +
+ + + +
+
Calculated Legend Point Tracking
+
+ Legend Points - Career : + + + + + + Creation : + + + + + Spells : + + + + - Cost : + + = + + + + Current Calc : + + + + i + +
+
+ The Calculated Mode needs to offset the calculation by the LP equivalent of the free Talents, Skills and Spells at creation. If the character has been imported from older version or if there has been an issue at creation, you may need to set manually the Offset. Click the following button to reset the Creation offset so that Current calculated value matches the Current value from Transaction modes. Note that for Spellcaster this will be dependant on the option for Spells Costs. Set the option first. +
+
+ + Attributes + + cost LP + + + + + Spells + + cost LP + + +
+
+ Extra Cost : + + + +
+
+ 2nd Discipline was started when lowest circle was + + and + + Discipline Talents had to be purchased at Rank 1 + +
+
+ 3rd Discipline was started when lowest circle was + + and + + Discipline Talents had to be purchased at Rank 1 + +
+
+ 4th Discipline was started when lowest circle was + + and + + Discipline Talents had to be purchased at Rank 1 + +
+ + +
+
+
+ + + +
+
Transaction Legend Point Tracking
+
+ Legend Points - Career : + + + Current : + + + i +
+
+ + +
+
Journal Entries
+
+ + i + Date Throalic: + + + +
+ Transaction + + + + Amount : + LP: + + + SP: + + + + + + + + + + + + +
+
+
+ + + + +
+ +
+
+ + + +
+ Parameters
+
+
+
+ Character + Maneuvers + Sheet + R.Notes + Help +
+ + + + + +
+
Character Adjustments
+ i +
+ PC / NPC? + + +
+ + +
+
+ Attributes : + Dex + Str + Tou + Per + Wil + Cha + Init. + Recov. + Knockd. +
+ +
+ Value: + + + + + + +
+ +
+ Step: + + + + + + + + + +
+ +
+ Maximum Karma Allowed : + + + + + + + + +
+ +
Maximum DP Allowed: + + + + + + + + +
+ +
+ Visibility : + + + + + + Default + + + + + + + + + + + + + + + + + + + Default + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + + + + + + + + +
+
+
+ + +
+
+ Defense&Armor: + PD + MD + SD + PA + MA +
+
+ Natural + + + + + +
+
+ Normal + + + + + +
+
+
+ +
+
+ Health Ratings : + Unc. + Death. + Wound Tr. + Recov./day + Durability +
+
+ + + + + + +
+
+
+ +
+
+ Discipline Adjust : + PD + MD + SD + PA + MA + Init. + Recov. +
+
+ + + + + + + + +
+
+
+ Custom Karma Ablities +
+ +
+ +
+ + +
+
+ Misc : + IP + Karma Pool + Karma Mod Adjust + Karma Step + Karma Ritual + DP Step + Carry + Movement + + Fly Mov + Reknown + Reputation +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+
+ Parameters : + Bonus + Penalty + Strain +
+
+ Defensive Stance + + + + +
+
+ Agressive Attack + + + + + + +
+
+ + +
+ Masks: +
+ +
+ + +
+ Document every permanent or semi-permanent adjustment here. You or your GM should be able to glance at these notes and know why every adjustment has been made. Example typical entry might be "MD +3: +1 Wiz 2nd, +2 Group thread". +
+ +
+
+ + + +
+
Special Maneuvers
+ +
+ For creatures, document here the special maneuvers that the creature have. This will control how control icons will be displayed, and how maneuver options are offered in combat +
+ + + Creature Maneuvers +
+ + Hardened Armor + + + Grab and Bite + + + Hamstring + + + Overrun + + + Pounce + + + Squeeze the Life + +
+
+ + Fury + + + Resist Pain + + + Willful + + + Ambush + + + Dive/Charge + +
+ + + Opponent Maneuvers +
+
+ + Clip the Wing + + + Crack the Shell + + + Defang + + + Enrage + + + Provoke + + + Pry Loose + +
+
+ + + Custom Maneuvers +
+ +
+
+ + + + + + + + + + + +
+ +
+ +
+
+
+ + + Horror Powers +
+ + Corrupt Karma + + + + + + Cursed Luck + + + + + + + + + +
+
+ + +
+
Sheet and API parameters
+
+ Sheet Options +
+ + + + + + + +
+ + + + + + + + + + + +
+
+ + Special Functions +
+ + + + + + + + + + + + + + + + + +
Copy and Paste creature description (starting with name) into this tiny text box. + +
+
+ + +
Copy and Paste mask (starting with mask name) into this tiny text box. + +
+
+
+ Test worker thread - Change this one. + + + See if this one changes. + + + + + +
+
+ General Information +
+ + Last User : + + + + Edition : + + + + Sheet Version : + +
+
+ + +
+
Release Notes
+
+ This section will sometimes give important instructions about actions that must be taken to keep the character sheet working correctly with the new version.
+ +
+
+ + + +
+
Help and Tips
+
+
+ There is a Wiki for this character sheet. Press the red question mark in the upper right of the header and then open the wiki in a new tab. + The section below shows tutorial videos of some basic operation with the Character sheet. +
+
+
+
Show Tooltips
+
+
+
+
+
+ Add Modifiers +
+
+ +
+
+
+
Edit Fields
+
+ +
+
+
+
+ + +
General Icons
+
+ i + + + : Base/Final Step + + + : Edit + + + : Details + + + : Parameters + + + : Links + + + : Karma + + + : Devotion + + + : Physical Defense + + + : Physical Armor + + + : Mystic Defense + + + : Mystic Armor + + + : Social Defense + + + : Initiative + + + : Target Number + + + : Action Test + + + : Effect Test + + + : Defenses + + + : Attack + + + : Attack Close Combat + + + : Damage + + + : Damage Close Combat + + + : Action - Simple + + + : Action - Standard + + + : Action - Free + + + : Action - Sustained + + + + : Spell Matrix + + + : Spell Thread + +
+ + +
Combat Options, Status, and Modifiers
+ i +
+ + : Option Agressive Attack + + + : Option Defensive Stance + + + : Option Called Shot + + + : Option Split Movement + + + : Target in Partial Cover + + + : Option Reserved Action + + + : Character Knocked Down + + + : Range - Long + + + : No Shield + + + : Blindsided + + + Surprised + + + : Blindsiding(Target Blindsided) + + + : Movement Impaired + + + : Entangled - Grappled + + + : Darkness + + + : Harried + + + : Cover + + + : Option Tail Attack (T'Skrang) + + + : Poisoned + + + : Unconscious + + + : Dying + + + : Strain per turn + + + : Creature Ambushing + + + : Creature Diving/Charging + + + : Creature Maneuver + + + : Opponent Maneuver + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + {{#header}}{{/header}} + + {{#miscval}}{{/miscval}} + {{#refund}}{{/refund}} + {{#throalic}}{{/throalic}} + {{#lp}}{{/lp}} + {{#sp}}{{/sp}} + {{#time}}{{/time}} + {{#note}}{{/note}} + +
{{header}}
{{misclabel}}:{{miscval}}
Refund
Throalic Date:{{throalic}}
LP:{{lp}}
Silver:{{sp}}
Time:{{time}}
Note:{{note}}
+ {{#button1}}    To record {{button1}}{{/button1}} +
+ + + + + {{#header}}{{/header}} + + {{#Step}}{{/Step}} + {{#target_number}}{{/target_number}} + + {{#Text}}{{/Text}} + +
{{header}}
Step + bonus:{{Step}}
+ Target + {{#target_name}}'{{target_name}}'{{/target_name}} + {{#target_defense}}{{target_defense}}{{/target_defense}} + TN# {{target_number}}
Result:{{Result}} + {{#target_number}} + {{#rollLess() Result target_number}}Failed{{/rollLess() Result target_number}} + {{#^rollLess() Result target_number}}Success{{/^rollLess() Result target_number}} + {{/target_number}} +
Text:{{Text}}
+
+ + + + diff --git a/Genefunk 2090/genefunk2090.pug b/Genefunk 2090/genefunk2090.pug index 66a5870ba4..c240c2e08a 100644 --- a/Genefunk 2090/genefunk2090.pug +++ b/Genefunk 2090/genefunk2090.pug @@ -1,862 +1,862 @@ -//- Variables -- const abilityScores = {str:'strength',dex:'dexterity',con:'constitution',int:'intelligence',wis:'wisdom',cha:'charisma'}; -- const skillList = {athletics:'strength',acrobatics:'dexterity',drive:'dexterity',sleight_of_hand:'dexterity',stealth:'dexterity',bureaucracy:'intelligence',computers:'intelligence',investigation:'intelligence',life_science:'intelligence',mechanics:'intelligence',physical_science:'intelligence',social_science:'intelligence',streetwise:'intelligence',insight:'wisdom',perception:'wisdom',survival:'wisdom',deception:'charisma',intimidation:'charisma',performance:'charisma',persuasion:'charisma'}; -- const skillNames = ['athletics','acrobatics','drive','sleight_of_hand','stealth','bureaucracy','computers','investigation','life_science','mechanics','physical_science','social_science','streetwise','insight','perception','survival','deception','intimidation','performance','persuasion']; -- const passives = ['perception','insight']; -- const senses = ['acute_olfaction','darkvision','macrovision','microvision','penetration','spectrum']; -- const weaponProficiencies = ['simple','martial_melee','martial_ranged']; -- const armorProficiencies = ['light','medium','heavy']; -- const hackLevels = [1,2,3,4,5]; -- const ordinal = ['','st','nd','rd','th','th']; -- const deathProgress = [0,1,2,3]; -- const logoSrc = 'https://s3.amazonaws.com/files.d20.io/images/103013126/6YV1tDVuUKhJieOeCmgZww/original.png'; -- const helixSrc = 'https://s3.amazonaws.com/files.d20.io/images/103759352/vmECQwpaseeQTN9tX7wJaw/max.png?1580877311'; -- const abilityOptions = ['none','strength','dexterity','constitution','intelligence','wisdom','charisma']; -- const hackTypes = ['injection','gadget','craft tech','craft explosive','bot','mind','software']; - -//- End Variables -//- Mixin declarations -mixin trueHexagon(locked,divClass) - div(class=`true-hexagon polygon${locked ? ' locked':''}${divClass ? ` ${divClass}`:''}`) - block - -//- End mixin -mixin hexagonLabelContainer(divClass,transKey,transValue,locked,buttonDetails) - div(class=`hexagon-label-container${divClass ? ` ${divClass}` : ''}`) - +trueHexagon(locked) - block - .hexagon-label - if !buttonDetails - span(data-i18n=transKey) - != transValue||transKey - else - button&attributes(buttonDetails) - != buttonDetails.content || '' - -//- End mixin -mixin plusControl(name,defaultValue,classAdd) - div(class=`plus-container ${classAdd}`) - input(type='hidden' class='mod-control' name=`attr_${name}_modded` value='') - input(type='number' class='plus-control hidden' name=`attr_${name}` value=defaultValue||0 min='0') - span.plus-display(name=`attr_${name}` class=classAdd||'' title=`@{${name}}`) - !=defaultValue||0 -//- End mixin -mixin repeating-input-label(section,val,addClass) - if /ability|save type/.test(val) - +input-label-container(val,val,'select',`repeating_${section}_$X_${val.replace(/\s+/g,'_')}`,abilityOptions,addClass) - else if /hack type/.test(val) - +input-label-container(val,val,'select',`repeating_${section}_$X_${val.replace(/\s+/g,'_')}`,hackTypes,addClass) - else if val==='description' - +input-label-container(val,val,'textarea',`repeating_${section}_$X_${val.replace(/\s+/g,'_')}`,'',addClass) - else if val==='level' - +input-label-container(val,val,'number',`repeating_${section}_$X_${val.replace(/\s+/g,'_')}`,'',addClass) - else if val==='id' - +input-label-container(val,val,'readonlytext',`repeating_${section}_$X_${val.replace(/\s+/g,'_')}`,'',addClass) - else - +input-label-container(val,val,'text',`repeating_${section}_$X_${val.replace(/\s+/g,'_')}`,'',addClass) -//- End Mixin -mixin expandable-section(nameAdd) - .expandable-section - input(class='expand-control' type='hidden' name=`attr_${nameAdd ? `${nameAdd}_` : ''}expand_item` value='1') - label.expand-button - input(type='checkbox' name=`attr_${nameAdd ? `${nameAdd}_` : ''}expand_item` value='1' checked='true') - span.expand-state.pictos - |4 - block - //- End .expandable-section -mixin enable-section(nameAdd,section,addClass,def) - input.enable-controller(type='hidden' name=`attr_${nameAdd ? `${nameAdd.replace(/\s+/g,'_')}_` : ''}enable_item` value='0') - div(class=`enable-section${addClass ? ` ${addClass}`:''}`) - +hexagon-check-label(`${nameAdd ? `${nameAdd.replace(/\s+/g,'_')}_` : ''}enable_item`,section,def) - .enabled-section - block - //- End label - //- End .enable-section -//- End mixin -mixin id(section) - input.id(type='text' name='attr_id' title=`@{repeating_${section}_$X_id}` readonly='readonly') -//- End mixin -mixin hexagon-check-label(val,section,def) - label.hexagon-check-label - .checkbox-container - input(type='checkbox' name=`attr_${(val==='proficiency' && section) ? `${section}_` : ''}${val.replace(/\s+/g,'_')}` value=`${def||'1'}` title=`@{${section ? `repeating_${section}_$X_`:''}${(val==='proficiency' && section) ? `${section}_` : ''}${val.replace(/\s+/g,'_')}}`) - span.hexagon - span(data-i18n=val.replace(/_enable_item/g,'').replace(/_/g,' ')) - !=val.replace(/_enable_item/g,'').replace(/_/g,' ') -//- End mixin -mixin input-label-container(i18n,i18nVal,inType,inName,inVal,addClass) - div(class=`input-label-container${addClass ? ` ${addClass}`:''}`) - if inType!=='checkbox' && i18n && i18nVal - span(class='input-label' data-i18n=i18n)=i18nVal - if inType==='textarea' - textarea(name=`attr_${inName.replace(/repeating_[^_]+_[^_]+_/,'')}` title=`@{${inName}}` value=inVal||'') - else if inType==='select' - select(name=`attr_${inName.replace(/repeating_[^_]+_[^_]+_/,'')}` title=`@{${inName}}`) - each val,index in inVal - if typeof val === 'string' - if /type/.test(i18n) - option(value=`${val}` data-i18n=val) - !=val - else if /none/.test(val) - option(value=`0` data-i18n=val selected='true') - !=val - else - option(value=`@{${val}_mod}` data-i18n=val) - !=val - else if typeof val === 'object' - option&attributes(val) - //- End each - //- end Select - else if inType==='checkbox' - div - span(class='input-label' data-i18n=i18n) - input(type='checkbox')&attributes(inVal) - else if /readonly/.test(inType) - input(type=`${inType.replace(/readonly/,'')}` name=`attr_${inName.replace(/repeating_[^_]+_[^_]+_/,'')}` title=`@{${inName}}` value=inVal||'' readonly='true') - else if inType === 'radio' - div - each val in inVal - label - span&attributes(val.span) - input(type='radio')&attributes(val.input) - else - input(type=inType name=`attr_${inName.replace(/repeating_[^_]+_[^_]+_/,'')}` title=`@{${inName}}` value=inVal||'') - //- End .input-label-container -//- End mixin -mixin borderedTextarea(divObj,headerObj,textObj) - .bordered-textarea&attributes(divObj||{}) - h4&attributes(headerObj||{}) - !=i18n - textarea.fixed&attributes(textObj||{}) -//- End mixin -mixin borderedContainer(divObj,sectionHeadObj,columnHeaderArray,columnHeaderObj) - .bordered-container&attributes(divObj) - if sectionHeadObj - h4&attributes(sectionHeadObj) - if sectionHeadObj['data-i18n'] - !=sectionHeadObj['data-i18n']||'' - else - !=sectionHeadObj['value'] - //- End if - if columnHeaderArray - each val in columnHeaderArray||[] - h5(class=val data-i18n=val)&attributes(columnHeaderObj) - !=val - //- End each - //- End if - block -//-End mixin -mixin pseudoControl(name) - .pseudo-control - button(type='action' class='repcontrol_add' name=`act_add_${name}`) -//- End Mixin -mixin templateConditionalDisplay(fieldBool,fieldDisplay,invert) - !=`{{${invert ? '^' : '#'}${fieldBool}}}` - if /\^{/.test(fieldDisplay) - span(data-i18n=fieldDisplay.replace(/[\^{}]/g,'')) - else - span - !=`${fieldDisplay}` - !=`{{/${fieldBool}}}` -//- End mixin -mixin rollTemplateHelperFunction(helperObj) - !=`{{${helperObj.positive ? '#' : (helperObj.func ? '#^' : '^')}${helperObj.func ? `${helperObj.func}() `:''}${helperObj.field}${helperObj.values ? ` ${helperObj.values.join(' ')}` : ''}}}` - block - !=`{{/${(helperObj.positive || !helperObj.func) ? '' : '^'}${helperObj.func ? `${helperObj.func}() `:''}${helperObj.field}${helperObj.values ? ` ${helperObj.values.join(' ')}` : ''}}}` -//- End Mixin -mixin templateHexagonLabelContainer(divClass,field,def,invert) - +trueHexagon(null,divClass) - block - +templateConditionalDisplay(field,`{{${field}}}`,invert) - if def - +templateConditionalDisplay(field,def,!invert) -//- End mixin -mixin templateBorderedContainer(divObj) - .bordered-container&attributes(divObj) - block -//- End mixin -mixin hack-header(level) - div(class=`hack-header pentagon-hexagon-label-container`) - +trueHexagon(locked) - input(type='number' title=`@{${level}_level_slots}` name=`attr_${level}_level_slots` value='') - span(class='current label' data-i18n='current') - .true-pentagon.polygon - input(type='number' title=`@{${level}_level_slots|max}` name=`attr_${level}_level_slots_max` value='') - span(class='max label' data-i18n='max') -//- End Mixin -mixin hack-column(levelArray) - div - each level in levelArray - .hack-master-container - +hack-header(level) - +borderedContainer({class:`${level}-level hack-container`}) - h4(data-i18n=`${level} level`) - != `${level} level` - +hack(true) - - +pseudoControl(`${level}_hack`) - //- End bordered-container - //- End hack-master-container - //- End each - //- End div -//- End Mixin -mixin hack(pc) - fieldset.repeating_hack - input(type='hidden' name='attr_attack_macro' value='') - input(type='hidden' name='attr_save_macro' value='{{dc=[[8 + @{save_ability} + @{proficiency} + 0@{dc_bonus}]]}}') - each num in [1,2] - input(type='hidden' name=`attr_damage_${num}_macro` value=`{{damage_${num}=[[0@{damage_${num}} + @{damage_ability_${num}}]]}} {{regular_critical_${num}=[[0@{damage_${num}}]]}} {{is_custom_crit_${num}=@{critical_damage_${num}}}} {{custom_critical_${num}=[[0@{critical_damage_${num}}]]}}`) - input(type='hidden' name='attr_level' value='' class='level-display') - +expandable-section() - .expanded-view - each val in ['name','level','launch time','duration','hack type','source'] - +repeating-input-label('hack',val,val.replace(/\s+/g,'-')) - .enable-holder - +enable-section('attack','hack','attack','1') - if pc - each val in ['attack ability','attack bonus'] - +repeating-input-label('hack',val,val.replace(/\s+/g,'-')) - else - each val in ['attack bonus'] - +repeating-input-label('hack',val,val.replace(/\s+/g,'-')) - //- End each - //- End enable-section - +enable-section('save','hack','save','@{save_macro}') - if pc - each val in ['save ability','save type','dc bonus'] - +repeating-input-label('hack',val) - else - each val in ['save type','dc bonus'] - +repeating-input-label('hack',val) - //- End each - //- End enable-section - each num in [1,2] - +enable-section(`damage ${num}`,'hack',`damage ${num}`,`{{damage_type_${num}=@{damage_type_${num}}}} @{damage_${num}_macro}`) - if pc - each val in [`damage ${num}`,`critical damage ${num}`, `damage ability ${num}`,`damage type ${num}`] - +repeating-input-label('hack',val,val.replace(/\s+/g,'-')) - //- End each - else - each val in [`damage ${num}`,`critical damage ${num}`,`damage type ${num}`] - +repeating-input-label('hack',val,val.replace(/\s+/g,'-')) - //- End each - //- End enable-section - //- End each - //- End .enable-holder - each val in ['range','properties','description'] - +repeating-input-label('hack',val,val) - +id('hack') - .collapsed-view - button(type='roll' name='roll_roll' value='@{template_start} {{rollName=@{name}}} @{attack_macro} @{save_enable_item} @{damage_1_enable_item} @{damage_2_enable_item} {{range=@{range}}} {{properties=@{properties}}} {{description=@{description}}}') - input(type='hidden' name='attr_hack_type' class='hack-type' value='injection') - each val in ['name','hack_type'] - span(name=`attr_${val}` class=val.replace(/_/g,'-') value='') - //- End each - //- End collapsed view - //- End expandable-section - //- End fieldset -//- End Mixin -mixin action(isPC) - +borderedContainer({class:'action-container'},{'data-i18n':'actions'},['name','mod','damage']) - //repeating actions - fieldset.repeating_action - input(type='hidden' name='attr_attack_macro' value='') - input(type='hidden' name='attr_save_macro' value='{{dc=[[8 + @{save_ability} + @{action_proficiency} + 0@{dc_bonus}]]}}') - each num in [1,2] - input(type='hidden' name=`attr_damage_${num}_macro` value=`{{damage_${num}=[[0@{damage_${num}} + @{damage_ability_${num}}]]}} {{regular_critical_${num}=[[0@{damage_${num}}]]}} {{is_custom_crit_${num}=@{critical_damage_${num}}}} {{custom_critical_${num}=[[0@{critical_damage_${num}}]]}}`) - +expandable-section() - .expanded-view - +repeating-input-label('action','name','name') - if isPC - +hexagon-check-label('proficiency','action','@{proficiency}') - //- End each - .enable-holder - +enable-section('attack','action','attack','1') - if isPC - each val in ['attack ability','attack bonus'] - +repeating-input-label('action',val,val) - //- End each - else - each val in ['attack bonus'] - +repeating-input-label('action',val,val) - //- End each - //- End enable-section - +enable-section('save','action','save','{{save_type=^{@{save_type}}}} @{save_macro}') - if isPC - each val in ['save ability','save type','dc bonus'] - +repeating-input-label('action',val) - //- End each - else - each val in ['save type','dc bonus'] - +repeating-input-label('action',val) - //- End each - //- End enable-section - each num in [1,2] - +enable-section(`damage ${num}`,'action',`damage ${num}`,`{{damage_type_${num}=@{damage_type_${num}}}} @{damage_${num}_macro}`) - if isPC - each val in [`damage ${num}`,`critical damage ${num}`, `damage ability ${num}`,`damage type ${num}`] - +repeating-input-label('action',val,val) - else - each val in [`damage ${num}`,`critical damage ${num}`,`damage type ${num}`] - +repeating-input-label('action',val,val) - //- End each - //- End enable-section - //- End each - //- End .enable-holder - each val in ['range','properties','description'] - +repeating-input-label('action',val,val) - +id('action') - //- End .expanded-view - .collapsed-view - button(type='roll' name='roll_roll' value='@{template_start} {{rollName=@{name}}} @{attack_macro} @{save_enable_item} @{damage_1_enable_item} @{damage_2_enable_item} {{range=@{range}}} {{properties=@{properties}}} {{description=@{description}}}') - each val in ['name','bonus','damage_1'] - span(name=`attr_${val}` value='') - //- End each - //- End .collapsed-view - //- End expandable-section() - //- End fieldset.repeating_action -//- End mixin -mixin trait(pc) - +borderedContainer({class:'trait-container'},{'data-i18n':'features & traits'},(pc ? ['name','source'] : [])) - fieldset.repeating_trait - input(type='hidden' name='attr_macro' value='{{source=@{source}}}') - +expandable-section() - .expanded-view - if pc - each val in ['name','source','mods','description'] - +repeating-input-label('trait',val,val) - else - each val in ['name','description'] - +repeating-input-label('trait',val,val) - +id('action') - //- End expanded-view - .collapsed-view - button(type='roll' name='roll_details' value='@{template_start} {{rollName=@{name}}} @{macro} {{description=@{description}}}') - if !pc - span(name=`attr_name` value='') - if pc - each val in ['name','source'] - span(name=`attr_${val}` value='') - else - span.description(name='attr_description' value='') - //- End collapsed-view - //- End Expandable Section - //- End fieldset -//- End mixin -mixin settingLabel(inputObj,i18n) - if !inputObj.type || inputObj.type!=='select' - label - span(data-i18n=`${i18n}`) - input&attributes(inputObj) - //- End label - else if inputObj.type && inputObj.type==='select' - span(data-i18n=`${i18n}`) - select&attributes(inputObj) - each val,index in inputObj.options - option&attributes(val) -//- End Mixin -mixin npc-ability-label(ability) - .npc-ability-label - button.h4(data-i18n=`${ability} abbreviation` type='roll' name=`roll_${ability}` value=`@{template_start} {{rollName=^{${ability.replace(/(\w{3}).*/,'$1')} check}}} @{${ability}_check_macro}`) - span(name=`attr_${ability}` class='score') - .paren-container - input.parens-control(type='hidden' name=`attr_${ability}` value='10') - span.parens - |( - input.plus-control.hidden(type='number' name=`attr_${ability}_mod` value='0' min='0') - span.mod.plus-display(name=`attr_${ability}_mod`) - span.parens - |) - button.h4(data-i18n='save' class='save-label' type='roll' name=`roll_${ability}_save` value=`@{template_start} {{rollName=^{${ability.replace(/(\w{3}).*/,'$1')} save}}} @{${ability}_save_macro}`) - input.plus-control.hidden(type='number' name=`attr_${ability}_mod` value='0' min='0') - span.save.plus-display(name=`attr_${ability}_save`) -//- End Mixin -mixin bordered-checkbox(divObj,inputObj,spanObj) - .bordered-checkbox&attributes(divObj) - input&attributes(inputObj) - span&attributes(spanObj) - !=spanObj.contents||'' -//- End Mixin Declarations -//test new line -// Default Values -each val,abbreviation in abilityScores - input(type='hidden' name=`attr_${val}_mod` value='0') - input(type='hidden' name=`attr_${val}_save` value='0') - input(type='hidden' name=`attr_${val}_check_macro` value=`{{d20=[[@{advantage_state} + @{${val}_mod} @{${val}_bonus}]]}}`) - input(type='hidden' name=`attr_${val}_save_macro` value=`{{d20=[[@{advantage_state} + @{${val}_mod} + @{${val}_save_proficiency} @{${val}_save_bonus}]]}}`) - input(type='hidden' name=`attr_${val}_bonus` value='') - input(type='hidden' name=`attr_${val}_save_bonus` value='') -each ability,skill in skillList - input(type='hidden' name=`attr_${skill}_bonus` value='') - input(type='hidden' name=`attr_${skill}_macro` value=`{{d20=[[@{advantage_state} + @{${skill}_proficiency} + @{${ability}_mod} @{${skill}_bonus}]]}}`) -each skill in passives - input(type='number' class='hidden' name=`attr_passive_${skill}` value='10') - input(type='hidden' name=`attr_passive_${skill}_modded` value='') -input(type='hidden' name='attr_version' value='') -input(type='hidden' name='attr_template_start' value='@{whisper_state} &{template:general} @{show_character_name}') -// End Default Values -.whole - input(type='hidden' class='master-display-controller' name='attr_master_display_controller' value='character_type:pc | sheet_view:core | advantage_state:1d20') - // Start PC sheet - .pc - .name-logo-container - img(class='genefunk-logo' src=logoSrc) - +input-label-container('character name','character name','text','character_name','') - //- End .name-logo-container - .character-basic-container - each val,index in {class_level:'class and level',genome:'genome',cadre:'cadre',experience_points:'experience points',backgrounds:'backgrounds',appearance:'appearance'} - +input-label-container(val,val,'text',index,'') - //-End .character-basic-container - .toggles - .toggle-row - each section in [/**/{div:{class:'core'},span:{'data-i18n':'core',class:'core'},input:{type:'radio',value:'core',class:'core',name:'attr_sheet_view',checked:'true'}},/**/{div:{class:'hacks'},span:{'data-i18n':'hacks',class:'hacks'},input:{type:'radio',value:'hacks',class:'hacks',name:'attr_sheet_view'}},/**/{div:{class:'settings'},span:{class:'settings pictos',contents:'y'},input:{type:'radio',value:'settings',class:'settings',name:'attr_sheet_view'}}] - +bordered-checkbox(section.div,section.input,section.span) - //- End .pseudo-button - //- End each - //- End toggle-row - .toggle-row - each section in [/**/{div:{class:'advantage'},span:{'data-i18n':'advantage',class:'advantage'},input:{type:'radio',value:'2d20kh1',class:'advantage',name:'attr_advantage_state'}},/**/{div:{class:'normal'},span:{'data-i18n':'normal',class:'normal'},input:{type:'radio',value:'1d20',class:'normal',name:'attr_advantage_state',checked:true}},/**/{div:{class:'disadvantage'},span:{'data-i18n':'disadvantage',class:'disadvantage'},input:{type:'radio',value:'2d20kl1',class:'disadvantage',name:'attr_advantage_state'}},/**/{div:{class:'query'},span:{'data-i18n':'query',class:'query'},input:{type:'radio',value:'?{Advantage|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}',class:'query',name:'attr_advantage_state'}}] - +bordered-checkbox(section.div,section.input,section.span) - //- End .pseudo-button - //- End each - //- End toggle-row - //- End toggles - .core - .ability-skill-container - .ability-scores-container - img(class='helix-image' src=helixSrc) - each ability,abbreviation in abilityScores - // ability - .attribute-container - input(type='hidden' name=`attr_${ability}_misc` value='') - button.h3(data-i18n=`${ability} abbreviation` type='roll' name=`roll_${ability}` value=`@{template_start} {{rollName=^{${ability.replace(/(\w{3}).*/,'$1')} check}}} @{${ability}_check_macro}`)=abbreviation - span(class='score-label' data-i18n='score') - |score - div(class=`${ability} calc-container score`) - input(type='number' name=`attr_base_${ability}` class='base-value' value='10' title=`@{base_${ability}} or @{${ability}}`) - input(type='number' name=`attr_${ability}` class='mod-value hidden' readonly='true' value='10') - input(type='hidden' class='mod-control' name=`attr_${ability}_modded`) - span(name=`attr_${ability}` class='mod-value') - |10 - span.mod-label(data-i18n='mod') - |mod - | - | - +plusControl(`${ability}_mod`,0,`${ability} mod`) - button(type='roll' name=`roll_${ability}_save` class='save-label' data-i18n='save' value=`@{template_start} {{rollName=^{${ability.replace(/(\w{3}).*/,'$1')} save}}} @{${ability}_save_macro}`) - |save - div(class='save-label background') - label(class=`checkbox-container ${ability} proficiency`) - input(type='checkbox' name=`attr_${ability}_save_proficiency` value='@{proficiency}' title=`@{${ability}_save_proficiency}`) - | - | - span.hexagon - span(class='check-label proficiency' data-i18n='proficiency abbreviation') - |prof - | - | - +plusControl(`${ability}_save`,0,`${ability} save`) - //- End .attribute-container - //- each ability,abbreviation in abilityScores - //- End .ability-scores-container - .right-column - +hexagonLabelContainer(null,'proficiency bonus','proficiency bonus',true) - +plusControl('proficiency',2) - .skills-container - each abilityScore,skill in skillList - if /athletics|acrobatics|bureaucracy|insight|deception/.test(skill) - h4(class=`${abilityScore}` data-i18n=`${abilityScore} skills`) - !=`${abilityScore} skills` - div(class=`${skill} expertise-check-label checkbox-container`) - input.prof-control(type='hidden' - name=`attr_${skill}_proficiency` value='0') - .prof-display.true-hexagon.polygon - input(class='untrained' type='radio' title=`@{${skill}_proficiency` name=`attr_${skill}_proficiency` value='0' checked=true) - input(class='proficiency' type='radio' title=`@{${skill}_proficiency` name=`attr_${skill}_proficiency` value='[[@{proficiency}]]') - .expertise-display.true-pentagon.polygon - input(class='expertise' type='radio' title=`@{${skill}_proficiency` name=`attr_${skill}_proficiency` value='[[2*@{proficiency}]]') - input(class='proficiency' type='radio' title=`@{${skill}_proficiency` name=`attr_${skill}_proficiency` value='[[@{proficiency}]]') - if skill === 'athletics' - span.check-label.proficiency(data-i18n='proficiency abbreviation') - |prof - span.check-label.expertise(data-i18n='expertise abbreviation') - |exp - //- end div ${skill} expertise-check-label checkbox-container - +plusControl(skill,0,skill) - button(class=`${skill} skill-label` type='roll' name=`roll_${skill}` data-i18n=`${skill.replace(/_/g,' ')}` value=`@{template_start} {{rollName=^{${skill.replace(/_/g,' ')}}}} @{${skill}_macro}`) - //- End each abilityScore,skill in skillList - //- End .skills-container - //- End .right-column - .ability-footer - each skill in passives - +hexagonLabelContainer(null,`passive ${skill}`,`passive ${skill}`,true) - input(type='hidden' class='mod-control' name=`attr_passive_${skill}_modded`) - span(name=`attr_passive_${skill}` value='10') - |10 - .senses-container - h4(data-i18n='senses') - |senses - each sense in senses - +hexagon-check-label(sense) - //- End .ability-footer - //- End .ability-skill-container - .mid-column - .armor-speed-container - //initiative, dr, speed, and ac containers - +hexagonLabelContainer('initiative',`initiative`,'initiative',true,{type:'roll',name:'roll_initiative',class:'hexagon-label','data-i18n':'initiative',value:'@{template_start} {{rollName=^{initiative}}} {{d20=[[@{advantage_state}+@{dexterity_mod}@{initiative_modded} &{tracker}]]}}',content:'initiative'}) - +plusControl('initiative',0) - +hexagonLabelContainer('dr','damage reduction','damage reduction') - input(type='number' name='attr_damage_reduction' value='') - +hexagonLabelContainer('speed','speed','speed') - input(type='text' name='attr_speed' value='') - +hexagonLabelContainer('ac',`armor class`,'armor class') - input(type='hidden' name='attr_ac_formula' value='10+@{dexterity_mod}') - input(type='number' name='attr_ac' value='10') - //- End .armor-speed-container - .hp-resistance-container - //current health, max health, temp hp, hit dice, death saves, and resistances - .current-death - .current-health - h4(data-i18n='current hit points') - |current hit points - input.h2(type='number' name='attr_hp') - //- End .current-health - .hd - input(type='hidden' name='attr_hit_dice_macro' value='') - button.h4(data-i18n='hit dice' type='roll' name='roll_hit_dice' value='@{template_start} {{rollName=^{hit dice}}} @{hit_dice_macro}') - each die in [8,10,12] - input(type='number' name=`attr_d${die}_hd`) - span(data-i18n=`d${die}`) - = `d${die}` - //- End .hd - .death - button.h4(data-i18n='death saves' type='roll' name='roll_death_saves' value='@{template_start} {{rollName=^{death save}}} {{d20=[[@{advantage_state}@{death_save_modded}]]}}') - |death saves - input(type='hidden' name='attr_death_save_modded' value='') - each val in ['success','failure'] - input(class=`${val}-control` type='hidden' name=`attr_death_${val}` value='0') - div(class=`${val} first checkbox-container`) - input(type='radio' name=`attr_death_${val}` value='0' title=`@{death_${val}}`) - input(type='radio' name=`attr_death_${val}` value='1' title=`@{death_${val}}`) - span.hexagon - div(class=`${val} second checkbox-container`) - input(type='radio' name=`attr_death_${val}` value='2' title=`@{death_${val}}`) - span.hexagon - div(class=`${val} third checkbox-container`) - input(type='radio' name=`attr_death_${val}` value='3' title=`@{death_${val}}`) - span.hexagon - if val==='success' - span.success(style='font-family:pictos;' data-i18n-title='Successes' title='Successes') - |k - else - img.death-label.failure(data-i18n-title='Failures' title='Failures' src='https://s3.amazonaws.com/files.d20.io/images/1/i-f4Y5RklihSCLNOzppdwA/max.png?1575392209') - //- End each val in ['success','failure'] - //- End .death - //- End .current-death - +hexagonLabelContainer('max','maximum hit points') - input(type='number' name='attr_hp_max' value='') - +hexagonLabelContainer('temp','temporary hit points') - input(type='number' name='attr_temp_hp' value='') - +borderedTextarea({class:'resistances'},{'data-i18n':'resistances'},{name:'attr_resistances'}) - //- End .resistances - //- End .hp-resistance-container - +action(true) - //- End borderedContainer - .mosaic-satoshi-container - +hexagonLabelContainer('mosaic','mosaic score') - input(type='number' name='attr_mosaic_score' value='') - //- End hexagonLabelContainer - +borderedTextarea({class:'satoshi'},{'data-i18n':'satoshi'},{name:'attr_satoshi'}) - //- End .mosaic-satoshi-container - +borderedContainer({class:'inventory-container'},{'data-i18n':'equipment'},['name','cost','weight']) - //Inventory details - fieldset.repeating_equipment - +expandable-section() - .expanded-view - each val in ['name','quantity','weight','cost','mods','description'] - +repeating-input-label('equipment',val,val) - +id('action') - //- End expanded-view - .collapsed-view - each val in ['name','weight','quantity'] - span(name=`attr_${val}` value='') - //- End each - //- End collapsed-view - //- End expandable-section - //- End fieldset - //- End borderedContainer - //- End .mid-column - .trait-column - +trait(true) - //- End borderedContainer - //- End .trait-column - //- End .core - .hacks - +hack-column(['1st','2nd']) - +hack-column(['3rd','4th']) - +hack-column(['5th']) - //- End .pc-hacks - .settings - .column - +borderedContainer({class:`character-options`}) - div - .gutter - +input-label-container('carrying capacity modifier','carrying capacity modifier','number','carrying_capacity_modifier','7') - +input-label-container('add initiative tiebreaker','add initiative tiebreaker','checkbox','initiative_tiebreaker',{value:'@{initiative}',checked:'checked'}) - .gutter - .column - +borderedContainer({class:`sheet-options`}) - div - .gutter - .grid-container - +bordered-checkbox({class:'pc-checkbox'},{name:'attr_character_type',value:'pc',checked:'true',type:'radio'},{'data-i18n':'pc'}) - +bordered-checkbox({class:'npc-checkbox'},{name:'attr_character_type',value:'npc',type:'radio'},{'data-i18n':'npc'}) - .gutter - .column - +borderedContainer({class:`sheet-options`}) - div - .gutter - +input-label-container('whisper rolls to gm','whisper rolls to gm','select','whisper_state',[{value:'','data-i18n':'never', selected:'true'},{value:'/w gm','data-i18n':'always'}]) - +input-label-container('show character name in templates','show character name in templates','checkbox','show_character_name',{name:'attr_show_character_name',value:'{{character_name=@{character_name}}} {{character_id=@{character_id}}}',checked:'checked'}) - .gutter - //- End .settings - //- End .pc - .npc - .toggles - .toggle-row - each section in [/**/{div:{class:'settings'},span:[{class:'settings pictos',contents:'y'},{class:'settings pictos',contents:'x'}],input:[{type:'radio',value:'settings',class:'settings',name:'attr_sheet_view'},{type:'radio',value:'in-play',class:'npc',name:'attr_sheet_view'}]},/**/{div:{class:'whisper'},span:[{class:'whisper pictos',contents:'q'},{class:'public pictos',contents:'w'}],input:[{type:'radio',value:'/w gm',class:'whisper',name:'attr_whisper_state'},{type:'radio',value:' ',class:'public',name:'attr_whisper_state'}]}] - .bordered-checkbox&attributes(section.div) - each num in [0,1] - input&attributes(section.input[num]) - span&attributes(section.span[num]) - if section.span[num].contents - !=section.span[num].contents - //- End each - //- End .pseudo-button - //- End each - each section in [/**/{div:{class:'advantage'},span:{'data-i18n':'advantage',class:'advantage'},input:{type:'radio',value:'2d20kh1',class:'advantage',name:'attr_advantage_state'}},/**/{div:{class:'normal'},span:{'data-i18n':'normal',class:'normal'},input:{type:'radio',value:'1d20',class:'normal',name:'attr_advantage_state',checked:true}},/**/{div:{class:'disadvantage'},span:{'data-i18n':'disadvantage',class:'disadvantage'},input:{type:'radio',value:'2d20kl1',class:'disadvantage',name:'attr_advantage_state'}},/**/{div:{class:'query'},span:{'data-i18n':'query',class:'query'},input:{type:'radio',value:'?{Advantage|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}',class:'query',name:'attr_advantage_state'}}] - +bordered-checkbox(section.div,section.input,section.span) - // End toggle-row - // End toggles - // npc importer - //- .npc-import - //- +bordered-container - - .npc-info - .statblock - .statblock-section - input.h2(type='text' name='attr_character_name') - .settings - .import - .statblock-section - .grid-container - each section in [{div:{class:'import'},span:{class:'import-process','data-i18n':'import'},input:{type:'checkbox',value:'import-process',class:'import-process',name:'attr_import'}},{div:{class:'import-cancel'},span:{class:'import-cancel','data-i18n':'cancel'},input:{type:'checkbox',value:'cancel',class:'import-cancel',name:'attr_import_cancel'}}] - +bordered-checkbox(section.div,section.input,section.span) - .statblock-section.import-area - h4(class='import-confirm',data-i18n='confirm import, this will overwrite all data on the character') - textarea(name='attr_importer' placeholder='Enter the NPCs statblock here to automatically import' data-i18n-placeholder='Enter the NPCs statblock here to automatically import') - - .statblock-section - .grid-container - each section in [{div:{class:'pc-checkbox'},span:{'data-i18n':'pc'},input:{name:'attr_character_type',value:'pc',type:'radio'}},{div:{class:'npc-checkbox'},span:{'data-i18n':'npc'},input:{name:'attr_character_type',value:'npc',type:'radio'}},{div:{class:'import'},span:{class:'import','data-i18n':'import'},input:{type:'checkbox',value:'import',class:'import',name:'attr_import'}}] - +bordered-checkbox(section.div,section.input,section.span) - //- End each - .statblock-section - .row - each val in [{value:'size',type:'text'},{value:'genome',type:'text'},{value:'modification',type:'text'}] - +input-label-container(val.value,val.value,val.type,val.value.replace(/ /g,'_'),'') - .statblock-section - .row - each val in [{value:'ac',type:'number'},{value:'damage reduction',type:'text'},{value:'hit points',name:'hp',type:'number'},{value:'hit dice',type:'text'},{value:'speed',type:'text'}] - +input-label-container(val.value,val.value,val.type,val.name||val.value.replace(/ /g,'_'),'') - .statblock-section - .ability-row - each val in [{value:'strength',type:'text'},{value:'dexterity',type:'text'},{value:'constitution',type:'text'},{value:'intelligence',type:'text'},{value:'wisdom',type:'text'},{value:'charisma',type:'text'}] - +input-label-container(val.value,val.value,val.type,val.value.replace(/ /g,'_'),'10','pseudo-number') - h4.save-header(data-i18n="saves") - each val in [{value:'strength',type:'number'},{value:'dexterity',type:'number'},{value:'constitution',type:'number'},{value:'intelligence',type:'number'},{value:'wisdom',type:'number'},{value:'charisma',type:'number'}] - +input-label-container(null,null,val.type,`${val.value.replace(/ /g,'_')}_save_base`) - .statblock-section - .row - each val in ['condition immunities','damage immunities','damage resistances','damage vulnerability'] - +input-label-container(`${val.replace(/_/g,' ')}`,`${val.replace(/_/g,' ')}`,'text',val.replace(/ /g,'_'),'') - .row - each skill in skillNames - +input-label-container(`${skill.replace(/_/g,' ')}`,`${skill.replace(/_/g,' ')}`,'number',skill,'') - //- End each - .row - each val in [{value:'skill notes',type:'text'},{value:'senses',type:'text'},{value:'passive perception',type:'number'}] - +input-label-container(val.value,val.value,val.type,val.value.replace(/ /g,'_'),'') - .row - +input-label-container('languages','languages','text','languages','') - .row - each val in [{value:'challenge',type:'text'},{value:'experience points',i18n:'xp',type:'number'}] - +input-label-container(val.value,(val.i18n || val.value),val.type,val.value.replace(/ /g,'_'),'') - .statblock-section - .row - +input-label-container('hacker level','hacker level','number','hacker_level') - +input-label-container('hacking ability','hacking ability','select','hacking_ability',abilityOptions.map((abi,index)=>{ - let obj = {value:abi,'data-i18n':abi} - if(index===0){ - obj.selected='true'; - } - return obj; - })) - each val in [{value:'hack dc',type:'number'},{value:'hack attack',type:'number'}] - +input-label-container(val.value,val.i18n || val.value,val.type,val.value.replace(/ /g,'_'),'') - .row - each level in hackLevels - +input-label-container(`${level}${ordinal[level]} level slots`,`${level}${ordinal[level]} level slots`,'number',`${level}${ordinal[level]}_level_slots`) - +hack() - //- End .statblock-section - .in-play - .statblock-section - .row - each val in [{value:'size',type:'text'},{value:'genome',type:'text'},{value:'modification',type:'text'}] - if val.value === 'modification' - input(type='hidden' name=`attr_${val.value}` class='parens-control') - span.italics.parens - |( - span.italics(name=`attr_${val.value}`) - if val.value ==='modification' - span.italics.parens - |) - .statblock-section - .row - h4(data-i18n='armor class') - span(name=`attr_ac`) - input(type='hidden' name=`attr_ac_notes` class='parens-control') - span.italics.parens - |( - span.italics.parens(name=`attr_ac_notes`) - span.italics.parens - |) - .row - h4(data-i18n='damage reduction') - span(name=`attr_damage_reduction`) - .row - h4(data-i18n='hit points') - span(name=`attr_hp`) - input(type='hidden' name=`attr_hit_dice` class='parens-control') - span.italics.parens - |( - span.italics.parens(name=`attr_hit_dice`) - span.italics.parens - |) - .row - h4(data-i18n='speed') - span(name=`attr_speed`) - .statblock-section - .row - each ability,abbreviation in abilityScores - +npc-ability-label(ability) - .statblock-section - .row - h4(data-i18n='skills') - each skill in skillNames - input.skill-control(type='hidden' name=`attr_${skill}`) - .skill-display(title=`@{${skill}}`) - button.h4(type='roll' name=`roll_${skill}` data-i18n=skill.replace(/_/g,' ') value=`@{template_start} {{rollName=^{${skill.replace(/_/g,' ')}}}} @{${skill}_macro}`) - span(name=`attr_${skill}`) - //- End each - .row - h4(data-i18n='skill notes') - span(name='attr_skill_notes' title='@{skill_notes}') - .row - each val in [{name:'senses',i18n:'senses'},{name:'passive_perception',i18n:'passive perception'}] - h4(data-i18n=val.i18n) - span(name=`attr_${val.name}` title=`@{${val.name}}`) - .row - h4(data-i18n='languages') - span(name='attr_languages' title='@{languages}') - .row - each val in [{value:'challenge',i18n:'challenge'},{value:'experience_points',i18n:'xp'}] - if val.value==='challenge' - h4(data-i18n=val.i18n) - if val.i18n==='xp' - span.parens - |( - span(name=`attr_${val.value}`) - if val.i18n==='xp' - span(data-i18n=val.i18n) - span.parens - |) - each level in hackLevels - input(type='hidden' name=`attr_${level}${ordinal[level]}_level_slots` value='' class=`hack-display-control level${level}`) - .statblock-section.hack-display - each level in hackLevels - div(class=`level${level}`) - h4(data-i18n=`${level}${ordinal[level]} level`) - span - |( - span(name=`attr_${level}${ordinal[level]}_level_slots`) - span - |): - fieldset.repeating_hack - input.button-control(type='hidden' name='attr_level' value='') - button.h4(type='roll' name='roll_roll' value='@{template_start} {{rollName=@{name}}} @{attack_enable_item} @{save_enable_item} @{damage_1_enable_item} @{damage_2_enable_item} {{range=@{range}}} {{properties=@{properties}}} {{description=@{description}}}') - span(name='attr_name') - .repeating-container - +trait() - +action() - //- End .settings - //- End .npc -//- End .whole -// Roll templates -rolltemplate.sheet-rolltemplate-general - div(class=`roll-display ${['d20','damage_1','damage_2','dc'].map((val,ind)=>{return `{{#${val}}}${ind + 1} {{/${val}}} `}).join('').replace(/\s+/g,'')}`) - +rollTemplateHelperFunction({positive:true,field:'character_name'}) - +templateBorderedContainer({class:'character_name'}) - h4 - +rollTemplateHelperFunction({positive:true,field:'character_id'}) - !='[{{character_name}}](http://journal.roll20.net/character/{{character_id}})' - +rollTemplateHelperFunction({positive:false,field:'character_id'}) - !='{{character_name}}' - //- End if - +rollTemplateHelperFunction({positive:true,field:'d20'}) - +templateHexagonLabelContainer('rollValue','rollName','^{roll}') - span - |{{d20}} - +rollTemplateHelperFunction({positive:true,field:'damage_1'}) - +templateHexagonLabelContainer('damage1','damage_type_1','^{damage 1}') - span - |{{damage_1}} - +rollTemplateHelperFunction({positive:true,field:'d20',func:'rollWasCrit'}) - +rollTemplateHelperFunction({positive:true,field:'is_custom_crit_1'}) - span - |{{custom_critical_1}} - +rollTemplateHelperFunction({positive:false,field:'is_custom_crit_1'}) - span - |{{regular_critical_1}} - +rollTemplateHelperFunction({positive:true,field:'damage_2'}) - +templateHexagonLabelContainer('damage2','damage_type_2','^{damage 2}') - span - |{{damage_2}} - +rollTemplateHelperFunction({positive:true,field:'d20',func:'rollWasCrit'}) - +rollTemplateHelperFunction({positive:true,field:'is_custom_crit_2'}) - span - |{{custom_critical_2}} - +rollTemplateHelperFunction({positive:false,field:'is_custom_crit_2'}) - span - |{{regular_critical_2}} - +rollTemplateHelperFunction({positive:true,field:'dc'}) - +templateHexagonLabelContainer('save','save_type','^{save}') - span - |{{dc}} - +rollTemplateHelperFunction({positive:true,field:'range'}) - +templateBorderedContainer({class:'range'}) - span - |{{range}} - +rollTemplateHelperFunction({positive:true,field:'properties'}) - +templateBorderedContainer({class:'properties'}) - span - |{{properties}} - +rollTemplateHelperFunction({positive:true,field:'description'}) - +templateBorderedContainer({class:'description'}) - span - |{{description}} -// End Roll Templates -// Start Scripts -script(type='text/worker') - include genefunk2090.js +//- Variables +- const abilityScores = {str:'strength',dex:'dexterity',con:'constitution',int:'intelligence',wis:'wisdom',cha:'charisma'}; +- const skillList = {athletics:'strength',acrobatics:'dexterity',drive:'dexterity',sleight_of_hand:'dexterity',stealth:'dexterity',bureaucracy:'intelligence',computers:'intelligence',investigation:'intelligence',life_science:'intelligence',mechanics:'intelligence',physical_science:'intelligence',social_science:'intelligence',streetwise:'intelligence',insight:'wisdom',perception:'wisdom',survival:'wisdom',deception:'charisma',intimidation:'charisma',performance:'charisma',persuasion:'charisma'}; +- const skillNames = ['athletics','acrobatics','drive','sleight_of_hand','stealth','bureaucracy','computers','investigation','life_science','mechanics','physical_science','social_science','streetwise','insight','perception','survival','deception','intimidation','performance','persuasion']; +- const passives = ['perception','insight']; +- const senses = ['acute_olfaction','darkvision','macrovision','microvision','penetration','spectrum']; +- const weaponProficiencies = ['simple','martial_melee','martial_ranged']; +- const armorProficiencies = ['light','medium','heavy']; +- const hackLevels = [1,2,3,4,5]; +- const ordinal = ['','st','nd','rd','th','th']; +- const deathProgress = [0,1,2,3]; +- const logoSrc = 'https://s3.amazonaws.com/files.d20.io/images/103013126/6YV1tDVuUKhJieOeCmgZww/original.png'; +- const helixSrc = 'https://s3.amazonaws.com/files.d20.io/images/103759352/vmECQwpaseeQTN9tX7wJaw/max.png?1580877311'; +- const abilityOptions = ['none','strength','dexterity','constitution','intelligence','wisdom','charisma']; +- const hackTypes = ['injection','gadget','craft tech','craft explosive','bot','mind','software']; + +//- End Variables +//- Mixin declarations +mixin trueHexagon(locked,divClass) + div(class=`true-hexagon polygon${locked ? ' locked':''}${divClass ? ` ${divClass}`:''}`) + block + +//- End mixin +mixin hexagonLabelContainer(divClass,transKey,transValue,locked,buttonDetails) + div(class=`hexagon-label-container${divClass ? ` ${divClass}` : ''}`) + +trueHexagon(locked) + block + .hexagon-label + if !buttonDetails + span(data-i18n=transKey) + != transValue||transKey + else + button&attributes(buttonDetails) + != buttonDetails.content || '' + +//- End mixin +mixin plusControl(name,defaultValue,classAdd) + div(class=`plus-container ${classAdd}`) + input(type='hidden' class='mod-control' name=`attr_${name}_modded` value='') + input(type='number' class='plus-control hidden' name=`attr_${name}` value=defaultValue||0 min='0') + span.plus-display(name=`attr_${name}` class=classAdd||'' title=`@{${name}}`) + !=defaultValue||0 +//- End mixin +mixin repeating-input-label(section,val,addClass) + if /ability|save type/.test(val) + +input-label-container(val,val,'select',`repeating_${section}_$X_${val.replace(/\s+/g,'_')}`,abilityOptions,addClass) + else if /hack type/.test(val) + +input-label-container(val,val,'select',`repeating_${section}_$X_${val.replace(/\s+/g,'_')}`,hackTypes,addClass) + else if val==='description' + +input-label-container(val,val,'textarea',`repeating_${section}_$X_${val.replace(/\s+/g,'_')}`,'',addClass) + else if val==='level' + +input-label-container(val,val,'number',`repeating_${section}_$X_${val.replace(/\s+/g,'_')}`,'',addClass) + else if val==='id' + +input-label-container(val,val,'readonlytext',`repeating_${section}_$X_${val.replace(/\s+/g,'_')}`,'',addClass) + else + +input-label-container(val,val,'text',`repeating_${section}_$X_${val.replace(/\s+/g,'_')}`,'',addClass) +//- End Mixin +mixin expandable-section(nameAdd) + .expandable-section + input(class='expand-control' type='hidden' name=`attr_${nameAdd ? `${nameAdd}_` : ''}expand_item` value='1') + label.expand-button + input(type='checkbox' name=`attr_${nameAdd ? `${nameAdd}_` : ''}expand_item` value='1' checked='true') + span.expand-state.pictos + |4 + block + //- End .expandable-section +mixin enable-section(nameAdd,section,addClass,def) + input.enable-controller(type='hidden' name=`attr_${nameAdd ? `${nameAdd.replace(/\s+/g,'_')}_` : ''}enable_item` value='0') + div(class=`enable-section${addClass ? ` ${addClass}`:''}`) + +hexagon-check-label(`${nameAdd ? `${nameAdd.replace(/\s+/g,'_')}_` : ''}enable_item`,section,def) + .enabled-section + block + //- End label + //- End .enable-section +//- End mixin +mixin id(section) + input.id(type='text' name='attr_id' title=`@{repeating_${section}_$X_id}` readonly='readonly') +//- End mixin +mixin hexagon-check-label(val,section,def) + label.hexagon-check-label + .checkbox-container + input(type='checkbox' name=`attr_${(val==='proficiency' && section) ? `${section}_` : ''}${val.replace(/\s+/g,'_')}` value=`${def||'1'}` title=`@{${section ? `repeating_${section}_$X_`:''}${(val==='proficiency' && section) ? `${section}_` : ''}${val.replace(/\s+/g,'_')}}`) + span.hexagon + span(data-i18n=val.replace(/_enable_item/g,'').replace(/_/g,' ')) + !=val.replace(/_enable_item/g,'').replace(/_/g,' ') +//- End mixin +mixin input-label-container(i18n,i18nVal,inType,inName,inVal,addClass) + div(class=`input-label-container${addClass ? ` ${addClass}`:''}`) + if inType!=='checkbox' && i18n && i18nVal + span(class='input-label' data-i18n=i18n)=i18nVal + if inType==='textarea' + textarea(name=`attr_${inName.replace(/repeating_[^_]+_[^_]+_/,'')}` title=`@{${inName}}` value=inVal||'') + else if inType==='select' + select(name=`attr_${inName.replace(/repeating_[^_]+_[^_]+_/,'')}` title=`@{${inName}}`) + each val,index in inVal + if typeof val === 'string' + if /type/.test(i18n) + option(value=`${val}` data-i18n=val) + !=val + else if /none/.test(val) + option(value=`0` data-i18n=val selected='true') + !=val + else + option(value=`@{${val}_mod}` data-i18n=val) + !=val + else if typeof val === 'object' + option&attributes(val) + //- End each + //- end Select + else if inType==='checkbox' + div + span(class='input-label' data-i18n=i18n) + input(type='checkbox')&attributes(inVal) + else if /readonly/.test(inType) + input(type=`${inType.replace(/readonly/,'')}` name=`attr_${inName.replace(/repeating_[^_]+_[^_]+_/,'')}` title=`@{${inName}}` value=inVal||'' readonly='true') + else if inType === 'radio' + div + each val in inVal + label + span&attributes(val.span) + input(type='radio')&attributes(val.input) + else + input(type=inType name=`attr_${inName.replace(/repeating_[^_]+_[^_]+_/,'')}` title=`@{${inName}}` value=inVal||'') + //- End .input-label-container +//- End mixin +mixin borderedTextarea(divObj,headerObj,textObj) + .bordered-textarea&attributes(divObj||{}) + h4&attributes(headerObj||{}) + !=i18n + textarea.fixed&attributes(textObj||{}) +//- End mixin +mixin borderedContainer(divObj,sectionHeadObj,columnHeaderArray,columnHeaderObj) + .bordered-container&attributes(divObj) + if sectionHeadObj + h4&attributes(sectionHeadObj) + if sectionHeadObj['data-i18n'] + !=sectionHeadObj['data-i18n']||'' + else + !=sectionHeadObj['value'] + //- End if + if columnHeaderArray + each val in columnHeaderArray||[] + h5(class=val data-i18n=val)&attributes(columnHeaderObj) + !=val + //- End each + //- End if + block +//-End mixin +mixin pseudoControl(name) + .pseudo-control + button(type='action' class='repcontrol_add' name=`act_add_${name}`) +//- End Mixin +mixin templateConditionalDisplay(fieldBool,fieldDisplay,invert) + !=`{{${invert ? '^' : '#'}${fieldBool}}}` + if /\^{/.test(fieldDisplay) + span(data-i18n=fieldDisplay.replace(/[\^{}]/g,'')) + else + span + !=`${fieldDisplay}` + !=`{{/${fieldBool}}}` +//- End mixin +mixin rollTemplateHelperFunction(helperObj) + !=`{{${helperObj.positive ? '#' : (helperObj.func ? '#^' : '^')}${helperObj.func ? `${helperObj.func}() `:''}${helperObj.field}${helperObj.values ? ` ${helperObj.values.join(' ')}` : ''}}}` + block + !=`{{/${(helperObj.positive || !helperObj.func) ? '' : '^'}${helperObj.func ? `${helperObj.func}() `:''}${helperObj.field}${helperObj.values ? ` ${helperObj.values.join(' ')}` : ''}}}` +//- End Mixin +mixin templateHexagonLabelContainer(divClass,field,def,invert) + +trueHexagon(null,divClass) + block + +templateConditionalDisplay(field,`{{${field}}}`,invert) + if def + +templateConditionalDisplay(field,def,!invert) +//- End mixin +mixin templateBorderedContainer(divObj) + .bordered-container&attributes(divObj) + block +//- End mixin +mixin hack-header(level) + div(class=`hack-header pentagon-hexagon-label-container`) + +trueHexagon(locked) + input(type='number' title=`@{${level}_level_slots}` name=`attr_${level}_level_slots` value='') + span(class='current label' data-i18n='current') + .true-pentagon.polygon + input(type='number' title=`@{${level}_level_slots|max}` name=`attr_${level}_level_slots_max` value='') + span(class='max label' data-i18n='max') +//- End Mixin +mixin hack-column(levelArray) + div + each level in levelArray + .hack-master-container + +hack-header(level) + +borderedContainer({class:`${level}-level hack-container`}) + h4(data-i18n=`${level} level`) + != `${level} level` + +hack(true) + + +pseudoControl(`${level}_hack`) + //- End bordered-container + //- End hack-master-container + //- End each + //- End div +//- End Mixin +mixin hack(pc) + fieldset.repeating_hack + input(type='hidden' name='attr_attack_macro' value='') + input(type='hidden' name='attr_save_macro' value='{{dc=[[8 + @{save_ability} + @{proficiency} + 0@{dc_bonus}]]}}') + each num in [1,2] + input(type='hidden' name=`attr_damage_${num}_macro` value=`{{damage_${num}=[[0@{damage_${num}} + @{damage_ability_${num}}]]}} {{regular_critical_${num}=[[0@{damage_${num}}]]}} {{is_custom_crit_${num}=@{critical_damage_${num}}}} {{custom_critical_${num}=[[0@{critical_damage_${num}}]]}}`) + input(type='hidden' name='attr_level' value='' class='level-display') + +expandable-section() + .expanded-view + each val in ['name','level','launch time','duration','hack type','source'] + +repeating-input-label('hack',val,val.replace(/\s+/g,'-')) + .enable-holder + +enable-section('attack','hack','attack','1') + if pc + each val in ['attack ability','attack bonus'] + +repeating-input-label('hack',val,val.replace(/\s+/g,'-')) + else + each val in ['attack bonus'] + +repeating-input-label('hack',val,val.replace(/\s+/g,'-')) + //- End each + //- End enable-section + +enable-section('save','hack','save','@{save_macro}') + if pc + each val in ['save ability','save type','dc bonus'] + +repeating-input-label('hack',val) + else + each val in ['save type','dc bonus'] + +repeating-input-label('hack',val) + //- End each + //- End enable-section + each num in [1,2] + +enable-section(`damage ${num}`,'hack',`damage ${num}`,`{{damage_type_${num}=@{damage_type_${num}}}} @{damage_${num}_macro}`) + if pc + each val in [`damage ${num}`,`critical damage ${num}`, `damage ability ${num}`,`damage type ${num}`] + +repeating-input-label('hack',val,val.replace(/\s+/g,'-')) + //- End each + else + each val in [`damage ${num}`,`critical damage ${num}`,`damage type ${num}`] + +repeating-input-label('hack',val,val.replace(/\s+/g,'-')) + //- End each + //- End enable-section + //- End each + //- End .enable-holder + each val in ['range','properties','description'] + +repeating-input-label('hack',val,val) + +id('hack') + .collapsed-view + button(type='roll' name='roll_roll' value='@{template_start} {{rollName=@{name}}} @{attack_macro} @{save_enable_item} @{damage_1_enable_item} @{damage_2_enable_item} {{range=@{range}}} {{properties=@{properties}}} {{description=@{description}}}') + input(type='hidden' name='attr_hack_type' class='hack-type' value='injection') + each val in ['name','hack_type'] + span(name=`attr_${val}` class=val.replace(/_/g,'-') value='') + //- End each + //- End collapsed view + //- End expandable-section + //- End fieldset +//- End Mixin +mixin action(isPC) + +borderedContainer({class:'action-container'},{'data-i18n':'actions'},['name','mod','damage']) + //repeating actions + fieldset.repeating_action + input(type='hidden' name='attr_attack_macro' value='') + input(type='hidden' name='attr_save_macro' value='{{dc=[[8 + @{save_ability} + @{action_proficiency} + 0@{dc_bonus}]]}}') + each num in [1,2] + input(type='hidden' name=`attr_damage_${num}_macro` value=`{{damage_${num}=[[0@{damage_${num}} + @{damage_ability_${num}}]]}} {{regular_critical_${num}=[[0@{damage_${num}}]]}} {{is_custom_crit_${num}=@{critical_damage_${num}}}} {{custom_critical_${num}=[[0@{critical_damage_${num}}]]}}`) + +expandable-section() + .expanded-view + +repeating-input-label('action','name','name') + if isPC + +hexagon-check-label('proficiency','action','@{proficiency}') + //- End each + .enable-holder + +enable-section('attack','action','attack','1') + if isPC + each val in ['attack ability','attack bonus'] + +repeating-input-label('action',val,val) + //- End each + else + each val in ['attack bonus'] + +repeating-input-label('action',val,val) + //- End each + //- End enable-section + +enable-section('save','action','save','{{save_type=^{@{save_type}}}} @{save_macro}') + if isPC + each val in ['save ability','save type','dc bonus'] + +repeating-input-label('action',val) + //- End each + else + each val in ['save type','dc bonus'] + +repeating-input-label('action',val) + //- End each + //- End enable-section + each num in [1,2] + +enable-section(`damage ${num}`,'action',`damage ${num}`,`{{damage_type_${num}=@{damage_type_${num}}}} @{damage_${num}_macro}`) + if isPC + each val in [`damage ${num}`,`critical damage ${num}`, `damage ability ${num}`,`damage type ${num}`] + +repeating-input-label('action',val,val) + else + each val in [`damage ${num}`,`critical damage ${num}`,`damage type ${num}`] + +repeating-input-label('action',val,val) + //- End each + //- End enable-section + //- End each + //- End .enable-holder + each val in ['range','properties','description'] + +repeating-input-label('action',val,val) + +id('action') + //- End .expanded-view + .collapsed-view + button(type='roll' name='roll_roll' value='@{template_start} {{rollName=@{name}}} @{attack_macro} @{save_enable_item} @{damage_1_enable_item} @{damage_2_enable_item} {{range=@{range}}} {{properties=@{properties}}} {{description=@{description}}}') + each val in ['name','bonus','damage_1'] + span(name=`attr_${val}` value='') + //- End each + //- End .collapsed-view + //- End expandable-section() + //- End fieldset.repeating_action +//- End mixin +mixin trait(pc) + +borderedContainer({class:'trait-container'},{'data-i18n':'features & traits'},(pc ? ['name','source'] : [])) + fieldset.repeating_trait + input(type='hidden' name='attr_macro' value='{{source=@{source}}}') + +expandable-section() + .expanded-view + if pc + each val in ['name','source','mods','description'] + +repeating-input-label('trait',val,val) + else + each val in ['name','description'] + +repeating-input-label('trait',val,val) + +id('action') + //- End expanded-view + .collapsed-view + button(type='roll' name='roll_details' value='@{template_start} {{rollName=@{name}}} @{macro} {{description=@{description}}}') + if !pc + span(name=`attr_name` value='') + if pc + each val in ['name','source'] + span(name=`attr_${val}` value='') + else + span.description(name='attr_description' value='') + //- End collapsed-view + //- End Expandable Section + //- End fieldset +//- End mixin +mixin settingLabel(inputObj,i18n) + if !inputObj.type || inputObj.type!=='select' + label + span(data-i18n=`${i18n}`) + input&attributes(inputObj) + //- End label + else if inputObj.type && inputObj.type==='select' + span(data-i18n=`${i18n}`) + select&attributes(inputObj) + each val,index in inputObj.options + option&attributes(val) +//- End Mixin +mixin npc-ability-label(ability) + .npc-ability-label + button.h4(data-i18n=`${ability} abbreviation` type='roll' name=`roll_${ability}` value=`@{template_start} {{rollName=^{${ability.replace(/(\w{3}).*/,'$1')} check}}} @{${ability}_check_macro}`) + span(name=`attr_${ability}` class='score') + .paren-container + input.parens-control(type='hidden' name=`attr_${ability}` value='10') + span.parens + |( + input.plus-control.hidden(type='number' name=`attr_${ability}_mod` value='0' min='0') + span.mod.plus-display(name=`attr_${ability}_mod`) + span.parens + |) + button.h4(data-i18n='save' class='save-label' type='roll' name=`roll_${ability}_save` value=`@{template_start} {{rollName=^{${ability.replace(/(\w{3}).*/,'$1')} save}}} @{${ability}_save_macro}`) + input.plus-control.hidden(type='number' name=`attr_${ability}_mod` value='0' min='0') + span.save.plus-display(name=`attr_${ability}_save`) +//- End Mixin +mixin bordered-checkbox(divObj,inputObj,spanObj) + .bordered-checkbox&attributes(divObj) + input&attributes(inputObj) + span&attributes(spanObj) + !=spanObj.contents||'' +//- End Mixin Declarations +//test new line +// Default Values +each val,abbreviation in abilityScores + input(type='hidden' name=`attr_${val}_mod` value='0') + input(type='hidden' name=`attr_${val}_save` value='0') + input(type='hidden' name=`attr_${val}_check_macro` value=`{{d20=[[@{advantage_state} + @{${val}_mod} @{${val}_bonus}]]}}`) + input(type='hidden' name=`attr_${val}_save_macro` value=`{{d20=[[@{advantage_state} + @{${val}_mod} + @{${val}_save_proficiency} @{${val}_save_bonus}]]}}`) + input(type='hidden' name=`attr_${val}_bonus` value='') + input(type='hidden' name=`attr_${val}_save_bonus` value='') +each ability,skill in skillList + input(type='hidden' name=`attr_${skill}_bonus` value='') + input(type='hidden' name=`attr_${skill}_macro` value=`{{d20=[[@{advantage_state} + @{${skill}_proficiency} + @{${ability}_mod} @{${skill}_bonus}]]}}`) +each skill in passives + input(type='number' class='hidden' name=`attr_passive_${skill}` value='10') + input(type='hidden' name=`attr_passive_${skill}_modded` value='') +input(type='hidden' name='attr_version' value='') +input(type='hidden' name='attr_template_start' value='@{whisper_state} &{template:general} @{show_character_name}') +// End Default Values +.whole + input(type='hidden' class='master-display-controller' name='attr_master_display_controller' value='character_type:pc | sheet_view:core | advantage_state:1d20') + // Start PC sheet + .pc + .name-logo-container + img(class='genefunk-logo' src=logoSrc) + +input-label-container('character name','character name','text','character_name','') + //- End .name-logo-container + .character-basic-container + each val,index in {class_level:'class and level',genome:'genome',cadre:'cadre',experience_points:'experience points',backgrounds:'backgrounds',appearance:'appearance'} + +input-label-container(val,val,'text',index,'') + //-End .character-basic-container + .toggles + .toggle-row + each section in [/**/{div:{class:'core'},span:{'data-i18n':'core',class:'core'},input:{type:'radio',value:'core',class:'core',name:'attr_sheet_view',checked:'true'}},/**/{div:{class:'hacks'},span:{'data-i18n':'hacks',class:'hacks'},input:{type:'radio',value:'hacks',class:'hacks',name:'attr_sheet_view'}},/**/{div:{class:'settings'},span:{class:'settings pictos',contents:'y'},input:{type:'radio',value:'settings',class:'settings',name:'attr_sheet_view'}}] + +bordered-checkbox(section.div,section.input,section.span) + //- End .pseudo-button + //- End each + //- End toggle-row + .toggle-row + each section in [/**/{div:{class:'advantage'},span:{'data-i18n':'advantage',class:'advantage'},input:{type:'radio',value:'2d20kh1',class:'advantage',name:'attr_advantage_state'}},/**/{div:{class:'normal'},span:{'data-i18n':'normal',class:'normal'},input:{type:'radio',value:'1d20',class:'normal',name:'attr_advantage_state',checked:true}},/**/{div:{class:'disadvantage'},span:{'data-i18n':'disadvantage',class:'disadvantage'},input:{type:'radio',value:'2d20kl1',class:'disadvantage',name:'attr_advantage_state'}},/**/{div:{class:'query'},span:{'data-i18n':'query',class:'query'},input:{type:'radio',value:'?{Advantage|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}',class:'query',name:'attr_advantage_state'}}] + +bordered-checkbox(section.div,section.input,section.span) + //- End .pseudo-button + //- End each + //- End toggle-row + //- End toggles + .core + .ability-skill-container + .ability-scores-container + img(class='helix-image' src=helixSrc) + each ability,abbreviation in abilityScores + // ability + .attribute-container + input(type='hidden' name=`attr_${ability}_misc` value='') + button.h3(data-i18n=`${ability} abbreviation` type='roll' name=`roll_${ability}` value=`@{template_start} {{rollName=^{${ability.replace(/(\w{3}).*/,'$1')} check}}} @{${ability}_check_macro}`)=abbreviation + span(class='score-label' data-i18n='score') + |score + div(class=`${ability} calc-container score`) + input(type='number' name=`attr_base_${ability}` class='base-value' value='10' title=`@{base_${ability}} or @{${ability}}`) + input(type='number' name=`attr_${ability}` class='mod-value hidden' readonly='true' value='10') + input(type='hidden' class='mod-control' name=`attr_${ability}_modded`) + span(name=`attr_${ability}` class='mod-value') + |10 + span.mod-label(data-i18n='mod') + |mod + | + | + +plusControl(`${ability}_mod`,0,`${ability} mod`) + button(type='roll' name=`roll_${ability}_save` class='save-label' data-i18n='save' value=`@{template_start} {{rollName=^{${ability.replace(/(\w{3}).*/,'$1')} save}}} @{${ability}_save_macro}`) + |save + div(class='save-label background') + label(class=`checkbox-container ${ability} proficiency`) + input(type='checkbox' name=`attr_${ability}_save_proficiency` value='@{proficiency}' title=`@{${ability}_save_proficiency}`) + | + | + span.hexagon + span(class='check-label proficiency' data-i18n='proficiency abbreviation') + |prof + | + | + +plusControl(`${ability}_save`,0,`${ability} save`) + //- End .attribute-container + //- each ability,abbreviation in abilityScores + //- End .ability-scores-container + .right-column + +hexagonLabelContainer(null,'proficiency bonus','proficiency bonus',true) + +plusControl('proficiency',2) + .skills-container + each abilityScore,skill in skillList + if /athletics|acrobatics|bureaucracy|insight|deception/.test(skill) + h4(class=`${abilityScore}` data-i18n=`${abilityScore} skills`) + !=`${abilityScore} skills` + div(class=`${skill} expertise-check-label checkbox-container`) + input.prof-control(type='hidden' + name=`attr_${skill}_proficiency` value='0') + .prof-display.true-hexagon.polygon + input(class='untrained' type='radio' title=`@{${skill}_proficiency` name=`attr_${skill}_proficiency` value='0' checked=true) + input(class='proficiency' type='radio' title=`@{${skill}_proficiency` name=`attr_${skill}_proficiency` value='[[@{proficiency}]]') + .expertise-display.true-pentagon.polygon + input(class='expertise' type='radio' title=`@{${skill}_proficiency` name=`attr_${skill}_proficiency` value='[[2*@{proficiency}]]') + input(class='proficiency' type='radio' title=`@{${skill}_proficiency` name=`attr_${skill}_proficiency` value='[[@{proficiency}]]') + if skill === 'athletics' + span.check-label.proficiency(data-i18n='proficiency abbreviation') + |prof + span.check-label.expertise(data-i18n='expertise abbreviation') + |exp + //- end div ${skill} expertise-check-label checkbox-container + +plusControl(skill,0,skill) + button(class=`${skill} skill-label` type='roll' name=`roll_${skill}` data-i18n=`${skill.replace(/_/g,' ')}` value=`@{template_start} {{rollName=^{${skill.replace(/_/g,' ')}}}} @{${skill}_macro}`) + //- End each abilityScore,skill in skillList + //- End .skills-container + //- End .right-column + .ability-footer + each skill in passives + +hexagonLabelContainer(null,`passive ${skill}`,`passive ${skill}`,true) + input(type='hidden' class='mod-control' name=`attr_passive_${skill}_modded`) + span(name=`attr_passive_${skill}` value='10') + |10 + .senses-container + h4(data-i18n='senses') + |senses + each sense in senses + +hexagon-check-label(sense) + //- End .ability-footer + //- End .ability-skill-container + .mid-column + .armor-speed-container + //initiative, dr, speed, and ac containers + +hexagonLabelContainer('initiative',`initiative`,'initiative',true,{type:'roll',name:'roll_initiative',class:'hexagon-label','data-i18n':'initiative',value:'@{template_start} {{rollName=^{initiative}}} {{d20=[[@{advantage_state}+@{dexterity_mod}@{initiative_modded} &{tracker}]]}}',content:'initiative'}) + +plusControl('initiative',0) + +hexagonLabelContainer('dr','damage reduction','damage reduction') + input(type='number' name='attr_damage_reduction' value='') + +hexagonLabelContainer('speed','speed','speed') + input(type='text' name='attr_speed' value='') + +hexagonLabelContainer('ac',`armor class`,'armor class') + input(type='hidden' name='attr_ac_formula' value='10+@{dexterity_mod}') + input(type='number' name='attr_ac' value='10') + //- End .armor-speed-container + .hp-resistance-container + //current health, max health, temp hp, hit dice, death saves, and resistances + .current-death + .current-health + h4(data-i18n='current hit points') + |current hit points + input.h2(type='number' name='attr_hp') + //- End .current-health + .hd + input(type='hidden' name='attr_hit_dice_macro' value='') + button.h4(data-i18n='hit dice' type='roll' name='roll_hit_dice' value='@{template_start} {{rollName=^{hit dice}}} @{hit_dice_macro}') + each die in [8,10,12] + input(type='number' name=`attr_d${die}_hd`) + span(data-i18n=`d${die}`) + = `d${die}` + //- End .hd + .death + button.h4(data-i18n='death saves' type='roll' name='roll_death_saves' value='@{template_start} {{rollName=^{death save}}} {{d20=[[@{advantage_state}@{death_save_modded}]]}}') + |death saves + input(type='hidden' name='attr_death_save_modded' value='') + each val in ['success','failure'] + input(class=`${val}-control` type='hidden' name=`attr_death_${val}` value='0') + div(class=`${val} first checkbox-container`) + input(type='radio' name=`attr_death_${val}` value='0' title=`@{death_${val}}`) + input(type='radio' name=`attr_death_${val}` value='1' title=`@{death_${val}}`) + span.hexagon + div(class=`${val} second checkbox-container`) + input(type='radio' name=`attr_death_${val}` value='2' title=`@{death_${val}}`) + span.hexagon + div(class=`${val} third checkbox-container`) + input(type='radio' name=`attr_death_${val}` value='3' title=`@{death_${val}}`) + span.hexagon + if val==='success' + span.success(style='font-family:pictos;' data-i18n-title='Successes' title='Successes') + |k + else + img.death-label.failure(data-i18n-title='Failures' title='Failures' src='https://s3.amazonaws.com/files.d20.io/images/1/i-f4Y5RklihSCLNOzppdwA/max.png?1575392209') + //- End each val in ['success','failure'] + //- End .death + //- End .current-death + +hexagonLabelContainer('max','maximum hit points') + input(type='number' name='attr_hp_max' value='') + +hexagonLabelContainer('temp','temporary hit points') + input(type='number' name='attr_temp_hp' value='') + +borderedTextarea({class:'resistances'},{'data-i18n':'resistances'},{name:'attr_resistances'}) + //- End .resistances + //- End .hp-resistance-container + +action(true) + //- End borderedContainer + .mosaic-satoshi-container + +hexagonLabelContainer('mosaic','mosaic score') + input(type='number' name='attr_mosaic_score' value='') + //- End hexagonLabelContainer + +borderedTextarea({class:'satoshi'},{'data-i18n':'satoshi'},{name:'attr_satoshi'}) + //- End .mosaic-satoshi-container + +borderedContainer({class:'inventory-container'},{'data-i18n':'equipment'},['name','cost','weight']) + //Inventory details + fieldset.repeating_equipment + +expandable-section() + .expanded-view + each val in ['name','quantity','weight','cost','mods','description'] + +repeating-input-label('equipment',val,val) + +id('action') + //- End expanded-view + .collapsed-view + each val in ['name','weight','quantity'] + span(name=`attr_${val}` value='') + //- End each + //- End collapsed-view + //- End expandable-section + //- End fieldset + //- End borderedContainer + //- End .mid-column + .trait-column + +trait(true) + //- End borderedContainer + //- End .trait-column + //- End .core + .hacks + +hack-column(['1st','2nd']) + +hack-column(['3rd','4th']) + +hack-column(['5th']) + //- End .pc-hacks + .settings + .column + +borderedContainer({class:`character-options`}) + div + .gutter + +input-label-container('carrying capacity modifier','carrying capacity modifier','number','carrying_capacity_modifier','7') + +input-label-container('add initiative tiebreaker','add initiative tiebreaker','checkbox','initiative_tiebreaker',{value:'@{initiative}',checked:'checked'}) + .gutter + .column + +borderedContainer({class:`sheet-options`}) + div + .gutter + .grid-container + +bordered-checkbox({class:'pc-checkbox'},{name:'attr_character_type',value:'pc',checked:'true',type:'radio'},{'data-i18n':'pc'}) + +bordered-checkbox({class:'npc-checkbox'},{name:'attr_character_type',value:'npc',type:'radio'},{'data-i18n':'npc'}) + .gutter + .column + +borderedContainer({class:`sheet-options`}) + div + .gutter + +input-label-container('whisper rolls to gm','whisper rolls to gm','select','whisper_state',[{value:'','data-i18n':'never', selected:'true'},{value:'/w gm','data-i18n':'always'}]) + +input-label-container('show character name in templates','show character name in templates','checkbox','show_character_name',{name:'attr_show_character_name',value:'{{character_name=@{character_name}}} {{character_id=@{character_id}}}',checked:'checked'}) + .gutter + //- End .settings + //- End .pc + .npc + .toggles + .toggle-row + each section in [/**/{div:{class:'settings'},span:[{class:'settings pictos',contents:'y'},{class:'settings pictos',contents:'x'}],input:[{type:'radio',value:'settings',class:'settings',name:'attr_sheet_view'},{type:'radio',value:'in-play',class:'npc',name:'attr_sheet_view'}]},/**/{div:{class:'whisper'},span:[{class:'whisper pictos',contents:'q'},{class:'public pictos',contents:'w'}],input:[{type:'radio',value:'/w gm',class:'whisper',name:'attr_whisper_state'},{type:'radio',value:' ',class:'public',name:'attr_whisper_state'}]}] + .bordered-checkbox&attributes(section.div) + each num in [0,1] + input&attributes(section.input[num]) + span&attributes(section.span[num]) + if section.span[num].contents + !=section.span[num].contents + //- End each + //- End .pseudo-button + //- End each + each section in [/**/{div:{class:'advantage'},span:{'data-i18n':'advantage',class:'advantage'},input:{type:'radio',value:'2d20kh1',class:'advantage',name:'attr_advantage_state'}},/**/{div:{class:'normal'},span:{'data-i18n':'normal',class:'normal'},input:{type:'radio',value:'1d20',class:'normal',name:'attr_advantage_state',checked:true}},/**/{div:{class:'disadvantage'},span:{'data-i18n':'disadvantage',class:'disadvantage'},input:{type:'radio',value:'2d20kl1',class:'disadvantage',name:'attr_advantage_state'}},/**/{div:{class:'query'},span:{'data-i18n':'query',class:'query'},input:{type:'radio',value:'?{Advantage|Normal,1d20|Advantage,2d20kh1|Disadvantage,2d20kl1}',class:'query',name:'attr_advantage_state'}}] + +bordered-checkbox(section.div,section.input,section.span) + // End toggle-row + // End toggles + // npc importer + //- .npc-import + //- +bordered-container + + .npc-info + .statblock + .statblock-section + input.h2(type='text' name='attr_character_name') + .settings + .import + .statblock-section + .grid-container + each section in [{div:{class:'import'},span:{class:'import-process','data-i18n':'import'},input:{type:'checkbox',value:'import-process',class:'import-process',name:'attr_import'}},{div:{class:'import-cancel'},span:{class:'import-cancel','data-i18n':'cancel'},input:{type:'checkbox',value:'cancel',class:'import-cancel',name:'attr_import_cancel'}}] + +bordered-checkbox(section.div,section.input,section.span) + .statblock-section.import-area + h4(class='import-confirm',data-i18n='confirm import, this will overwrite all data on the character') + textarea(name='attr_importer' placeholder='Enter the NPCs statblock here to automatically import' data-i18n-placeholder='Enter the NPCs statblock here to automatically import') + + .statblock-section + .grid-container + each section in [{div:{class:'pc-checkbox'},span:{'data-i18n':'pc'},input:{name:'attr_character_type',value:'pc',type:'radio'}},{div:{class:'npc-checkbox'},span:{'data-i18n':'npc'},input:{name:'attr_character_type',value:'npc',type:'radio'}},{div:{class:'import'},span:{class:'import','data-i18n':'import'},input:{type:'checkbox',value:'import',class:'import',name:'attr_import'}}] + +bordered-checkbox(section.div,section.input,section.span) + //- End each + .statblock-section + .row + each val in [{value:'size',type:'text'},{value:'genome',type:'text'},{value:'modification',type:'text'}] + +input-label-container(val.value,val.value,val.type,val.value.replace(/ /g,'_'),'') + .statblock-section + .row + each val in [{value:'ac',type:'number'},{value:'damage reduction',type:'text'},{value:'hit points',name:'hp',type:'number'},{value:'hit dice',type:'text'},{value:'speed',type:'text'}] + +input-label-container(val.value,val.value,val.type,val.name||val.value.replace(/ /g,'_'),'') + .statblock-section + .ability-row + each val in [{value:'strength',type:'text'},{value:'dexterity',type:'text'},{value:'constitution',type:'text'},{value:'intelligence',type:'text'},{value:'wisdom',type:'text'},{value:'charisma',type:'text'}] + +input-label-container(val.value,val.value,val.type,val.value.replace(/ /g,'_'),'10','pseudo-number') + h4.save-header(data-i18n="saves") + each val in [{value:'strength',type:'number'},{value:'dexterity',type:'number'},{value:'constitution',type:'number'},{value:'intelligence',type:'number'},{value:'wisdom',type:'number'},{value:'charisma',type:'number'}] + +input-label-container(null,null,val.type,`${val.value.replace(/ /g,'_')}_save_base`) + .statblock-section + .row + each val in ['condition immunities','damage immunities','damage resistances','damage vulnerability'] + +input-label-container(`${val.replace(/_/g,' ')}`,`${val.replace(/_/g,' ')}`,'text',val.replace(/ /g,'_'),'') + .row + each skill in skillNames + +input-label-container(`${skill.replace(/_/g,' ')}`,`${skill.replace(/_/g,' ')}`,'number',skill,'') + //- End each + .row + each val in [{value:'skill notes',type:'text'},{value:'senses',type:'text'},{value:'passive perception',type:'number'}] + +input-label-container(val.value,val.value,val.type,val.value.replace(/ /g,'_'),'') + .row + +input-label-container('languages','languages','text','languages','') + .row + each val in [{value:'challenge',type:'text'},{value:'experience points',i18n:'xp',type:'number'}] + +input-label-container(val.value,(val.i18n || val.value),val.type,val.value.replace(/ /g,'_'),'') + .statblock-section + .row + +input-label-container('hacker level','hacker level','number','hacker_level') + +input-label-container('hacking ability','hacking ability','select','hacking_ability',abilityOptions.map((abi,index)=>{ + let obj = {value:abi,'data-i18n':abi} + if(index===0){ + obj.selected='true'; + } + return obj; + })) + each val in [{value:'hack dc',type:'number'},{value:'hack attack',type:'number'}] + +input-label-container(val.value,val.i18n || val.value,val.type,val.value.replace(/ /g,'_'),'') + .row + each level in hackLevels + +input-label-container(`${level}${ordinal[level]} level slots`,`${level}${ordinal[level]} level slots`,'number',`${level}${ordinal[level]}_level_slots`) + +hack() + //- End .statblock-section + .in-play + .statblock-section + .row + each val in [{value:'size',type:'text'},{value:'genome',type:'text'},{value:'modification',type:'text'}] + if val.value === 'modification' + input(type='hidden' name=`attr_${val.value}` class='parens-control') + span.italics.parens + |( + span.italics(name=`attr_${val.value}`) + if val.value ==='modification' + span.italics.parens + |) + .statblock-section + .row + h4(data-i18n='armor class') + span(name=`attr_ac`) + input(type='hidden' name=`attr_ac_notes` class='parens-control') + span.italics.parens + |( + span.italics.parens(name=`attr_ac_notes`) + span.italics.parens + |) + .row + h4(data-i18n='damage reduction') + span(name=`attr_damage_reduction`) + .row + h4(data-i18n='hit points') + span(name=`attr_hp`) + input(type='hidden' name=`attr_hit_dice` class='parens-control') + span.italics.parens + |( + span.italics.parens(name=`attr_hit_dice`) + span.italics.parens + |) + .row + h4(data-i18n='speed') + span(name=`attr_speed`) + .statblock-section + .row + each ability,abbreviation in abilityScores + +npc-ability-label(ability) + .statblock-section + .row + h4(data-i18n='skills') + each skill in skillNames + input.skill-control(type='hidden' name=`attr_${skill}`) + .skill-display(title=`@{${skill}}`) + button.h4(type='roll' name=`roll_${skill}` data-i18n=skill.replace(/_/g,' ') value=`@{template_start} {{rollName=^{${skill.replace(/_/g,' ')}}}} @{${skill}_macro}`) + span(name=`attr_${skill}`) + //- End each + .row + h4(data-i18n='skill notes') + span(name='attr_skill_notes' title='@{skill_notes}') + .row + each val in [{name:'senses',i18n:'senses'},{name:'passive_perception',i18n:'passive perception'}] + h4(data-i18n=val.i18n) + span(name=`attr_${val.name}` title=`@{${val.name}}`) + .row + h4(data-i18n='languages') + span(name='attr_languages' title='@{languages}') + .row + each val in [{value:'challenge',i18n:'challenge'},{value:'experience_points',i18n:'xp'}] + if val.value==='challenge' + h4(data-i18n=val.i18n) + if val.i18n==='xp' + span.parens + |( + span(name=`attr_${val.value}`) + if val.i18n==='xp' + span(data-i18n=val.i18n) + span.parens + |) + each level in hackLevels + input(type='hidden' name=`attr_${level}${ordinal[level]}_level_slots` value='' class=`hack-display-control level${level}`) + .statblock-section.hack-display + each level in hackLevels + div(class=`level${level}`) + h4(data-i18n=`${level}${ordinal[level]} level`) + span + |( + span(name=`attr_${level}${ordinal[level]}_level_slots`) + span + |): + fieldset.repeating_hack + input.button-control(type='hidden' name='attr_level' value='') + button.h4(type='roll' name='roll_roll' value='@{template_start} {{rollName=@{name}}} @{attack_enable_item} @{save_enable_item} @{damage_1_enable_item} @{damage_2_enable_item} {{range=@{range}}} {{properties=@{properties}}} {{description=@{description}}}') + span(name='attr_name') + .repeating-container + +trait() + +action() + //- End .settings + //- End .npc +//- End .whole +// Roll templates +rolltemplate.sheet-rolltemplate-general + div(class=`roll-display ${['d20','damage_1','damage_2','dc'].map((val,ind)=>{return `{{#${val}}}${ind + 1} {{/${val}}} `}).join('').replace(/\s+/g,'')}`) + +rollTemplateHelperFunction({positive:true,field:'character_name'}) + +templateBorderedContainer({class:'character_name'}) + h4 + +rollTemplateHelperFunction({positive:true,field:'character_id'}) + !='[{{character_name}}](http://journal.roll20.net/character/{{character_id}})' + +rollTemplateHelperFunction({positive:false,field:'character_id'}) + !='{{character_name}}' + //- End if + +rollTemplateHelperFunction({positive:true,field:'d20'}) + +templateHexagonLabelContainer('rollValue','rollName','^{roll}') + span + |{{d20}} + +rollTemplateHelperFunction({positive:true,field:'damage_1'}) + +templateHexagonLabelContainer('damage1','damage_type_1','^{damage 1}') + span + |{{damage_1}} + +rollTemplateHelperFunction({positive:true,field:'d20',func:'rollWasCrit'}) + +rollTemplateHelperFunction({positive:true,field:'is_custom_crit_1'}) + span + |{{custom_critical_1}} + +rollTemplateHelperFunction({positive:false,field:'is_custom_crit_1'}) + span + |{{regular_critical_1}} + +rollTemplateHelperFunction({positive:true,field:'damage_2'}) + +templateHexagonLabelContainer('damage2','damage_type_2','^{damage 2}') + span + |{{damage_2}} + +rollTemplateHelperFunction({positive:true,field:'d20',func:'rollWasCrit'}) + +rollTemplateHelperFunction({positive:true,field:'is_custom_crit_2'}) + span + |{{custom_critical_2}} + +rollTemplateHelperFunction({positive:false,field:'is_custom_crit_2'}) + span + |{{regular_critical_2}} + +rollTemplateHelperFunction({positive:true,field:'dc'}) + +templateHexagonLabelContainer('save','save_type','^{save}') + span + |{{dc}} + +rollTemplateHelperFunction({positive:true,field:'range'}) + +templateBorderedContainer({class:'range'}) + span + |{{range}} + +rollTemplateHelperFunction({positive:true,field:'properties'}) + +templateBorderedContainer({class:'properties'}) + span + |{{properties}} + +rollTemplateHelperFunction({positive:true,field:'description'}) + +templateBorderedContainer({class:'description'}) + span + |{{description}} +// End Roll Templates +// Start Scripts +script(type='text/worker') + include genefunk2090.js // End Scripts \ No newline at end of file diff --git a/Ironsworn/src/app/components/assets/asset-builder.pug b/Ironsworn/src/app/components/assets/asset-builder.pug index 4538711545..2c59aa6a73 100644 --- a/Ironsworn/src/app/components/assets/asset-builder.pug +++ b/Ironsworn/src/app/components/assets/asset-builder.pug @@ -1,160 +1,160 @@ -include ../../data/assets - -mixin assetDropdown(assetName, assetObject) - select.sub-dropdown(name=`attr_assetdropdown${assetName}`) - - var defaultTranslation = 'asset-dropdown-default' - option(data-i18n=defaultTranslation value='' disabled='' selected='')=locals.translations[defaultTranslation] - each asset, key in assets[assetObject] - option(data-i18n=`asset-title-${key}` value=key)=locals.translations[`asset-title-${key}`] - -mixin ability(asset, number, key) - .flex-container - if asset.firstAbilityChecked && number == 1 - input.asset-ability( - type='checkbox' - name=`attr_assetcheckbox_${asset.abilityId}${number}` - checked - ) - else - input.asset-ability( - type='checkbox' - name=`attr_assetcheckbox_${asset.abilityId}${number}` - ) - - var translationAbility = `asset-${key}-ability-${number}` - .asset-ability - p(data-i18n=translationAbility)=locals.translations[translationAbility] - if asset.abilityWriteIn - if asset.abilityWriteIn.number == number - - var translationAbilityWriteIn = `asset-${key}-ability-${number}-write-in` - .asset-ability-write-in(data-i18n=translationAbilityWriteIn)=locals.translations[translationAbilityWriteIn] - input.border-bottom.no-border(type='text' name=`attr_asset${asset.abilityWriteIn.name}` value='') - if asset.list && number == asset.list.ability - - var currentListItem = 1 - ul - while currentListItem <= asset.list.number - - var translationId = `asset-${key}-ability-${number}-list-${currentListItem++}` - li(data-i18n=translationId)=locals.translations[translationId] - -mixin write-in-input(key) - .asset-write-in.asset-name( - data-i18n=`asset-write-in-${key}` - )=locals.translations[`asset-write-in-${key}`] - -mixin description(asset, type, key) - if asset.description || asset.writeIn - .asset-description - if key === 'blade-bound' - +write-in-input(key) - input.border-bottom.no-border(type='text' name='attr_assetpathnameinput' value='') - else if key === 'banner-sworn' - +write-in-input(key) - input.border-bottom.no-border(type='text' name='attr_assetpathnameinput' value='') - else if key === 'devotant' - +write-in-input(`${key}-1`) - input.border-bottom.no-border(type='text' name='attr_assetgodsnameinput' value='') - +write-in-input(`${key}-2`) - input.border-bottom.no-border(type='text' name='attr_assetstatinput' value='') - else if key === 'empowered' - +write-in-input(key) - input.border-bottom.no-border(type='text' name='attr_assettitleinput' value='') - else if key === 'wright' - +write-in-input(key) - input.border-bottom.no-border(type='text' name='attr_assetspecialityinput' value='') - if asset.description - - var translationDesc = `asset-description-${key}` - .asset-description-text(data-i18n=translationDesc)=locals.translations[translationDesc] - -mixin track(number, name) - .asset-track-wrapper - - var currentTrack = 0 - - var tranformedName = name.replace('-', '') - while currentTrack <= number - .asset-track-box - if currentTrack == 0 - .asset-track-box-display=0 - else - .asset-track-box-display=`+ ${currentTrack}` - input(type='radio' name=`attr_assettrack_${tranformedName}` value=`${currentTrack}`) - - currentTrack++ - -mixin combatTalentBuilder - input.asset-combat-talent.hide-element(type='checkbox' name='attr_assetcombat-talent') - .combat-talent.showhide - +assetDropdown('combattalent', 'combatTalents') - - each asset, key in assets.combatTalents - input(class=`hide-element ${key}` type='checkbox' name=`attr_assetcombattalentdiv${key}`) - div(class=`hide-element ${key}`) - if asset.description - .asset-description - - var translationDesc = `asset-description-${key}` - .asset-description-text(data-i18n=translationDesc)=locals.translations[translationDesc] - .flex-wrapper - each number in [ 1, 2, 3 ] - +ability(asset, number, key) - if key === 'ironclad' - .asset-track-wrapper.asset-track-wrapper-wordy - each track in [ 1, 2 ] - - var value = track - 1 - .asset-track-box - .asset-track-box-display=locals.translations[`asset-ironclad-track-${track}`] - input(type='radio' name='attr_assettrack_ironclad' value=`${value}`) - -mixin companionBuilder - - var assetType = 'companion' - input.asset-companion.hide-element(type='checkbox' name=`attr_asset${assetType}`) - .companion.showhide - +assetDropdown(assetType, 'companions') - - each asset, key in assets.companions - input(class=`hide-element ${key}` type='checkbox' name=`attr_asset${assetType}div${key}`) - div(class=`hide-element ${key}`) - .asset-description - - var translationDesc = `asset-description-${key}` - .asset-write-in.asset-name(data-i18n='asset-companion-name')=locals.translations['asset-companion-name'] - input.border-bottom.no-border(type='text' name='attr_assetname' value='') - .asset-description-text(data-i18n=translationDesc)=locals.translations[translationDesc] - .flex-wrapper - each ability in [ 1, 2, 3 ] - +ability(asset, ability, key) - .asset-track-wrapper - - var healthValue = 0 - while healthValue <= asset.health - - var value = healthValue++ - .asset-track-box - if value == 0 - .asset-track-box-display=value - else - .asset-track-box-display=`+ ${value}` - input(type='radio' name=`attr_assettrack_${key}` value=`${value}`) - -mixin ritualBuilder - - var assetType = 'ritual' - input.asset-ritual.hide-element(type='checkbox' name=`attr_asset${assetType}`) - .ritual.showhide - +assetDropdown(assetType, 'rituals') - - each asset, key in assets.rituals - input(class=`hide-element ${key}` type='checkbox' name=`attr_asset${assetType}div${key}`) - div(class=`hide-element ${key}`) - .flex-wrapper - each ability in [ 1, 2, 3 ] - +ability(asset, ability, key) - if asset.track - +track(asset.track, key) - -mixin pathBuilder - - var assetType = 'path' - input.asset-path.hide-element(type='checkbox' name=`attr_asset${assetType}`) - .path.showhide - +assetDropdown(assetType, 'paths') - - each asset, key in assets.paths - input(class=`hide-element ${key}` type='checkbox' name=`attr_asset${assetType}div${key}`) - div(class=`hide-element ${key}`) - +description(asset, assetType, key) - .flex-wrapper - each ability in [ 1, 2, 3 ] - +ability(asset, ability, key) - if asset.track - +track(asset.track, key) +include ../../data/assets + +mixin assetDropdown(assetName, assetObject) + select.sub-dropdown(name=`attr_assetdropdown${assetName}`) + - var defaultTranslation = 'asset-dropdown-default' + option(data-i18n=defaultTranslation value='' disabled='' selected='')=locals.translations[defaultTranslation] + each asset, key in assets[assetObject] + option(data-i18n=`asset-title-${key}` value=key)=locals.translations[`asset-title-${key}`] + +mixin ability(asset, number, key) + .flex-container + if asset.firstAbilityChecked && number == 1 + input.asset-ability( + type='checkbox' + name=`attr_assetcheckbox_${asset.abilityId}${number}` + checked + ) + else + input.asset-ability( + type='checkbox' + name=`attr_assetcheckbox_${asset.abilityId}${number}` + ) + - var translationAbility = `asset-${key}-ability-${number}` + .asset-ability + p(data-i18n=translationAbility)=locals.translations[translationAbility] + if asset.abilityWriteIn + if asset.abilityWriteIn.number == number + - var translationAbilityWriteIn = `asset-${key}-ability-${number}-write-in` + .asset-ability-write-in(data-i18n=translationAbilityWriteIn)=locals.translations[translationAbilityWriteIn] + input.border-bottom.no-border(type='text' name=`attr_asset${asset.abilityWriteIn.name}` value='') + if asset.list && number == asset.list.ability + - var currentListItem = 1 + ul + while currentListItem <= asset.list.number + - var translationId = `asset-${key}-ability-${number}-list-${currentListItem++}` + li(data-i18n=translationId)=locals.translations[translationId] + +mixin write-in-input(key) + .asset-write-in.asset-name( + data-i18n=`asset-write-in-${key}` + )=locals.translations[`asset-write-in-${key}`] + +mixin description(asset, type, key) + if asset.description || asset.writeIn + .asset-description + if key === 'blade-bound' + +write-in-input(key) + input.border-bottom.no-border(type='text' name='attr_assetpathnameinput' value='') + else if key === 'banner-sworn' + +write-in-input(key) + input.border-bottom.no-border(type='text' name='attr_assetpathnameinput' value='') + else if key === 'devotant' + +write-in-input(`${key}-1`) + input.border-bottom.no-border(type='text' name='attr_assetgodsnameinput' value='') + +write-in-input(`${key}-2`) + input.border-bottom.no-border(type='text' name='attr_assetstatinput' value='') + else if key === 'empowered' + +write-in-input(key) + input.border-bottom.no-border(type='text' name='attr_assettitleinput' value='') + else if key === 'wright' + +write-in-input(key) + input.border-bottom.no-border(type='text' name='attr_assetspecialityinput' value='') + if asset.description + - var translationDesc = `asset-description-${key}` + .asset-description-text(data-i18n=translationDesc)=locals.translations[translationDesc] + +mixin track(number, name) + .asset-track-wrapper + - var currentTrack = 0 + - var tranformedName = name.replace('-', '') + while currentTrack <= number + .asset-track-box + if currentTrack == 0 + .asset-track-box-display=0 + else + .asset-track-box-display=`+ ${currentTrack}` + input(type='radio' name=`attr_assettrack_${tranformedName}` value=`${currentTrack}`) + - currentTrack++ + +mixin combatTalentBuilder + input.asset-combat-talent.hide-element(type='checkbox' name='attr_assetcombat-talent') + .combat-talent.showhide + +assetDropdown('combattalent', 'combatTalents') + + each asset, key in assets.combatTalents + input(class=`hide-element ${key}` type='checkbox' name=`attr_assetcombattalentdiv${key}`) + div(class=`hide-element ${key}`) + if asset.description + .asset-description + - var translationDesc = `asset-description-${key}` + .asset-description-text(data-i18n=translationDesc)=locals.translations[translationDesc] + .flex-wrapper + each number in [ 1, 2, 3 ] + +ability(asset, number, key) + if key === 'ironclad' + .asset-track-wrapper.asset-track-wrapper-wordy + each track in [ 1, 2 ] + - var value = track - 1 + .asset-track-box + .asset-track-box-display=locals.translations[`asset-ironclad-track-${track}`] + input(type='radio' name='attr_assettrack_ironclad' value=`${value}`) + +mixin companionBuilder + - var assetType = 'companion' + input.asset-companion.hide-element(type='checkbox' name=`attr_asset${assetType}`) + .companion.showhide + +assetDropdown(assetType, 'companions') + + each asset, key in assets.companions + input(class=`hide-element ${key}` type='checkbox' name=`attr_asset${assetType}div${key}`) + div(class=`hide-element ${key}`) + .asset-description + - var translationDesc = `asset-description-${key}` + .asset-write-in.asset-name(data-i18n='asset-companion-name')=locals.translations['asset-companion-name'] + input.border-bottom.no-border(type='text' name='attr_assetname' value='') + .asset-description-text(data-i18n=translationDesc)=locals.translations[translationDesc] + .flex-wrapper + each ability in [ 1, 2, 3 ] + +ability(asset, ability, key) + .asset-track-wrapper + - var healthValue = 0 + while healthValue <= asset.health + - var value = healthValue++ + .asset-track-box + if value == 0 + .asset-track-box-display=value + else + .asset-track-box-display=`+ ${value}` + input(type='radio' name=`attr_assettrack_${key}` value=`${value}`) + +mixin ritualBuilder + - var assetType = 'ritual' + input.asset-ritual.hide-element(type='checkbox' name=`attr_asset${assetType}`) + .ritual.showhide + +assetDropdown(assetType, 'rituals') + + each asset, key in assets.rituals + input(class=`hide-element ${key}` type='checkbox' name=`attr_asset${assetType}div${key}`) + div(class=`hide-element ${key}`) + .flex-wrapper + each ability in [ 1, 2, 3 ] + +ability(asset, ability, key) + if asset.track + +track(asset.track, key) + +mixin pathBuilder + - var assetType = 'path' + input.asset-path.hide-element(type='checkbox' name=`attr_asset${assetType}`) + .path.showhide + +assetDropdown(assetType, 'paths') + + each asset, key in assets.paths + input(class=`hide-element ${key}` type='checkbox' name=`attr_asset${assetType}div${key}`) + div(class=`hide-element ${key}`) + +description(asset, assetType, key) + .flex-wrapper + each ability in [ 1, 2, 3 ] + +ability(asset, ability, key) + if asset.track + +track(asset.track, key) diff --git a/Ironsworn/src/app/components/assets/assets.pug b/Ironsworn/src/app/components/assets/assets.pug index 15e82958e5..1d9c401364 100644 --- a/Ironsworn/src/app/components/assets/assets.pug +++ b/Ironsworn/src/app/components/assets/assets.pug @@ -1,26 +1,26 @@ -include ./asset-custom -include ./asset-builder - - -mixin assets() - .assets - fieldset.repeating_assets.fixed-width - .asset - .asset-header - select.asset-type-dropdown(name='attr_assettype') - - var types = ['companion','path','combat-talent','ritual','custom'] - - var defaultDropdown = 'asset-dropdown-default' - option( - data-i18n=defaultDropdown - value='' - disabled='' - selected='' - )=locals.translations[defaultDropdown] - each value in types - - var translationValue = `asset-type-${value}` - option(data-i18n=translationValue value=value)=locals.translations[translationValue] - +companionBuilder - +pathBuilder - +combatTalentBuilder - +ritualBuilder +include ./asset-custom +include ./asset-builder + + +mixin assets() + .assets + fieldset.repeating_assets.fixed-width + .asset + .asset-header + select.asset-type-dropdown(name='attr_assettype') + - var types = ['companion','path','combat-talent','ritual','custom'] + - var defaultDropdown = 'asset-dropdown-default' + option( + data-i18n=defaultDropdown + value='' + disabled='' + selected='' + )=locals.translations[defaultDropdown] + each value in types + - var translationValue = `asset-type-${value}` + option(data-i18n=translationValue value=value)=locals.translations[translationValue] + +companionBuilder + +pathBuilder + +combatTalentBuilder + +ritualBuilder +customAssets \ No newline at end of file diff --git a/Ironsworn/src/app/components/misses/track.pug b/Ironsworn/src/app/components/misses/track.pug index e0c0296945..a3da4f809c 100644 --- a/Ironsworn/src/app/components/misses/track.pug +++ b/Ironsworn/src/app/components/misses/track.pug @@ -1,30 +1,30 @@ -- var track = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] -include ../progress/mixins/box - -input.optional-track-failures.hide-element(type='checkbox' name='attr_optional_track_failures' checked) -div.optional-track-failures.showhide - h3.divide(data-i18n='page-summary-failures')=locals.translations['page-summary-failures'] - .misses-track - .progress-row - div - label.clear-miss - input(class="clear-miss hide" type="checkbox" name="attr_clear_misses") - div.failure-btn-div(data-i18n='clear-btn')=locals.translations['clear-btn'] - each index in track - +progressBoxComplex(`attr_miss_${index}`) - div - label.btn - button( - type="roll" - class='hide' - name="rollMisses" - value="&{template:ironsworn_progress} {{progress_type=Failures}} {{header=@{character_name} Learn From Your Failures }} {{progress=[[@{misses-filled}]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}}" - ) - div.failure-btn-div(data-i18n='failures-learn')=locals.translations['failures-learn'] - input( - type="text" - class="hide-element" - name="attr_misses-filled" - value="floor((@{miss_0}+@{miss_1}+@{miss_2}+@{miss_3}+@{miss_4}+@{miss_5}+@{miss_6}+@{miss_7}+@{miss_8}+@{miss_9})/4)" - disabled="true" +- var track = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] +include ../progress/mixins/box + +input.optional-track-failures.hide-element(type='checkbox' name='attr_optional_track_failures' checked) +div.optional-track-failures.showhide + h3.divide(data-i18n='page-summary-failures')=locals.translations['page-summary-failures'] + .misses-track + .progress-row + div + label.clear-miss + input(class="clear-miss hide" type="checkbox" name="attr_clear_misses") + div.failure-btn-div(data-i18n='clear-btn')=locals.translations['clear-btn'] + each index in track + +progressBoxComplex(`attr_miss_${index}`) + div + label.btn + button( + type="roll" + class='hide' + name="rollMisses" + value="&{template:ironsworn_progress} {{progress_type=Failures}} {{header=@{character_name} Learn From Your Failures }} {{progress=[[@{misses-filled}]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}}" + ) + div.failure-btn-div(data-i18n='failures-learn')=locals.translations['failures-learn'] + input( + type="text" + class="hide-element" + name="attr_misses-filled" + value="floor((@{miss_0}+@{miss_1}+@{miss_2}+@{miss_3}+@{miss_4}+@{miss_5}+@{miss_6}+@{miss_7}+@{miss_8}+@{miss_9})/4)" + disabled="true" ) \ No newline at end of file diff --git a/Ironsworn/src/app/components/moves/mixins/container.pug b/Ironsworn/src/app/components/moves/mixins/container.pug index 5a59db98d8..d5bb596ca6 100644 --- a/Ironsworn/src/app/components/moves/mixins/container.pug +++ b/Ironsworn/src/app/components/moves/mixins/container.pug @@ -1,147 +1,147 @@ -mixin progressRoll(opts, visibility) - button( - type="roll" - title=opts.title - name=`roll_${opts.name}` - class=visibility - value=`&{template:ironsworn_progress} {{header=@{character_name}}} {{progress_name=${locals.translations[opts.title]}}} {{progress=[[?{Filled Progress|0}]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}}` - ) - -mixin oracleRoll(opts, visibility) - button( - type="roll" - title=opts.title - name=`roll_${opts.name}` - class=visibility - value=`&{template:${opts.type}} {{header=${locals.translations[opts.title]}}} {{${opts.name}=[[d100]]}}` - ) - -mixin discoverASiteRoll(opts, visibility) - button( - type="roll" - title=opts.title - name=`roll_${opts.name}` - class=visibility - value=`&{template:ironsworn_moves} {{header=${locals.translations[opts.title]}}} {{${opts.name}=[[2d10kl1]]}}` - ) - -mixin rarityRoll(opts, visibility) - button( - type="roll" - title=`${locals.translations[opts.title]} Move` - class=visibility - name=`roll_${opts.name}` - value!=`&{template:ironsworn_moves} {{header=@{character_name}}} {{name=${locals.translations[opts.title]}}} {{rarityAction=[[d6+${opts.stat}+(?{Modifier|0})]]}} {{negate1=[[1+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate2=[[2+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate3=[[3+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate4=[[4+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate5=[[5+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate6=[[6+${opts.stat_repeat}+(?{Modifier|0})]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}} {{momentum=[[@{momentum}]]}} {{modifiers=[[${opts.stat_repeat}+(?{Modifier|0})]]}} {{add=[[(?{Modifier|0})]]}} {{stat=[[${opts.stat_repeat}]]}} {{rarityDie6=[[6+${opts.stat_repeat}+(?{Modifier|0})]]}} {{rarityDie5=[[5+${opts.stat_repeat}+(?{Modifier|0})]]}} {{rarityDie1=[[1+${opts.stat_repeat}+(?{Modifier|0})]]}}` - ) - -mixin owlRoll(opts, visibility) - button( - type="roll" - title=`${locals.translations[opts.title]} Move` - class=visibility - name=`roll_${opts.name}` - value!=`&{template:ironsworn_moves} {{header=@{character_name}}} {{name=${locals.translations[opts.title]}}} {{action=[[{d6+${opts.stat}+(?{Modifier|0}),{10}}kl1]]}} {{owl=[[?{Owl Companion|No,0|Yes,?{Owl's Health&#124;0&#125;}]]}} {{negate1=[[1+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate2=[[2+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate3=[[3+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate4=[[4+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate5=[[5+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate6=[[6+${opts.stat_repeat}+(?{Modifier|0})]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}} {{momentum=[[@{momentum}+(?{Owl Companion})]]}} {{modifiers=[[${opts.stat_repeat}+(?{Modifier|0})]]}} {{add=[[(?{Modifier|0})]]}} {{stat=[[${opts.stat_repeat}]]}}` - ) - -mixin delveTheDepthsRoll(opts, visibility) - button( - type="roll" - title=`${locals.translations[opts.title]} Move` - class=visibility - name=`roll_${opts.name}` - value!=`&{template:ironsworn_moves} {{header=@{character_name}}} {{name=${locals.translations[opts.title]}}} {{delveTheDepths=[[{d6+${opts.stat}+(?{Modifier|0}),{10}}kl1]]}} {{negate1=[[1+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate2=[[2+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate3=[[3+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate4=[[4+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate5=[[5+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate6=[[6+${opts.stat_repeat}+(?{Modifier|0})]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}} {{momentum=[[@{momentum}]]}} {{modifiers=[[${opts.stat_repeat}+(?{Modifier|0})]]}} {{add=[[(?{Modifier|0})]]}} {{stat=[[${opts.stat_repeat}]]}} {{revealADangerButton=[Reveal A Danger](~@{character_name}|revealADanger_oracle)}} {{findAnOpportunityButton=[Find An Opportunity](~@{character_name}|findAnOpportunity_oracle)}} {{delveTheDepthsTableButton=[Roll on the Table](~@{character_name}|delveTheDepthsTableRoll)}}` - ) - -mixin delveTheDepthsTableRoll(opts, visibility) - button( - type="roll" - title=`${locals.translations[opts.title]} Move` - class=visibility - name=`roll_${opts.name}TableRoll` - value!=`&{template:ironsworn_oracles} {{header=${locals.translations[opts.title]}}} {{delveTheDepthsTableRoll=[[d100]]}} {{statValue=[[?{Stat|Edge,1|Shadow,2|Wits,3}]]}}` - ) - -mixin movesRoll(opts, visibility) - button( - type="roll" - title=`${locals.translations[opts.title]} Move` - class=visibility - name=`roll_${opts.name}` - value!=`&{template:ironsworn_moves} {{header=@{character_name}}} {{name=${locals.translations[opts.title]}}} {{action=[[{d6+${opts.stat}+(?{Modifier|0}),{10}}kl1]]}} {{negate1=[[1+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate2=[[2+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate3=[[3+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate4=[[4+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate5=[[5+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate6=[[6+${opts.stat_repeat}+(?{Modifier|0})]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}} {{momentum=[[@{momentum}]]}} {{modifiers=[[${opts.stat_repeat}+(?{Modifier|0})]]}} {{add=[[(?{Modifier|0})]]}} {{stat=[[${opts.stat_repeat}]]}}` - ) - -mixin rollLabel - label.roll-label Roll - block - -mixin rollListLabel - label.roll-list-label Roll - block - -mixin rollLabelTable - label.roll-label Roll on the Table - block - -mixin preview(opts, misc) - if misc.no_title - div - else - div.move-title.move-preview(data-i18n=opts.title)=locals.translations[opts.title] - if opts.roll - div.roll-viewer - if opts.progress - +rollLabel - +progressRoll(opts, 'hide-element') - else if opts.oracle - +rollLabel - +oracleRoll(opts, 'hide-element') - else if opts.rarity - +rollLabel - +rarityRoll(opts, 'hide-element') - else if opts.owl - +rollLabel - +owlRoll(opts, 'hide-element') - else if opts.discover_a_site - +rollLabel - +discoverASiteRoll(opts, 'hide-element') - else if opts.delve_the_depths - +rollLabel - +delveTheDepthsRoll(opts, 'hide-element') - else - +rollLabel - +movesRoll(opts, 'hide-element') - .move-description - block - if opts.delve_the_depths - +rollLabelTable - +delveTheDepthsTableRoll(opts, 'hide-element') - .oracle-footer.move-page-footer=opts.page - -mixin container(opts, misc) - if misc.visibility - div.move-visible - +preview(opts, misc) - block - else - input(type='radio' name='attr_move_preview' class=`${opts.class} hide-element` value=opts.radio) - div(class=`${opts.class} showhide`) - +preview(opts, misc) - block - -mixin listButton(opts) - if opts.no_quick_roll - | - else - .button-container - if opts.progress - +progressRoll(opts, 'roll-show') - else if opts.oracle - +oracleRoll(opts, 'roll-show') - else if opts.rarity - +rarityRoll(opts, 'roll-show') - else if opts.owl - +owlRoll(opts, 'roll-show') - else if opts.discover_a_site - +discoverASiteRoll(opts, 'roll-show') - else +mixin progressRoll(opts, visibility) + button( + type="roll" + title=opts.title + name=`roll_${opts.name}` + class=visibility + value=`&{template:ironsworn_progress} {{header=@{character_name}}} {{progress_name=${locals.translations[opts.title]}}} {{progress=[[?{Filled Progress|0}]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}}` + ) + +mixin oracleRoll(opts, visibility) + button( + type="roll" + title=opts.title + name=`roll_${opts.name}` + class=visibility + value=`&{template:${opts.type}} {{header=${locals.translations[opts.title]}}} {{${opts.name}=[[d100]]}}` + ) + +mixin discoverASiteRoll(opts, visibility) + button( + type="roll" + title=opts.title + name=`roll_${opts.name}` + class=visibility + value=`&{template:ironsworn_moves} {{header=${locals.translations[opts.title]}}} {{${opts.name}=[[2d10kl1]]}}` + ) + +mixin rarityRoll(opts, visibility) + button( + type="roll" + title=`${locals.translations[opts.title]} Move` + class=visibility + name=`roll_${opts.name}` + value!=`&{template:ironsworn_moves} {{header=@{character_name}}} {{name=${locals.translations[opts.title]}}} {{rarityAction=[[d6+${opts.stat}+(?{Modifier|0})]]}} {{negate1=[[1+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate2=[[2+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate3=[[3+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate4=[[4+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate5=[[5+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate6=[[6+${opts.stat_repeat}+(?{Modifier|0})]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}} {{momentum=[[@{momentum}]]}} {{modifiers=[[${opts.stat_repeat}+(?{Modifier|0})]]}} {{add=[[(?{Modifier|0})]]}} {{stat=[[${opts.stat_repeat}]]}} {{rarityDie6=[[6+${opts.stat_repeat}+(?{Modifier|0})]]}} {{rarityDie5=[[5+${opts.stat_repeat}+(?{Modifier|0})]]}} {{rarityDie1=[[1+${opts.stat_repeat}+(?{Modifier|0})]]}}` + ) + +mixin owlRoll(opts, visibility) + button( + type="roll" + title=`${locals.translations[opts.title]} Move` + class=visibility + name=`roll_${opts.name}` + value!=`&{template:ironsworn_moves} {{header=@{character_name}}} {{name=${locals.translations[opts.title]}}} {{action=[[{d6+${opts.stat}+(?{Modifier|0}),{10}}kl1]]}} {{owl=[[?{Owl Companion|No,0|Yes,?{Owl's Health&#124;0&#125;}]]}} {{negate1=[[1+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate2=[[2+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate3=[[3+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate4=[[4+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate5=[[5+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate6=[[6+${opts.stat_repeat}+(?{Modifier|0})]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}} {{momentum=[[@{momentum}+(?{Owl Companion})]]}} {{modifiers=[[${opts.stat_repeat}+(?{Modifier|0})]]}} {{add=[[(?{Modifier|0})]]}} {{stat=[[${opts.stat_repeat}]]}}` + ) + +mixin delveTheDepthsRoll(opts, visibility) + button( + type="roll" + title=`${locals.translations[opts.title]} Move` + class=visibility + name=`roll_${opts.name}` + value!=`&{template:ironsworn_moves} {{header=@{character_name}}} {{name=${locals.translations[opts.title]}}} {{delveTheDepths=[[{d6+${opts.stat}+(?{Modifier|0}),{10}}kl1]]}} {{negate1=[[1+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate2=[[2+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate3=[[3+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate4=[[4+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate5=[[5+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate6=[[6+${opts.stat_repeat}+(?{Modifier|0})]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}} {{momentum=[[@{momentum}]]}} {{modifiers=[[${opts.stat_repeat}+(?{Modifier|0})]]}} {{add=[[(?{Modifier|0})]]}} {{stat=[[${opts.stat_repeat}]]}} {{revealADangerButton=[Reveal A Danger](~@{character_name}|revealADanger_oracle)}} {{findAnOpportunityButton=[Find An Opportunity](~@{character_name}|findAnOpportunity_oracle)}} {{delveTheDepthsTableButton=[Roll on the Table](~@{character_name}|delveTheDepthsTableRoll)}}` + ) + +mixin delveTheDepthsTableRoll(opts, visibility) + button( + type="roll" + title=`${locals.translations[opts.title]} Move` + class=visibility + name=`roll_${opts.name}TableRoll` + value!=`&{template:ironsworn_oracles} {{header=${locals.translations[opts.title]}}} {{delveTheDepthsTableRoll=[[d100]]}} {{statValue=[[?{Stat|Edge,1|Shadow,2|Wits,3}]]}}` + ) + +mixin movesRoll(opts, visibility) + button( + type="roll" + title=`${locals.translations[opts.title]} Move` + class=visibility + name=`roll_${opts.name}` + value!=`&{template:ironsworn_moves} {{header=@{character_name}}} {{name=${locals.translations[opts.title]}}} {{action=[[{d6+${opts.stat}+(?{Modifier|0}),{10}}kl1]]}} {{negate1=[[1+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate2=[[2+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate3=[[3+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate4=[[4+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate5=[[5+${opts.stat_repeat}+(?{Modifier|0})]]}} {{negate6=[[6+${opts.stat_repeat}+(?{Modifier|0})]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}} {{momentum=[[@{momentum}]]}} {{modifiers=[[${opts.stat_repeat}+(?{Modifier|0})]]}} {{add=[[(?{Modifier|0})]]}} {{stat=[[${opts.stat_repeat}]]}}` + ) + +mixin rollLabel + label.roll-label Roll + block + +mixin rollListLabel + label.roll-list-label Roll + block + +mixin rollLabelTable + label.roll-label Roll on the Table + block + +mixin preview(opts, misc) + if misc.no_title + div + else + div.move-title.move-preview(data-i18n=opts.title)=locals.translations[opts.title] + if opts.roll + div.roll-viewer + if opts.progress + +rollLabel + +progressRoll(opts, 'hide-element') + else if opts.oracle + +rollLabel + +oracleRoll(opts, 'hide-element') + else if opts.rarity + +rollLabel + +rarityRoll(opts, 'hide-element') + else if opts.owl + +rollLabel + +owlRoll(opts, 'hide-element') + else if opts.discover_a_site + +rollLabel + +discoverASiteRoll(opts, 'hide-element') + else if opts.delve_the_depths + +rollLabel + +delveTheDepthsRoll(opts, 'hide-element') + else + +rollLabel + +movesRoll(opts, 'hide-element') + .move-description + block + if opts.delve_the_depths + +rollLabelTable + +delveTheDepthsTableRoll(opts, 'hide-element') + .oracle-footer.move-page-footer=opts.page + +mixin container(opts, misc) + if misc.visibility + div.move-visible + +preview(opts, misc) + block + else + input(type='radio' name='attr_move_preview' class=`${opts.class} hide-element` value=opts.radio) + div(class=`${opts.class} showhide`) + +preview(opts, misc) + block + +mixin listButton(opts) + if opts.no_quick_roll + | + else + .button-container + if opts.progress + +progressRoll(opts, 'roll-show') + else if opts.oracle + +oracleRoll(opts, 'roll-show') + else if opts.rarity + +rarityRoll(opts, 'roll-show') + else if opts.owl + +owlRoll(opts, 'roll-show') + else if opts.discover_a_site + +discoverASiteRoll(opts, 'roll-show') + else +movesRoll(opts, 'roll-show') \ No newline at end of file diff --git a/Ironsworn/src/app/components/moves/mixins/move-builder.pug b/Ironsworn/src/app/components/moves/mixins/move-builder.pug index d952998412..cefe827f7a 100644 --- a/Ironsworn/src/app/components/moves/mixins/move-builder.pug +++ b/Ironsworn/src/app/components/moves/mixins/move-builder.pug @@ -1,26 +1,26 @@ -include ../content/delve-table -include ./container -include ./oracle-table -include ./standalone-tables -include ../../../data/oracles - -mixin moveBuilder(opts, misc) - +container(opts, misc) - each row in opts.content - if row.list - ul - each item in row.list - li(data-i18n=item)!=locals.translations[item] - else if row.table - +oracleTable(oracles.moves[row.table.group].oracles[row.table.name], 'moves', row.table.group) - else if row.depths_table - +delveTable - else if row.ask_the_oracle - +askTheOracle - else if row.delve_the_depths - +delveTheDepths - else if row.h6 - h6(data-i18n=row.h6)!=locals.translations[row.h6] - else - p(data-i18n=row.p)!=locals.translations[row.p] - +include ../content/delve-table +include ./container +include ./oracle-table +include ./standalone-tables +include ../../../data/oracles + +mixin moveBuilder(opts, misc) + +container(opts, misc) + each row in opts.content + if row.list + ul + each item in row.list + li(data-i18n=item)!=locals.translations[item] + else if row.table + +oracleTable(oracles.moves[row.table.group].oracles[row.table.name], 'moves', row.table.group) + else if row.depths_table + +delveTable + else if row.ask_the_oracle + +askTheOracle + else if row.delve_the_depths + +delveTheDepths + else if row.h6 + h6(data-i18n=row.h6)!=locals.translations[row.h6] + else + p(data-i18n=row.p)!=locals.translations[row.p] + diff --git a/Ironsworn/src/app/components/moves/moves.pug b/Ironsworn/src/app/components/moves/moves.pug index 661ce6b7f7..a36e575433 100644 --- a/Ironsworn/src/app/components/moves/moves.pug +++ b/Ironsworn/src/app/components/moves/moves.pug @@ -1,68 +1,68 @@ -include ../../data/group-list -include ../../data/scroll-list -include ../../data/move-list -include ./mixins/move-builder - - -//- Search Bar -input(type='radio' class='hide-element full-move-list' name='attr_move_view' value='1' checked) -.full-move-list.showhide - //- .search-bar - //- input(type='text' class='search-bar' name='attr_move_search' placeholder='Search') - //- label.clear-search CLEAR - //- input(type='checkbox' class='hide-element' name='attr_clear_search') - - //- List of Moves - .move-container - input(type='radio' class='hide-element' name='attr_selected_move') - each group in moveGroups - if group.optional - input(type='checkbox' class=`optional-move-${group.optional} hide-element` name=`attr_optional_move_${group.optional}` checked) - div(class=`move-group optional-move-${group.optional} hide-element`) - .move-group-title - h3(data-i18n=group.title)=locals.translations[group.title] - each move in group.moves - .move-list - +listButton(moveList[move.value]) - label.move - input(type='radio' class='hide-element selected-move' name='attr_selected_move' value=move.value) - div.move-name(data-i18n=move.name)=locals.translations[move.name] - else - .move-group - .move-group-title - h3(data-i18n=group.title)=locals.translations[group.title] - each move in group.moves - .move-list - +listButton(moveList[move.value]) - label.move - input(type='radio' class='hide-element selected-move' name='attr_selected_move' value=move.value) - div.move-name(data-i18n=move.name)=locals.translations[move.name] - -//- Move Details -input(type='radio' class='hide-element move-preview' name='attr_move_view' value='2') -.move-preview.showhide - .preview-bar - //- .search-preview-bar - //- input(type='text' class='search-preview-bar' name='attr_move_search' placeholder='Search') - //- label.clear-search CLEAR - //- input(type='checkbox' class='hide-element' name='attr_clear_search') - .close-bar - label.close-preview CLOSE PREVIEW - input(type='checkbox' class='hide-element' name='attr_close_move_preview') - .preview-container - .move-scroll-list - each group in moveGroupsScroll - .move-group-scroll - .move-group-title - h3(data-i18n=group.title)=locals.translations[group.title] - each move in group.moves - .move-list - label.move - input(type='radio' class='hide-element' name='attr_selected_move' value=move.value) - //- input(type='checkbox' class='hide-element move-highlight' name=`attr_${move.value}_highlight`) - div.move-name(data-i18n=move.name)=locals.translations[move.name] - - //- Move Previews - .move-preview-container - each move in moveList - +moveBuilder(move, false) +include ../../data/group-list +include ../../data/scroll-list +include ../../data/move-list +include ./mixins/move-builder + + +//- Search Bar +input(type='radio' class='hide-element full-move-list' name='attr_move_view' value='1' checked) +.full-move-list.showhide + //- .search-bar + //- input(type='text' class='search-bar' name='attr_move_search' placeholder='Search') + //- label.clear-search CLEAR + //- input(type='checkbox' class='hide-element' name='attr_clear_search') + + //- List of Moves + .move-container + input(type='radio' class='hide-element' name='attr_selected_move') + each group in moveGroups + if group.optional + input(type='checkbox' class=`optional-move-${group.optional} hide-element` name=`attr_optional_move_${group.optional}` checked) + div(class=`move-group optional-move-${group.optional} hide-element`) + .move-group-title + h3(data-i18n=group.title)=locals.translations[group.title] + each move in group.moves + .move-list + +listButton(moveList[move.value]) + label.move + input(type='radio' class='hide-element selected-move' name='attr_selected_move' value=move.value) + div.move-name(data-i18n=move.name)=locals.translations[move.name] + else + .move-group + .move-group-title + h3(data-i18n=group.title)=locals.translations[group.title] + each move in group.moves + .move-list + +listButton(moveList[move.value]) + label.move + input(type='radio' class='hide-element selected-move' name='attr_selected_move' value=move.value) + div.move-name(data-i18n=move.name)=locals.translations[move.name] + +//- Move Details +input(type='radio' class='hide-element move-preview' name='attr_move_view' value='2') +.move-preview.showhide + .preview-bar + //- .search-preview-bar + //- input(type='text' class='search-preview-bar' name='attr_move_search' placeholder='Search') + //- label.clear-search CLEAR + //- input(type='checkbox' class='hide-element' name='attr_clear_search') + .close-bar + label.close-preview CLOSE PREVIEW + input(type='checkbox' class='hide-element' name='attr_close_move_preview') + .preview-container + .move-scroll-list + each group in moveGroupsScroll + .move-group-scroll + .move-group-title + h3(data-i18n=group.title)=locals.translations[group.title] + each move in group.moves + .move-list + label.move + input(type='radio' class='hide-element' name='attr_selected_move' value=move.value) + //- input(type='checkbox' class='hide-element move-highlight' name=`attr_${move.value}_highlight`) + div.move-name(data-i18n=move.name)=locals.translations[move.name] + + //- Move Previews + .move-preview-container + each move in moveList + +moveBuilder(move, false) diff --git a/Ironsworn/src/app/components/nav/nav-bar.pug b/Ironsworn/src/app/components/nav/nav-bar.pug index f6529cda7a..b0b52b0dca 100644 --- a/Ironsworn/src/app/components/nav/nav-bar.pug +++ b/Ironsworn/src/app/components/nav/nav-bar.pug @@ -1,30 +1,30 @@ -include ../../data/nav - -mixin navBar(sheetType) - div.nav-bar - if sheetType == 'shared' - - var rows = sharedRows - else - - var rows = charRows - each row in rows - div.nav-row - each page in row.pages - if page.optional - input(type='checkbox' class=`optional-nav-${page.optional} hide-element` name=`attr_optional_nav_${page.optional}` checked) - div(class=`nav-child optional-nav-${page.optional} showhide`) - label.page-label - if page.checked - input(type='radio' name=`attr_${sheetType}_page_button` class='hide-element page-button' value=page.id checked) - else - input(type='radio' name=`attr_${sheetType}_page_button` class='hide-element page-button' value=page.id) - - var translation = `nav-${page.text}` - div.page-button-back(data-i18n=translation)=locals.translations[translation] - else - div.nav-child - label.page-label - if page.checked - input(type='radio' name=`attr_${sheetType}_page_button` class='hide-element page-button' value=page.id checked) - else - input(type='radio' name=`attr_${sheetType}_page_button` class='hide-element page-button' value=page.id) - - var translation = `nav-${page.text}` - div.page-button-back(data-i18n=translation)=locals.translations[translation] +include ../../data/nav + +mixin navBar(sheetType) + div.nav-bar + if sheetType == 'shared' + - var rows = sharedRows + else + - var rows = charRows + each row in rows + div.nav-row + each page in row.pages + if page.optional + input(type='checkbox' class=`optional-nav-${page.optional} hide-element` name=`attr_optional_nav_${page.optional}` checked) + div(class=`nav-child optional-nav-${page.optional} showhide`) + label.page-label + if page.checked + input(type='radio' name=`attr_${sheetType}_page_button` class='hide-element page-button' value=page.id checked) + else + input(type='radio' name=`attr_${sheetType}_page_button` class='hide-element page-button' value=page.id) + - var translation = `nav-${page.text}` + div.page-button-back(data-i18n=translation)=locals.translations[translation] + else + div.nav-child + label.page-label + if page.checked + input(type='radio' name=`attr_${sheetType}_page_button` class='hide-element page-button' value=page.id checked) + else + input(type='radio' name=`attr_${sheetType}_page_button` class='hide-element page-button' value=page.id) + - var translation = `nav-${page.text}` + div.page-button-back(data-i18n=translation)=locals.translations[translation] diff --git a/Ironsworn/src/app/components/progress/progress.pug b/Ironsworn/src/app/components/progress/progress.pug index 51d7b21225..26dbad7305 100644 --- a/Ironsworn/src/app/components/progress/progress.pug +++ b/Ironsworn/src/app/components/progress/progress.pug @@ -1,31 +1,31 @@ -- var track = [ 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten' ] -- var challenge = [ 'one', 'two', 'three', 'four' ] -include ../../data/difficulties -include ./mixins/box - -fieldset.repeating_progress - div - br - .progress-holder - input.progress-name(type='text' name='attr_name') - label.challenge-show - input(type='checkbox' class='hide-element challenge-show-button' name='attr_challenge-show-button') - .challenge-show-back(data-i18n='progress-challenge')=locals.translations['progress-challenge'] - .progress-header - each difficulty, index in difficulties - label.difficulty - if difficulty.checked - input(type="radio" class="hide-element" name="attr_rank" value=index checked) - else - input(type="radio" class="hide-element" name="attr_rank" value=index) - h5=difficulty.text - +progressTrack(track, 'name') - .progress-container - input(type='checkbox' class='hide-element challenge-show' name='attr_challenge-show') - .challenge-row.showhide - label.challenge-label COUNTDOWN - each index in challenge - label.challenge-box - input.challenge.hide-element(type='checkbox' class='hide-element' name=`attr_countdown-${index}`) - .challenge-fill - +- var track = [ 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten' ] +- var challenge = [ 'one', 'two', 'three', 'four' ] +include ../../data/difficulties +include ./mixins/box + +fieldset.repeating_progress + div + br + .progress-holder + input.progress-name(type='text' name='attr_name') + label.challenge-show + input(type='checkbox' class='hide-element challenge-show-button' name='attr_challenge-show-button') + .challenge-show-back(data-i18n='progress-challenge')=locals.translations['progress-challenge'] + .progress-header + each difficulty, index in difficulties + label.difficulty + if difficulty.checked + input(type="radio" class="hide-element" name="attr_rank" value=index checked) + else + input(type="radio" class="hide-element" name="attr_rank" value=index) + h5=difficulty.text + +progressTrack(track, 'name') + .progress-container + input(type='checkbox' class='hide-element challenge-show' name='attr_challenge-show') + .challenge-row.showhide + label.challenge-label COUNTDOWN + each index in challenge + label.challenge-box + input.challenge.hide-element(type='checkbox' class='hide-element' name=`attr_countdown-${index}`) + .challenge-fill + diff --git a/Ironsworn/src/app/components/resources/resources.pug b/Ironsworn/src/app/components/resources/resources.pug index f7f7e9f512..e7971d4e07 100644 --- a/Ironsworn/src/app/components/resources/resources.pug +++ b/Ironsworn/src/app/components/resources/resources.pug @@ -1,58 +1,58 @@ -- var charResources = [ 'health', 'spirit', 'supply'] -- var sharedResources = [ 'supply' ] -- var standard = [ 5, 4, 3, 2, 1, 0 ] -- var inverse = [ 0, 1, 2, 3, 4, 5 ] - -mixin options(trackValues) - each val in trackValues - option(value=val)=`+${val}` - -mixin dropdowns(resource) - div.resource - label.roll-resource-label - button( - type="roll" - title=`@{roll${resource}}` - class='hide-element' - name=`roll${resource}` - value!=`&{template:ironsworn_moves} {{header=@{character_name}}} {{name=roll +${resource}}} {{action=[[{d6+@{${resource}}+(?{Modifier|0}),{10}}kl1]]}} {{negate1=[[1+@{${resource}}+(?{Modifier|0})]]}} {{negate2=[[2+@{${resource}}+(?{Modifier|0})]]}} {{negate3=[[3+@{${resource}}+(?{Modifier|0})]]}} {{negate4=[[4+@{${resource}}+(?{Modifier|0})]]}} {{negate5=[[5+@{${resource}}+(?{Modifier|0})]]}} {{negate6=[[6+@{${resource}}+(?{Modifier|0})]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}} {{momentum=[[@{momentum}]]}} {{modifiers=[[@{${resource}}+(?{Modifier|0})]]}} {{add=[[(?{Modifier|0})]]}} {{stat=[[@{${resource}}]]}}` - ) - div(data-i18n=`resource-${resource}`)=locals.translations[`resource-${resource}`] - select(class="resource-value" name=`attr_${resource}`) - if resource == 'wealth' - - var trackValues = inverse - +options(inverse) - else - - var trackValues = standard - +options(standard) - -mixin character(resources) - div.resources - div.resource - h2.resource-title(data-i18n='character-name')=locals.translations['character-name'] - div.health-status-box - input(type='text' class="resource-value character-name" name="attr_character_name" placeholder='Character Name') - - each resource in resources - +dropdowns(resource) - - div.resource - h2.resource-title(data-i18n='character-experience')=locals.translations['character-experience'] - div.health-status-box - input(type='text' class="resource-value" name="attr_xp" value="0") - h2.resource-title(data-i18n='character-experience-spent')=locals.translations['character-experience-spent'] - div.health-status-box - input(type='text' class="resource-value" name="attr_total_xp" value="0") - -mixin shared(resources) - div.resources - each resource in resources - +dropdowns(resource) - -mixin resources(sheetType) - if sheetType == 'shared' - - var resources = sharedResources - +shared(resources) - else - - var resources = charResources +- var charResources = [ 'health', 'spirit', 'supply'] +- var sharedResources = [ 'supply' ] +- var standard = [ 5, 4, 3, 2, 1, 0 ] +- var inverse = [ 0, 1, 2, 3, 4, 5 ] + +mixin options(trackValues) + each val in trackValues + option(value=val)=`+${val}` + +mixin dropdowns(resource) + div.resource + label.roll-resource-label + button( + type="roll" + title=`@{roll${resource}}` + class='hide-element' + name=`roll${resource}` + value!=`&{template:ironsworn_moves} {{header=@{character_name}}} {{name=roll +${resource}}} {{action=[[{d6+@{${resource}}+(?{Modifier|0}),{10}}kl1]]}} {{negate1=[[1+@{${resource}}+(?{Modifier|0})]]}} {{negate2=[[2+@{${resource}}+(?{Modifier|0})]]}} {{negate3=[[3+@{${resource}}+(?{Modifier|0})]]}} {{negate4=[[4+@{${resource}}+(?{Modifier|0})]]}} {{negate5=[[5+@{${resource}}+(?{Modifier|0})]]}} {{negate6=[[6+@{${resource}}+(?{Modifier|0})]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}} {{momentum=[[@{momentum}]]}} {{modifiers=[[@{${resource}}+(?{Modifier|0})]]}} {{add=[[(?{Modifier|0})]]}} {{stat=[[@{${resource}}]]}}` + ) + div(data-i18n=`resource-${resource}`)=locals.translations[`resource-${resource}`] + select(class="resource-value" name=`attr_${resource}`) + if resource == 'wealth' + - var trackValues = inverse + +options(inverse) + else + - var trackValues = standard + +options(standard) + +mixin character(resources) + div.resources + div.resource + h2.resource-title(data-i18n='character-name')=locals.translations['character-name'] + div.health-status-box + input(type='text' class="resource-value character-name" name="attr_character_name" placeholder='Character Name') + + each resource in resources + +dropdowns(resource) + + div.resource + h2.resource-title(data-i18n='character-experience')=locals.translations['character-experience'] + div.health-status-box + input(type='text' class="resource-value" name="attr_xp" value="0") + h2.resource-title(data-i18n='character-experience-spent')=locals.translations['character-experience-spent'] + div.health-status-box + input(type='text' class="resource-value" name="attr_total_xp" value="0") + +mixin shared(resources) + div.resources + each resource in resources + +dropdowns(resource) + +mixin resources(sheetType) + if sheetType == 'shared' + - var resources = sharedResources + +shared(resources) + else + - var resources = charResources +character(resources) \ No newline at end of file diff --git a/Ironsworn/src/app/components/vows/vow-container.pug b/Ironsworn/src/app/components/vows/vow-container.pug index 10c5a6e38a..a07b7db82c 100644 --- a/Ironsworn/src/app/components/vows/vow-container.pug +++ b/Ironsworn/src/app/components/vows/vow-container.pug @@ -1,125 +1,125 @@ -include ../../data/difficulties -include ../progress/mixins/box - -- var track = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] -- var menaceTrack = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] -- var legacyVows = [ 1, 2, 3, 4, 5 ] - -mixin input(id, nameValue) - input( - type="text" - class=id - data-i18n-placeholder=id - placeholder=locals.translations[id] - name=nameValue - ) - -mixin vowLegacy(number) - +input("vow-name", `attr_vow${number}_name`) - - input.optional-vow-threat.hide-element(type='checkbox' name=`attr_optional_vow_threat_${number}` checked) - .optional-vow-threat.showhide - .threat-container - .threat-header - +input("vow-threat", `attr_vow${number}_threat-name`) - label.menace-show - input(type='checkbox' class='hide-element menace-show-button' name=`attr_vow${number}_menace-show-button`) - .menace-show-back(data-i18n='vow-menace')=locals.translations['vow-menace'] - input(type='checkbox' class='hide-element menace-show' name=`attr_vow${number}_menace-show`) - .menace-row.showhide - each index in menaceTrack - label.menace-box - input.menace-vow.hide-element(type='checkbox' class='hide-element' name=`attr_vow${number}-${index}-threat`) - .menace-fill - - div.vows-header - each difficulty, index in difficulties - label.difficulty - if difficulty.checked - input(type="radio" class="hide-element" name=`attr_vow${number}_rank` value=index checked) - else - input(type="radio" class="hide-element" name=`attr_vow${number}_rank` value=index) - - var translation = `difficulty-${difficulty.text}` - h5(data-i18n=translation)=locals.translations[translation] - - div.vow - .progress-row - div - label.btn - input(class="mark-vow hide" type="checkbox" name=`attr_mark_progress_${number}`) - div.btn-div(data-i18n='vow-mark')=locals.translations['vow-mark'] - label.btn - input(class="clear-vow hide" type="checkbox" name=`attr_clear_progress_${number}`) - div.btn-div(data-i18n='clear-btn')=locals.translations['clear-btn'] - each index in track - +progressBoxComplex(`attr_vow${number}-${index}`) - div - label.btn - button( - type="roll" - class='hide' - name="rollVow" - value=`&{template:ironsworn_progress} {{progress_type=Vow}} {{header=@{character_name} Fulfill Your Vow }} {{progress_name=@{vow${number}_name}}} {{progress=[[@{vow${number}-filled}]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}}` - ) - div.btn-div(data-i18n='vow-fulfill')=locals.translations['vow-fulfill'] - input( - type="text" - class="hide-element" - name=`attr_vow${number}-filled` - value=`floor((@{vow${number}-0}+@{vow${number}-1}+@{vow${number}-2}+@{vow${number}-3}+@{vow${number}-4}+@{vow${number}-5}+@{vow${number}-6}+@{vow${number}-7}+@{vow${number}-8}+@{vow${number}-9})/4)` - disabled - ) - -mixin repeatingVow() - +input("vow-name", 'attr_vow_name') - - .threat-container - .threat-header - +input("vow-threat", 'attr_threat-name') - label.menace-show - input(type='checkbox' class='hide-element menace-show-button' name=`attr_menace-show-button`) - .menace-show-back(data-i18n='vow-menace')=locals.translations['vow-menace'] - input(type='checkbox' class='hide-element menace-show' name=`attr_menace-show`) - .menace-row.showhide - each index in menaceTrack - label.menace-box - input.menace-vow.hide-element(type='checkbox' class='hide-element' name=`attr_menace-${index}`) - .menace-fill - - div.vows-header - each difficulty, index in difficulties - label.difficulty - if difficulty.checked - input(type="radio" class="hide-element" name="attr_rank" value=index checked) - else - input(type="radio" class="hide-element" name="attr_rank" value=index) - - var translation = `difficulty-${difficulty.text}` - h5(data-i18n=translation)=locals.translations[translation] - - div.vow - .progress-row - div - label.btn - input(class="mark-vow hide" type="checkbox" name="attr_mark_progress") - div.btn-div(data-i18n='vow-mark')=locals.translations['vow-mark'] - label.btn - input(class="clear-vow hide" type="checkbox" name="attr_clear_progress") - div.btn-div(data-i18n='clear-btn')=locals.translations['clear-btn'] - each index in track - +progressBoxComplex(`attr_progress_${index}`) - div - label.btn - button( - type="roll" - class='hide' - name="rollVow" - value="&{template:ironsworn_progress} {{progress_type=Vow}} {{header=@{character_name} Fulfill Your Vow }} {{progress_name=@{vow_name}}} {{progress=[[@{vow-filled}]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}}" - ) - div.btn-div(data-i18n='vow-fulfill')=locals.translations['vow-fulfill'] - input( - type="text" - class="hide-element" - name="attr_vow-filled" - value="floor((@{progress_0}+@{progress_1}+@{progress_2}+@{progress_3}+@{progress_4}+@{progress_5}+@{progress_6}+@{progress_7}+@{progress_8}+@{progress_9})/4)" - disabled +include ../../data/difficulties +include ../progress/mixins/box + +- var track = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] +- var menaceTrack = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] +- var legacyVows = [ 1, 2, 3, 4, 5 ] + +mixin input(id, nameValue) + input( + type="text" + class=id + data-i18n-placeholder=id + placeholder=locals.translations[id] + name=nameValue + ) + +mixin vowLegacy(number) + +input("vow-name", `attr_vow${number}_name`) + + input.optional-vow-threat.hide-element(type='checkbox' name=`attr_optional_vow_threat_${number}` checked) + .optional-vow-threat.showhide + .threat-container + .threat-header + +input("vow-threat", `attr_vow${number}_threat-name`) + label.menace-show + input(type='checkbox' class='hide-element menace-show-button' name=`attr_vow${number}_menace-show-button`) + .menace-show-back(data-i18n='vow-menace')=locals.translations['vow-menace'] + input(type='checkbox' class='hide-element menace-show' name=`attr_vow${number}_menace-show`) + .menace-row.showhide + each index in menaceTrack + label.menace-box + input.menace-vow.hide-element(type='checkbox' class='hide-element' name=`attr_vow${number}-${index}-threat`) + .menace-fill + + div.vows-header + each difficulty, index in difficulties + label.difficulty + if difficulty.checked + input(type="radio" class="hide-element" name=`attr_vow${number}_rank` value=index checked) + else + input(type="radio" class="hide-element" name=`attr_vow${number}_rank` value=index) + - var translation = `difficulty-${difficulty.text}` + h5(data-i18n=translation)=locals.translations[translation] + + div.vow + .progress-row + div + label.btn + input(class="mark-vow hide" type="checkbox" name=`attr_mark_progress_${number}`) + div.btn-div(data-i18n='vow-mark')=locals.translations['vow-mark'] + label.btn + input(class="clear-vow hide" type="checkbox" name=`attr_clear_progress_${number}`) + div.btn-div(data-i18n='clear-btn')=locals.translations['clear-btn'] + each index in track + +progressBoxComplex(`attr_vow${number}-${index}`) + div + label.btn + button( + type="roll" + class='hide' + name="rollVow" + value=`&{template:ironsworn_progress} {{progress_type=Vow}} {{header=@{character_name} Fulfill Your Vow }} {{progress_name=@{vow${number}_name}}} {{progress=[[@{vow${number}-filled}]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}}` + ) + div.btn-div(data-i18n='vow-fulfill')=locals.translations['vow-fulfill'] + input( + type="text" + class="hide-element" + name=`attr_vow${number}-filled` + value=`floor((@{vow${number}-0}+@{vow${number}-1}+@{vow${number}-2}+@{vow${number}-3}+@{vow${number}-4}+@{vow${number}-5}+@{vow${number}-6}+@{vow${number}-7}+@{vow${number}-8}+@{vow${number}-9})/4)` + disabled + ) + +mixin repeatingVow() + +input("vow-name", 'attr_vow_name') + + .threat-container + .threat-header + +input("vow-threat", 'attr_threat-name') + label.menace-show + input(type='checkbox' class='hide-element menace-show-button' name=`attr_menace-show-button`) + .menace-show-back(data-i18n='vow-menace')=locals.translations['vow-menace'] + input(type='checkbox' class='hide-element menace-show' name=`attr_menace-show`) + .menace-row.showhide + each index in menaceTrack + label.menace-box + input.menace-vow.hide-element(type='checkbox' class='hide-element' name=`attr_menace-${index}`) + .menace-fill + + div.vows-header + each difficulty, index in difficulties + label.difficulty + if difficulty.checked + input(type="radio" class="hide-element" name="attr_rank" value=index checked) + else + input(type="radio" class="hide-element" name="attr_rank" value=index) + - var translation = `difficulty-${difficulty.text}` + h5(data-i18n=translation)=locals.translations[translation] + + div.vow + .progress-row + div + label.btn + input(class="mark-vow hide" type="checkbox" name="attr_mark_progress") + div.btn-div(data-i18n='vow-mark')=locals.translations['vow-mark'] + label.btn + input(class="clear-vow hide" type="checkbox" name="attr_clear_progress") + div.btn-div(data-i18n='clear-btn')=locals.translations['clear-btn'] + each index in track + +progressBoxComplex(`attr_progress_${index}`) + div + label.btn + button( + type="roll" + class='hide' + name="rollVow" + value="&{template:ironsworn_progress} {{progress_type=Vow}} {{header=@{character_name} Fulfill Your Vow }} {{progress_name=@{vow_name}}} {{progress=[[@{vow-filled}]]}} {{challenge1=[[d10]]}} {{challenge2=[[d10]]}}" + ) + div.btn-div(data-i18n='vow-fulfill')=locals.translations['vow-fulfill'] + input( + type="text" + class="hide-element" + name="attr_vow-filled" + value="floor((@{progress_0}+@{progress_1}+@{progress_2}+@{progress_3}+@{progress_4}+@{progress_5}+@{progress_6}+@{progress_7}+@{progress_8}+@{progress_9})/4)" + disabled ) \ No newline at end of file diff --git a/Ironsworn/src/app/pages/character/summary.pug b/Ironsworn/src/app/pages/character/summary.pug index c8b88e76b6..27a629bda2 100644 --- a/Ironsworn/src/app/pages/character/summary.pug +++ b/Ironsworn/src/app/pages/character/summary.pug @@ -1,23 +1,23 @@ -include ../../components/debilities/debilities -include ../../components/vows/vow-container - -mixin summaryPage - div.page-container - input(type='radio' name='attr_character_page' class='summary hide-element' value='1' checked) - div.summary.showhide - include ../../components/stats/character - include ../../components/misses/track - h3.divide(data-i18n='page-summary-vows')=locals.translations['page-summary-vows'] - div.vows - if sheetType == 'shared' - fieldset.repeating_vow - +repeatingVow() - else - div.hide-element - each vow in legacyVows - +vowLegacy(vow) - fieldset.repeating_vow - +repeatingVow() - h3.divide(data-i18n='page-summary-debilities')=locals.translations['page-summary-debilities'] - +debilityList({character: true}) +include ../../components/debilities/debilities +include ../../components/vows/vow-container + +mixin summaryPage + div.page-container + input(type='radio' name='attr_character_page' class='summary hide-element' value='1' checked) + div.summary.showhide + include ../../components/stats/character + include ../../components/misses/track + h3.divide(data-i18n='page-summary-vows')=locals.translations['page-summary-vows'] + div.vows + if sheetType == 'shared' + fieldset.repeating_vow + +repeatingVow() + else + div.hide-element + each vow in legacyVows + +vowLegacy(vow) + fieldset.repeating_vow + +repeatingVow() + h3.divide(data-i18n='page-summary-debilities')=locals.translations['page-summary-debilities'] + +debilityList({character: true}) include ../../components/notes/notes \ No newline at end of file diff --git a/Ironsworn/src/app/pages/index.pug b/Ironsworn/src/app/pages/index.pug index 5e0188a5e1..55673a0350 100644 --- a/Ironsworn/src/app/pages/index.pug +++ b/Ironsworn/src/app/pages/index.pug @@ -1,31 +1,31 @@ -input.changelog.hide-element(type='checkbox' name='attr_changelog_2.3.0') -.changelog - .copy - h3 Version 2.3.0 Release - div Added translation support for oracles. This includes the roll templates. - label.close-changelog - input(type='checkbox' name=`attr_close_changelog` class='hide-element') - div(data-i18n='page-info-close')=locals.translations['page-info-close'] - -- var pages = [ 'character', 'shared' ] -input(type='checkbox' name='attr_modes_choice' class='modes-show hide-element' checked) -div.modes-show.hide-element - div.mode-title - h2.mode-title(data-i18n='page-select')=locals.translations['page-select'] - div.modes - - each page, index in pages - label.mode - h4(data-i18n=`page-name-${page}`)=locals.translations[`page-name-${page}`] - div.mode - input(type='radio' name='attr_mode_button' class='hide-element' value=index) - div.mode-image - img(src=`https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Ironsworn/assets/${page}-sheet.png`) - -input(type='radio' name='attr_mode' class='character-mode hide-element' value='0') -div.character-mode.hide-element - include ./character/index - -input(type='radio' name='attr_mode' class='shared-mode hide-element' value='1') -div.shared-mode.hide-element +input.changelog.hide-element(type='checkbox' name='attr_changelog_2.3.0') +.changelog + .copy + h3 Version 2.3.0 Release + div Added translation support for oracles. This includes the roll templates. + label.close-changelog + input(type='checkbox' name=`attr_close_changelog` class='hide-element') + div(data-i18n='page-info-close')=locals.translations['page-info-close'] + +- var pages = [ 'character', 'shared' ] +input(type='checkbox' name='attr_modes_choice' class='modes-show hide-element' checked) +div.modes-show.hide-element + div.mode-title + h2.mode-title(data-i18n='page-select')=locals.translations['page-select'] + div.modes + + each page, index in pages + label.mode + h4(data-i18n=`page-name-${page}`)=locals.translations[`page-name-${page}`] + div.mode + input(type='radio' name='attr_mode_button' class='hide-element' value=index) + div.mode-image + img(src=`https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Ironsworn/assets/${page}-sheet.png`) + +input(type='radio' name='attr_mode' class='character-mode hide-element' value='0') +div.character-mode.hide-element + include ./character/index + +input(type='radio' name='attr_mode' class='shared-mode hide-element' value='1') +div.shared-mode.hide-element include ./shared/index \ No newline at end of file diff --git a/Mothership Official/src/js/sheetworkers.js b/Mothership Official/src/js/sheetworkers.js index 68e372e495..f7975733be 100644 --- a/Mothership Official/src/js/sheetworkers.js +++ b/Mothership Official/src/js/sheetworkers.js @@ -1,671 +1,671 @@ -// Sheet Variables - -const skillList = { - "linguistics":{ - unlocks: ["sophontology"] - }, - "biology":{ - unlocks: ["genetics","psychology"] - }, - "first_aid": { - unlocks: ["pathology"] - }, - "hydroponics": { - unlocks: ["botany"] - }, - "geology": { - unlocks: ["planetology","asteroid_mining"] - }, - "zero-g": { - unlocks: ["asteroid_mining"] - }, - "scavenging": { - unlocks: ["asteroid_mining","jury_rigging"] - }, - "heavy_machinery": { - unlocks: ["asteroid_mining","engineering"] - }, - "computers": { - unlocks: ["engineering","hacking"] - }, - "mechanical_repair": { - unlocks: ["engineering", "jury_rigging", "vehicle_specialization"] - }, - "driving": { - unlocks: ["vehicle_specialization"] - }, - "piloting": { - unlocks: ["vehicle_specialization","astrogation"] - }, - "mathematics": { - unlocks: ["physics"] - }, - "art": { - unlocks: ["mysticism"] - }, - "archaeology": { - unlocks: ["mysticism"] - }, - "theology": { - unlocks: ["mysticism"] - }, - "military_training": { - unlocks: ["tactics","gunnery","firearms","explosives","close-quarters_combat"] - }, - "rimwise": { - unlocks: ["firearms","close-quarters_combat"] - }, - "athletics": { - unlocks: ["close-quarters_combat"] - }, - "chemistry": { - unlocks: ["explosives"] - }, - "psychology": { - unlocks: ["sophontology"] - }, - "genetics": { - unlocks: ["xenobiology"] - }, - "pathology": { - unlocks: ["xenobiology","surgery"] - }, - "botany": { - unlocks: ["xenobiology"] - }, - "planetology": { - unlocks: [] - }, - "asteroid_mining" : { - unlocks: [] - }, - "jury_rigging": { - unlocks: ["cybernetics"] - }, - "engineering": { - unlocks: ["cybernetics","robotics","artificial_intelligence"] - }, - "hacking": { - unlocks: ["artificial_intelligence"] - }, - "vehicle_specialization": { - unlocks: ["command"] - }, - "astrogation": { - unlocks: ["hyperspace"] - }, - "physics": { - unlocks: ["hyperspace"] - }, - "mysticism": { - unlocks: ["xenoesotericism", "hyperspace"] - }, - "tactics": { - unlocks: ["command"] - }, - "gunnery": { - unlocks: ["weapon_specialization"] - }, - "firearms": { - unlocks: ["weapon_specialization"] - }, - "close-quarters_combat": { - unlocks: ["weapon_specialization"] - }, - "explosives": { - unlocks: ["weapon_specialization"] - }, - "sophontology": {}, - "xenobiology": {}, - "surgery": {}, - "cybernetics": {}, - "robotics": {}, - "artificial_intelligence": {}, - "command": {}, - "hyperspace": {}, - "xenoesotericism": {}, - "weapon_specialization": {} -}; - -const skillArray = Object.keys(skillList); - -// FUNCTIONS - -const advantageToggle = (newValue) => { - -} - -const toggleSkill = (source, newValue) => { - - getAttrs(["sheet_skill_toggles"], values => { - - const existingValue = values["sheet_skill_toggles"].trim(); - const valueList = existingValue.split(" ") - const unlocks = skillList[source].unlocks || []; - - let updateAttr = ""; - - if (newValue === "0") { - - unlocks.forEach(item => valueList.splice(valueList.indexOf(item), 1)); - - updateAttr = valueList.join(" "); - - } else if (newValue === "on") { - - updateAttr = existingValue + " "; - - if (unlocks === []) return; - - unlocks.forEach(unlock => updateAttr += `${unlock} `); - - } - - setAttrs({sheet_skill_toggles:updateAttr}); - }); - -} - -const addItem = (new_value, previous_value, source, source_type) => { - if (new_value === previous_value || new_value !== "Weapon" || source_type !== "player") return; - - console.log(source_type) - - const repeating_length = "repeating_equipment_".length; - const repeating_id_length = 20; - const repeating_id = source.substring(repeating_length, repeating_length + repeating_id_length); - const repeating_equipment_prefix = `repeating_equipment_${repeating_id}`; - const new_repeating_id = generateRowID(); - const repeating_attacks_prefix = `repeating_attacks_${new_repeating_id}`; - - const requestAttrs = [`${repeating_equipment_prefix}_equipment_name`,`${repeating_equipment_prefix}_equipment_type`]; - - getAttrs(requestAttrs, values => { - const updateAttrs = {}; - - updateAttrs[`${repeating_attacks_prefix}_attack_name`] = values[`${repeating_equipment_prefix}_equipment_name`]; - updateAttrs[`${repeating_attacks_prefix}_attack_linkedid`] = repeating_id; - - setAttrs(updateAttrs); - - }); -} - -const toggleClass = (new_class, previous_class, source_type) => { - const requestAttrs = [ - "init", - "level", - "sanity", - "fear", - "body", - "armor", - "strength", - "speed", - "intellect", - "combat", - "stress_panic", - ]; - - if (source_type !== "player") return; - - const update = {}; - - update["level"] = 0; - update["xp"] = 0; - update["stress"] = 2; - update["resolve"] = 0; - update["init"] = 1; - - switch (new_class.toLowerCase()) { - case "teamster": - update["sanity"] = 30; - update["fear"] = 35; - update["body"] = 30; - update["armor"] = 35; - update["strength"] = rollDice(6) + 5; - update["speed"] = rollDice(6) + 5; - update["intellect"] = rollDice(6); - update["combat"] = rollDice(6); - update["skill_points"] = 4; - update["stress_panic"] = getTranslationByKey(["Once per session, a Teamster may re-roll a roll on the Panic Effect Table."]); - break; - case "android": - update["sanity"] = 20; - update["fear"] = 85; - update["body"] = 40; - update["armor"] = 25; - update["strength"] = rollDice(6); - update["speed"] = rollDice(6) + 5; - update["intellect"] = rollDice(6) + 5; - update["combat"] = rollDice(6); - update["skill_points"] = 2; - update["stress_panic"] = getTranslationByKey(["Fear Saves made in the presence of Androids have Disadvantage."]); - break; - case "scientist": - update["sanity"] = 40; - update["fear"] = 25; - update["body"] = 25; - update["armor"] = 30; - update["strength"] = rollDice(6); - update["speed"] = rollDice(6); - update["intellect"] = rollDice(6) + 10; - update["combat"] = rollDice(6); - update["skill_points"] = 3; - update["stress_panic"] = getTranslationByKey(["Whenever a Scientist fails a Sanity Save, every friendly player nearby gains 1 Stress."]); - break; - case "marine": - update["sanity"] = 25; - update["fear"] = 30; - update["body"] = 35; - update["armor"] = 40; - update["strength"] = rollDice(6); - update["speed"] = rollDice(6); - update["intellect"] = rollDice(6); - update["combat"] = rollDice(6) + 5; - update["skill_points"] = 3; - update["stress_panic"] = getTranslationByKey(["Whenever a Marine Panics, every friendly player nearby must make a Fear Save."]); - break; - default: - return; - } - - getAttrs(requestAttrs, values => { - - if (previous_class === new_class && values["init"] === "1") return; - - requestAttrs.forEach(attr => { - if (values[attr] !== "") update[attr] = values[attr]; - }) - - if (values["level"] === 0 || values["level"] === "") { - - const fields = [ - "level", - "sanity", - "fear", - "body", - "armor", - "stress_panic", - "stress", - "resolve", - "strength", - "speed", - "intellect", - "combat", - "skill_points", - "xp", - "init" - ]; - - const updateAttrs = {}; - - fields.forEach(field => { - const fallback = values[field] || 0; - updateAttrs[field] = (typeof field !== undefined) ? update[field] : fallback; - }); - - const hitpoints = parseInt(update["strength"]) * 2; - - updateAttrs["health"] = hitpoints; - updateAttrs["health_max"] = hitpoints; - - setAttrs(updateAttrs); - - } - - }); -} - -const rollDice = (number_of_dice) => { - let total = 0; - - for (let i = 0; i <= number_of_dice; i++) total += Math.ceil(Math.random()*10); - - return total; -} - -const calculateRow = (row, new_value) => { - - if (!row) return console.warn("Tried to update a ship row, but there wasn't a row specified"); - - const int_value = parseInt(new_value) || 0; - - if (row === "lifesupport") setAttrs({"ship_lifesupport_modules":Math.ceil(int_value/10), life_support_hull:Math.ceil(int_value/10), ship_galleys: Math.ceil(int_value/20)}); - if (row === "command") setAttrs({"ship_command_modules":Math.ceil(int_value/4), command_hull:Math.ceil(int_value/4), ship_livingquarters:int_value}); - if (row === "armor") setAttrs({armor:Math.floor(int_value*10), armor_hull:Math.floor(int_value*3)}); - if (row === "jumpdrives") { - let hull = 0; - for (let i = 1; i <= int_value; i++) hull += i; - setAttrs({jump_drives_hull:hull, ship_computer_modules:int_value}); - } - if (row === "computer") setAttrs({computer_hull:int_value}); - if (row === "galley") setAttrs({galley_hull:int_value}); - if (row === "weaponmount") setAttrs({ship_weapon_mounts:int_value, weapon_mount_hull:int_value}); - if (row === "medbays") setAttrs({ship_medint_bonus:Math.floor(int_value*5), medical_bay_hull:int_value}); - if (row === "cryochamber") setAttrs({ship_cryochambers:Math.ceil(int_value/4), cryochamber_hull:Math.ceil(int_value/4)}); - if (row === "livingquarters") {setAttrs({living_quarters_hull:int_value})}; - if (row === "barracks") setAttrs({ship_barracks:Math.ceil(int_value/12), barracks_hull:Math.ceil(int_value/12), crew_max:int_value}); - if (row === "cargoholds") setAttrs({ship_cargoholds:Math.ceil(int_value/10), cargo_hold_hull:Math.ceil(int_value/10), cargo_max: int_value}); - if (row === "sciencelabs") setAttrs({ship_resint_bonus:Math.floor(int_value*5), science_lab_hull:int_value}); - if (row === "thrusters") { - getAttrs(["ship_thruster_hullreq","ship_thrusters"], values => { - const hullreq = parseInt(values["ship_thruster_hullreq"]) || 0; - const thrusters = parseInt(values["ship_thrusters"]) || 0; - setAttrs({thrusters_hull : hullreq + thrusters, ship_engine_thrusterreq: thrusters}); - }); - } - if (row === "fuel") { - getAttrs(["ship_fuel_min","ship_fuel_extra"], values => { - const min_fuel = parseInt(values["ship_fuel_min"]) || 0; - const extra_fuel = parseInt(values["ship_fuel_extra"]) || 0; - - setAttrs({fuel_hull: min_fuel + extra_fuel}); - }); - } - if (row === "engine") { - getAttrs(["ship_engine_hullreq","ship_engine_thrusterreq","ship_jumpdrive_modules"], values => { - const hullreq = parseInt(values["ship_engine_hullreq"]) || 0; - const thrustreq = parseInt(values["ship_engine_thrusterreq"]) || 0; - const jumpdrive = parseInt(values["ship_jumpdrive_modules"]) || 0; - - setAttrs({ship_engine:hullreq + thrustreq + jumpdrive, engine_hull: hullreq + thrustreq + jumpdrive, ship_fuel_min: (hullreq + thrustreq + jumpdrive) * 3}) - }); - } - if (row === "frame") setAttrs({frame_hull:int_value}); - -} - -const recalculateBaseHull = () => { - const base_hull_array = [ - "jump_drives_hull", - "life_support_hull", - "command_hull", - "armor_hull", - "jump_drive_hull", - "computer_hull", - "galley_hull", - "weapon_mount_hull", - "medical_bay_hull", - "cryochamber_hull", - "living_quarters_hull", - "barracks_hull", - "cargo_hold_hull", - "science_lab_hull" - ]; - - getAttrs(base_hull_array, values => { - const base_hull_int = Object.values(values).map(value => parseInt(value) || 0); - - const base_hull = base_hull_int.reduce((total, value) => total + value); - - setAttrs({ship_base_hull: base_hull, ship_thruster_hullreq: Math.ceil(base_hull / 10), ship_engine_hullreq: Math.ceil(base_hull / 20), ship_frame: Math.ceil(base_hull / 10)}); - }); -} - -const recalculateTotalHull = () => { - const total_hull_array = [ - "ship_base_hull", - "thrusters_hull", - "engine_hull", - "fuel_hull", - "frame_hull" - ]; - - getAttrs(total_hull_array, values => { - const total_hull_int = Object.values(values).map(value => parseInt(value) || 0); - const total_hull = total_hull_int.reduce((total, value) => total + value); - - setAttrs({ship_total_hull: total_hull}); - }); -} - -const calculateCombatIntelligence = (new_value) => { - const value = parseInt(new_value) || 0; - - const combat = (value * 10) + 10; - const intellect = (value * 10) + 30; - - setAttrs({combat:combat,intellect:intellect}); -} - -const calculateSpeed = (new_value) => { - const value = parseInt(new_value) || 0; - - const speed = value * 10; - - setAttrs({speed:speed}); -} - -const calculateHullCost = (new_value) => { - const value = parseInt(new_value) || 0; - - const hull = value; - const cost = value * 10; - - setAttrs({ship_cost:cost, hull: hull, hull_max: hull}); -} - -const calculateFuel = (new_value) => { - const value = parseInt(new_value) || 0; - - setAttrs({fuel:value, fuel_max:value}); -} - -const checkFuelValue = (new_value) => { - const value = parseInt(new_value) || 0; - - getAttrs(["hull_25","hull_50","hull_75"], values => { - const hull_25 = values.hull_25; - const hull_50 = values.hull_50; - const hull_75 = values.hull_75; - - let hull_toggle = ""; - - if (value <= hull_75) hull_toggle = 75; - else if (value <= hull_50) hull_toggle = 50; - else if (value <= hull_25) hull_toggle = 25; - - setAttrs({hull_toggle: hull_toggle}); - }); -} - -const calculateHullValues = () => { - getAttrs(["hull_max"], values => { - const value = parseInt(values["hull_max"]) || 0; - - const n25 = Math.floor(value * 0.75); - const n50 = Math.floor(value * 0.5); - const n75 = Math.floor(value * 0.25); - - setAttrs({ - hull_25: n25, - hull_50: n50, - hull_75: n75, - }, callback => checkFuelValue(value)); - }); -} - -const dropHandler = (values) => { - const name = values.drop_name; - const data = JSON.parse(values.drop_data) || {}; - const category = values.drop_category; - - console.log(data); - - if (name === ""|| typeof data === "" || typeof category === "") return console.warn("No drag and drop data found."); - - switch (category) { - case "Classes": - handleClassDrop(name, data); - break; - case "Items": - handleItemDrop(name, data); - break; - case "Mercenaries": - handleMercenaryDrop(name, data); - break; - case "Ships": - handleShipDrop(name, data); - break; - case "Ship Weapons": - handleShipWeaponDrop(name, data); - break; - default: - console.warn("Could not distinguish category from drop.") - break; - } - -} - -const handleItemDrop = (name, data) => { - const id = generateRowID(); - const address = `repeating_equipment_${id}_equipment`; - - let updateAttrs = {}; - - updateAttrs[`${address}_name`] = name; - updateAttrs[`${address}_notes`] = data.Description || ""; - - if (data.Damage) { - const attack_id = generateRowID(); - const attack_address = `repeating_attacks_${id}_attack` - - updateAttrs[`${address}_type`] = "Weapon"; - updateAttrs[`${address}_linkedid`] = attack_id; - - updateAttrs[`${attack_address}_linkedid`] = id; - updateAttrs[`${attack_address}_name`] = name; - updateAttrs[`${attack_address}_damage`] = data.Damage; - updateAttrs[`${attack_address}_critical_damage`] = data["Critical Damage"] || ""; - updateAttrs[`${attack_address}_critical_effect`] = data["Critical Effect"] || "-"; - - let combined_string = (data.Description) ? `${data.Description} ` : ``; - combined_string += (data.Special) ? `${data.Special} ` : ``; - - updateAttrs[`${attack_address}_notes`] = combined_string; - - const range = JSON.parse(data.Range) || {}; - - if (range && range.CQC !== "Yes") { - updateAttrs[`${attack_address}_type`] = "Ranged"; - - updateAttrs[`${attack_address}_shots`] = data.Shots; - updateAttrs[`${attack_address}_ammunition`] = data.Ammunition; - - updateAttrs[`${attack_address}_range_s`] = range.Short; - updateAttrs[`${attack_address}_range_m`] = range.Medium || "-"; - updateAttrs[`${attack_address}_range_l`] = range.Long || "-"; - - } else { - updateAttrs[`${attack_address}_type`] = "Melee"; - } - } else if (data["Armor Save"]) { - updateAttrs[`${address}_type`] = "Armor"; - updateAttrs[`${address}_armor_bonus`] = data["Armor Save"]; - } else { - updateAttrs[`${address}_type`] = "Gear"; - } - - setAttrs(updateAttrs); - -} - -const handleClassDrop = (name, data) => { - setAttrs({class:name}); - if (name) toggleClass(name,"","player"); -} - -const handleMercenaryDrop = () => { - console.warn("Mercenary drop not yet supported."); -} - -const handleMonsterDrop = () => { - console.warn("Monster drop not yet supported."); -} - -const handleShipDrop = (name, data) => { - const modules_raw = data["Required Modules"].split(",").map(item => item.trim()); - const modules_parsed = {}; - const updateAttrs = {}; - - modules_raw.forEach(module => modules_parsed[module.toLowerCase().replace(/[^a-z ]/g,"").trim().replace(/ /g,"_")] = parseInt(module.replace(/[^0-9]/g,"")) || 0); - - console.log(modules_parsed); - - updateAttrs["ship_class"] = name; - updateAttrs["ship_passengers"] = ((modules_parsed.barracks || 0) * 12) + modules_parsed.living_quarters || 1; - updateAttrs["life_support"] = modules_parsed.life_support || 1; - updateAttrs["ship_officers"] = modules_parsed.living_quarters || 0; - updateAttrs["ship_armor_modules"] = modules_parsed.armor || 0; - updateAttrs["ship_jumpdrive_modules"] = modules_parsed.jump_drive || 0; - updateAttrs["ship_computer_modules"] = modules_parsed.computer || 0; - updateAttrs["ship_galley"] = modules_parsed.galley || ""; - updateAttrs["ship_weapon_mounts"] = modules_parsed.weapon_mount || 0; - updateAttrs["ship_medbays"] = modules_parsed.medical_bays || 0; - updateAttrs["ship_cyropods"] = (modules_parsed.cryochamber * 4) || 0; - updateAttrs["ship_living_quarters"] = modules_parsed.living_quarters || 0; - updateAttrs["ship_barracks"] = modules_parsed.barracks || 0; - updateAttrs["ship_cargoholds"] = modules_parsed.cargo_hold || 0; - updateAttrs["ship_sciencelabs"] = modules_parsed.science_lab || 0; - updateAttrs["ship_thrusters"] = modules_parsed.thrusters || 0; - updateAttrs["ship_engine"] = modules_parsed.engine || 0; - - console.log(updateAttrs); - setAttrs(updateAttrs); -} - -const handleShipWeaponDrop = () => { - -} - -// EVENT HANDLERS - -skillArray.forEach(skill => on(`change:${skill}`, eventInfo => toggleSkill(skill, eventInfo.newValue))); - -on(`change:repeating_equipment:equipment_type`, eventInfo => addItem(eventInfo.newValue, eventInfo.previousValue, eventInfo.sourceAttribute, eventInfo.sourceType)); - -on(`change:class`, eventInfo => toggleClass(eventInfo.newValue, eventInfo.previousValue, eventInfo.sourceType)); - -on(`change:ship_passengers`, eventInfo => calculateRow("lifesupport", eventInfo.newValue)); -on(`change:ship_officers`, eventInfo => calculateRow("command", eventInfo.newValue)); -on(`change:ship_armor_modules`, eventInfo => calculateRow("armor", eventInfo.newValue)); -on(`change:ship_jumpdrive_modules`, eventInfo => calculateRow("jumpdrives", eventInfo.newValue)); -on(`change:ship_computer_modules`, eventInfo => calculateRow("computer", eventInfo.newValue)); -on(`change:ship_galleys`, eventInfo => calculateRow("galley", eventInfo.newValue)); -on(`change:ship_weapons`, eventInfo => calculateRow("weaponmount", eventInfo.newValue)); -on(`change:ship_medbays`, eventInfo => calculateRow("medbays", eventInfo.newValue)); -on(`change:ship_cryopods`, eventInfo => calculateRow("cryochamber", eventInfo.newValue)); -on(`change:ship_livingquarters`, eventInfo => calculateRow("livingquarters", eventInfo.newValue)); -on(`change:ship_crew`, eventInfo => calculateRow("barracks", eventInfo.newValue)); -on(`change:ship_cargo`, eventInfo => calculateRow("cargoholds", eventInfo.newValue)); -on(`change:ship_sciencelabs`, eventInfo => calculateRow("sciencelabs", eventInfo.newValue)); -on(`change:ship_thrusters change:ship_thruster_hullreq`, eventInfo => calculateRow("thrusters", eventInfo.newValue)); -on(`change:ship_fuel_extra change:ship_fuel_min`, eventInfo => calculateRow("fuel", eventInfo.newValue)); -on(`change:ship_engine_hullreq change:ship_engine_thrusterreq change:ship_jumpdrive_modules`, eventInfo => calculateRow("engine", eventInfo.newValue)); -on(`change:ship_frame`, eventInfo => calculateRow("frame", eventInfo.newValue)); - -on(`change:ship_computer_modules`, eventInfo => calculateCombatIntelligence(eventInfo.newValue)); -on(`change:ship_thrusters`, eventInfo => calculateSpeed(eventInfo.newValue)); -on(`change:ship_total_hull`, eventInfo => calculateHullCost(eventInfo.newValue)); -on(`change:fuel_hull`, eventInfo => calculateFuel(eventInfo.newValue)); - -on(`change:hull`, eventInfo => checkFuelValue(eventInfo.newValue)); -on(`change:hull_max`, eventInfo => calculateHullValues()); - -on(`clicked:startship`, eventInfo => setAttrs({shipbuild:"on"})); -on(`clicked:completeship`, eventInfo => setAttrs({shipbuild:0})); - -on(`clicked:editname_on`, eventInfo => setAttrs({npcname_toggle:"on"})); -on(`clicked:editname_off`, eventInfo => setAttrs({npcname_toggle:0})); - -on("change:drop_name", (eventInfo) => { - getAttrs(["drop_name", "drop_content", "drop_data", "drop_category"], (values) => { - dropHandler(values); - }); -}); - -["life_support_hull","command_hull","armor_hull","jump_drives_hull","computer_hull","galley_hull", -"weapon_mount_hull","medical_bay_hull","cryochamber_hull","living_quarters_hull","barracks_hull", -"cargo_hold_hull", "science_lab_hull"].forEach(hull => on(`change:${hull}`, eventInfo => recalculateBaseHull())); - +// Sheet Variables + +const skillList = { + "linguistics":{ + unlocks: ["sophontology"] + }, + "biology":{ + unlocks: ["genetics","psychology"] + }, + "first_aid": { + unlocks: ["pathology"] + }, + "hydroponics": { + unlocks: ["botany"] + }, + "geology": { + unlocks: ["planetology","asteroid_mining"] + }, + "zero-g": { + unlocks: ["asteroid_mining"] + }, + "scavenging": { + unlocks: ["asteroid_mining","jury_rigging"] + }, + "heavy_machinery": { + unlocks: ["asteroid_mining","engineering"] + }, + "computers": { + unlocks: ["engineering","hacking"] + }, + "mechanical_repair": { + unlocks: ["engineering", "jury_rigging", "vehicle_specialization"] + }, + "driving": { + unlocks: ["vehicle_specialization"] + }, + "piloting": { + unlocks: ["vehicle_specialization","astrogation"] + }, + "mathematics": { + unlocks: ["physics"] + }, + "art": { + unlocks: ["mysticism"] + }, + "archaeology": { + unlocks: ["mysticism"] + }, + "theology": { + unlocks: ["mysticism"] + }, + "military_training": { + unlocks: ["tactics","gunnery","firearms","explosives","close-quarters_combat"] + }, + "rimwise": { + unlocks: ["firearms","close-quarters_combat"] + }, + "athletics": { + unlocks: ["close-quarters_combat"] + }, + "chemistry": { + unlocks: ["explosives"] + }, + "psychology": { + unlocks: ["sophontology"] + }, + "genetics": { + unlocks: ["xenobiology"] + }, + "pathology": { + unlocks: ["xenobiology","surgery"] + }, + "botany": { + unlocks: ["xenobiology"] + }, + "planetology": { + unlocks: [] + }, + "asteroid_mining" : { + unlocks: [] + }, + "jury_rigging": { + unlocks: ["cybernetics"] + }, + "engineering": { + unlocks: ["cybernetics","robotics","artificial_intelligence"] + }, + "hacking": { + unlocks: ["artificial_intelligence"] + }, + "vehicle_specialization": { + unlocks: ["command"] + }, + "astrogation": { + unlocks: ["hyperspace"] + }, + "physics": { + unlocks: ["hyperspace"] + }, + "mysticism": { + unlocks: ["xenoesotericism", "hyperspace"] + }, + "tactics": { + unlocks: ["command"] + }, + "gunnery": { + unlocks: ["weapon_specialization"] + }, + "firearms": { + unlocks: ["weapon_specialization"] + }, + "close-quarters_combat": { + unlocks: ["weapon_specialization"] + }, + "explosives": { + unlocks: ["weapon_specialization"] + }, + "sophontology": {}, + "xenobiology": {}, + "surgery": {}, + "cybernetics": {}, + "robotics": {}, + "artificial_intelligence": {}, + "command": {}, + "hyperspace": {}, + "xenoesotericism": {}, + "weapon_specialization": {} +}; + +const skillArray = Object.keys(skillList); + +// FUNCTIONS + +const advantageToggle = (newValue) => { + +} + +const toggleSkill = (source, newValue) => { + + getAttrs(["sheet_skill_toggles"], values => { + + const existingValue = values["sheet_skill_toggles"].trim(); + const valueList = existingValue.split(" ") + const unlocks = skillList[source].unlocks || []; + + let updateAttr = ""; + + if (newValue === "0") { + + unlocks.forEach(item => valueList.splice(valueList.indexOf(item), 1)); + + updateAttr = valueList.join(" "); + + } else if (newValue === "on") { + + updateAttr = existingValue + " "; + + if (unlocks === []) return; + + unlocks.forEach(unlock => updateAttr += `${unlock} `); + + } + + setAttrs({sheet_skill_toggles:updateAttr}); + }); + +} + +const addItem = (new_value, previous_value, source, source_type) => { + if (new_value === previous_value || new_value !== "Weapon" || source_type !== "player") return; + + console.log(source_type) + + const repeating_length = "repeating_equipment_".length; + const repeating_id_length = 20; + const repeating_id = source.substring(repeating_length, repeating_length + repeating_id_length); + const repeating_equipment_prefix = `repeating_equipment_${repeating_id}`; + const new_repeating_id = generateRowID(); + const repeating_attacks_prefix = `repeating_attacks_${new_repeating_id}`; + + const requestAttrs = [`${repeating_equipment_prefix}_equipment_name`,`${repeating_equipment_prefix}_equipment_type`]; + + getAttrs(requestAttrs, values => { + const updateAttrs = {}; + + updateAttrs[`${repeating_attacks_prefix}_attack_name`] = values[`${repeating_equipment_prefix}_equipment_name`]; + updateAttrs[`${repeating_attacks_prefix}_attack_linkedid`] = repeating_id; + + setAttrs(updateAttrs); + + }); +} + +const toggleClass = (new_class, previous_class, source_type) => { + const requestAttrs = [ + "init", + "level", + "sanity", + "fear", + "body", + "armor", + "strength", + "speed", + "intellect", + "combat", + "stress_panic", + ]; + + if (source_type !== "player") return; + + const update = {}; + + update["level"] = 0; + update["xp"] = 0; + update["stress"] = 2; + update["resolve"] = 0; + update["init"] = 1; + + switch (new_class.toLowerCase()) { + case "teamster": + update["sanity"] = 30; + update["fear"] = 35; + update["body"] = 30; + update["armor"] = 35; + update["strength"] = rollDice(6) + 5; + update["speed"] = rollDice(6) + 5; + update["intellect"] = rollDice(6); + update["combat"] = rollDice(6); + update["skill_points"] = 4; + update["stress_panic"] = getTranslationByKey(["Once per session, a Teamster may re-roll a roll on the Panic Effect Table."]); + break; + case "android": + update["sanity"] = 20; + update["fear"] = 85; + update["body"] = 40; + update["armor"] = 25; + update["strength"] = rollDice(6); + update["speed"] = rollDice(6) + 5; + update["intellect"] = rollDice(6) + 5; + update["combat"] = rollDice(6); + update["skill_points"] = 2; + update["stress_panic"] = getTranslationByKey(["Fear Saves made in the presence of Androids have Disadvantage."]); + break; + case "scientist": + update["sanity"] = 40; + update["fear"] = 25; + update["body"] = 25; + update["armor"] = 30; + update["strength"] = rollDice(6); + update["speed"] = rollDice(6); + update["intellect"] = rollDice(6) + 10; + update["combat"] = rollDice(6); + update["skill_points"] = 3; + update["stress_panic"] = getTranslationByKey(["Whenever a Scientist fails a Sanity Save, every friendly player nearby gains 1 Stress."]); + break; + case "marine": + update["sanity"] = 25; + update["fear"] = 30; + update["body"] = 35; + update["armor"] = 40; + update["strength"] = rollDice(6); + update["speed"] = rollDice(6); + update["intellect"] = rollDice(6); + update["combat"] = rollDice(6) + 5; + update["skill_points"] = 3; + update["stress_panic"] = getTranslationByKey(["Whenever a Marine Panics, every friendly player nearby must make a Fear Save."]); + break; + default: + return; + } + + getAttrs(requestAttrs, values => { + + if (previous_class === new_class && values["init"] === "1") return; + + requestAttrs.forEach(attr => { + if (values[attr] !== "") update[attr] = values[attr]; + }) + + if (values["level"] === 0 || values["level"] === "") { + + const fields = [ + "level", + "sanity", + "fear", + "body", + "armor", + "stress_panic", + "stress", + "resolve", + "strength", + "speed", + "intellect", + "combat", + "skill_points", + "xp", + "init" + ]; + + const updateAttrs = {}; + + fields.forEach(field => { + const fallback = values[field] || 0; + updateAttrs[field] = (typeof field !== undefined) ? update[field] : fallback; + }); + + const hitpoints = parseInt(update["strength"]) * 2; + + updateAttrs["health"] = hitpoints; + updateAttrs["health_max"] = hitpoints; + + setAttrs(updateAttrs); + + } + + }); +} + +const rollDice = (number_of_dice) => { + let total = 0; + + for (let i = 0; i <= number_of_dice; i++) total += Math.ceil(Math.random()*10); + + return total; +} + +const calculateRow = (row, new_value) => { + + if (!row) return console.warn("Tried to update a ship row, but there wasn't a row specified"); + + const int_value = parseInt(new_value) || 0; + + if (row === "lifesupport") setAttrs({"ship_lifesupport_modules":Math.ceil(int_value/10), life_support_hull:Math.ceil(int_value/10), ship_galleys: Math.ceil(int_value/20)}); + if (row === "command") setAttrs({"ship_command_modules":Math.ceil(int_value/4), command_hull:Math.ceil(int_value/4), ship_livingquarters:int_value}); + if (row === "armor") setAttrs({armor:Math.floor(int_value*10), armor_hull:Math.floor(int_value*3)}); + if (row === "jumpdrives") { + let hull = 0; + for (let i = 1; i <= int_value; i++) hull += i; + setAttrs({jump_drives_hull:hull, ship_computer_modules:int_value}); + } + if (row === "computer") setAttrs({computer_hull:int_value}); + if (row === "galley") setAttrs({galley_hull:int_value}); + if (row === "weaponmount") setAttrs({ship_weapon_mounts:int_value, weapon_mount_hull:int_value}); + if (row === "medbays") setAttrs({ship_medint_bonus:Math.floor(int_value*5), medical_bay_hull:int_value}); + if (row === "cryochamber") setAttrs({ship_cryochambers:Math.ceil(int_value/4), cryochamber_hull:Math.ceil(int_value/4)}); + if (row === "livingquarters") {setAttrs({living_quarters_hull:int_value})}; + if (row === "barracks") setAttrs({ship_barracks:Math.ceil(int_value/12), barracks_hull:Math.ceil(int_value/12), crew_max:int_value}); + if (row === "cargoholds") setAttrs({ship_cargoholds:Math.ceil(int_value/10), cargo_hold_hull:Math.ceil(int_value/10), cargo_max: int_value}); + if (row === "sciencelabs") setAttrs({ship_resint_bonus:Math.floor(int_value*5), science_lab_hull:int_value}); + if (row === "thrusters") { + getAttrs(["ship_thruster_hullreq","ship_thrusters"], values => { + const hullreq = parseInt(values["ship_thruster_hullreq"]) || 0; + const thrusters = parseInt(values["ship_thrusters"]) || 0; + setAttrs({thrusters_hull : hullreq + thrusters, ship_engine_thrusterreq: thrusters}); + }); + } + if (row === "fuel") { + getAttrs(["ship_fuel_min","ship_fuel_extra"], values => { + const min_fuel = parseInt(values["ship_fuel_min"]) || 0; + const extra_fuel = parseInt(values["ship_fuel_extra"]) || 0; + + setAttrs({fuel_hull: min_fuel + extra_fuel}); + }); + } + if (row === "engine") { + getAttrs(["ship_engine_hullreq","ship_engine_thrusterreq","ship_jumpdrive_modules"], values => { + const hullreq = parseInt(values["ship_engine_hullreq"]) || 0; + const thrustreq = parseInt(values["ship_engine_thrusterreq"]) || 0; + const jumpdrive = parseInt(values["ship_jumpdrive_modules"]) || 0; + + setAttrs({ship_engine:hullreq + thrustreq + jumpdrive, engine_hull: hullreq + thrustreq + jumpdrive, ship_fuel_min: (hullreq + thrustreq + jumpdrive) * 3}) + }); + } + if (row === "frame") setAttrs({frame_hull:int_value}); + +} + +const recalculateBaseHull = () => { + const base_hull_array = [ + "jump_drives_hull", + "life_support_hull", + "command_hull", + "armor_hull", + "jump_drive_hull", + "computer_hull", + "galley_hull", + "weapon_mount_hull", + "medical_bay_hull", + "cryochamber_hull", + "living_quarters_hull", + "barracks_hull", + "cargo_hold_hull", + "science_lab_hull" + ]; + + getAttrs(base_hull_array, values => { + const base_hull_int = Object.values(values).map(value => parseInt(value) || 0); + + const base_hull = base_hull_int.reduce((total, value) => total + value); + + setAttrs({ship_base_hull: base_hull, ship_thruster_hullreq: Math.ceil(base_hull / 10), ship_engine_hullreq: Math.ceil(base_hull / 20), ship_frame: Math.ceil(base_hull / 10)}); + }); +} + +const recalculateTotalHull = () => { + const total_hull_array = [ + "ship_base_hull", + "thrusters_hull", + "engine_hull", + "fuel_hull", + "frame_hull" + ]; + + getAttrs(total_hull_array, values => { + const total_hull_int = Object.values(values).map(value => parseInt(value) || 0); + const total_hull = total_hull_int.reduce((total, value) => total + value); + + setAttrs({ship_total_hull: total_hull}); + }); +} + +const calculateCombatIntelligence = (new_value) => { + const value = parseInt(new_value) || 0; + + const combat = (value * 10) + 10; + const intellect = (value * 10) + 30; + + setAttrs({combat:combat,intellect:intellect}); +} + +const calculateSpeed = (new_value) => { + const value = parseInt(new_value) || 0; + + const speed = value * 10; + + setAttrs({speed:speed}); +} + +const calculateHullCost = (new_value) => { + const value = parseInt(new_value) || 0; + + const hull = value; + const cost = value * 10; + + setAttrs({ship_cost:cost, hull: hull, hull_max: hull}); +} + +const calculateFuel = (new_value) => { + const value = parseInt(new_value) || 0; + + setAttrs({fuel:value, fuel_max:value}); +} + +const checkFuelValue = (new_value) => { + const value = parseInt(new_value) || 0; + + getAttrs(["hull_25","hull_50","hull_75"], values => { + const hull_25 = values.hull_25; + const hull_50 = values.hull_50; + const hull_75 = values.hull_75; + + let hull_toggle = ""; + + if (value <= hull_75) hull_toggle = 75; + else if (value <= hull_50) hull_toggle = 50; + else if (value <= hull_25) hull_toggle = 25; + + setAttrs({hull_toggle: hull_toggle}); + }); +} + +const calculateHullValues = () => { + getAttrs(["hull_max"], values => { + const value = parseInt(values["hull_max"]) || 0; + + const n25 = Math.floor(value * 0.75); + const n50 = Math.floor(value * 0.5); + const n75 = Math.floor(value * 0.25); + + setAttrs({ + hull_25: n25, + hull_50: n50, + hull_75: n75, + }, callback => checkFuelValue(value)); + }); +} + +const dropHandler = (values) => { + const name = values.drop_name; + const data = JSON.parse(values.drop_data) || {}; + const category = values.drop_category; + + console.log(data); + + if (name === ""|| typeof data === "" || typeof category === "") return console.warn("No drag and drop data found."); + + switch (category) { + case "Classes": + handleClassDrop(name, data); + break; + case "Items": + handleItemDrop(name, data); + break; + case "Mercenaries": + handleMercenaryDrop(name, data); + break; + case "Ships": + handleShipDrop(name, data); + break; + case "Ship Weapons": + handleShipWeaponDrop(name, data); + break; + default: + console.warn("Could not distinguish category from drop.") + break; + } + +} + +const handleItemDrop = (name, data) => { + const id = generateRowID(); + const address = `repeating_equipment_${id}_equipment`; + + let updateAttrs = {}; + + updateAttrs[`${address}_name`] = name; + updateAttrs[`${address}_notes`] = data.Description || ""; + + if (data.Damage) { + const attack_id = generateRowID(); + const attack_address = `repeating_attacks_${id}_attack` + + updateAttrs[`${address}_type`] = "Weapon"; + updateAttrs[`${address}_linkedid`] = attack_id; + + updateAttrs[`${attack_address}_linkedid`] = id; + updateAttrs[`${attack_address}_name`] = name; + updateAttrs[`${attack_address}_damage`] = data.Damage; + updateAttrs[`${attack_address}_critical_damage`] = data["Critical Damage"] || ""; + updateAttrs[`${attack_address}_critical_effect`] = data["Critical Effect"] || "-"; + + let combined_string = (data.Description) ? `${data.Description} ` : ``; + combined_string += (data.Special) ? `${data.Special} ` : ``; + + updateAttrs[`${attack_address}_notes`] = combined_string; + + const range = JSON.parse(data.Range) || {}; + + if (range && range.CQC !== "Yes") { + updateAttrs[`${attack_address}_type`] = "Ranged"; + + updateAttrs[`${attack_address}_shots`] = data.Shots; + updateAttrs[`${attack_address}_ammunition`] = data.Ammunition; + + updateAttrs[`${attack_address}_range_s`] = range.Short; + updateAttrs[`${attack_address}_range_m`] = range.Medium || "-"; + updateAttrs[`${attack_address}_range_l`] = range.Long || "-"; + + } else { + updateAttrs[`${attack_address}_type`] = "Melee"; + } + } else if (data["Armor Save"]) { + updateAttrs[`${address}_type`] = "Armor"; + updateAttrs[`${address}_armor_bonus`] = data["Armor Save"]; + } else { + updateAttrs[`${address}_type`] = "Gear"; + } + + setAttrs(updateAttrs); + +} + +const handleClassDrop = (name, data) => { + setAttrs({class:name}); + if (name) toggleClass(name,"","player"); +} + +const handleMercenaryDrop = () => { + console.warn("Mercenary drop not yet supported."); +} + +const handleMonsterDrop = () => { + console.warn("Monster drop not yet supported."); +} + +const handleShipDrop = (name, data) => { + const modules_raw = data["Required Modules"].split(",").map(item => item.trim()); + const modules_parsed = {}; + const updateAttrs = {}; + + modules_raw.forEach(module => modules_parsed[module.toLowerCase().replace(/[^a-z ]/g,"").trim().replace(/ /g,"_")] = parseInt(module.replace(/[^0-9]/g,"")) || 0); + + console.log(modules_parsed); + + updateAttrs["ship_class"] = name; + updateAttrs["ship_passengers"] = ((modules_parsed.barracks || 0) * 12) + modules_parsed.living_quarters || 1; + updateAttrs["life_support"] = modules_parsed.life_support || 1; + updateAttrs["ship_officers"] = modules_parsed.living_quarters || 0; + updateAttrs["ship_armor_modules"] = modules_parsed.armor || 0; + updateAttrs["ship_jumpdrive_modules"] = modules_parsed.jump_drive || 0; + updateAttrs["ship_computer_modules"] = modules_parsed.computer || 0; + updateAttrs["ship_galley"] = modules_parsed.galley || ""; + updateAttrs["ship_weapon_mounts"] = modules_parsed.weapon_mount || 0; + updateAttrs["ship_medbays"] = modules_parsed.medical_bays || 0; + updateAttrs["ship_cyropods"] = (modules_parsed.cryochamber * 4) || 0; + updateAttrs["ship_living_quarters"] = modules_parsed.living_quarters || 0; + updateAttrs["ship_barracks"] = modules_parsed.barracks || 0; + updateAttrs["ship_cargoholds"] = modules_parsed.cargo_hold || 0; + updateAttrs["ship_sciencelabs"] = modules_parsed.science_lab || 0; + updateAttrs["ship_thrusters"] = modules_parsed.thrusters || 0; + updateAttrs["ship_engine"] = modules_parsed.engine || 0; + + console.log(updateAttrs); + setAttrs(updateAttrs); +} + +const handleShipWeaponDrop = () => { + +} + +// EVENT HANDLERS + +skillArray.forEach(skill => on(`change:${skill}`, eventInfo => toggleSkill(skill, eventInfo.newValue))); + +on(`change:repeating_equipment:equipment_type`, eventInfo => addItem(eventInfo.newValue, eventInfo.previousValue, eventInfo.sourceAttribute, eventInfo.sourceType)); + +on(`change:class`, eventInfo => toggleClass(eventInfo.newValue, eventInfo.previousValue, eventInfo.sourceType)); + +on(`change:ship_passengers`, eventInfo => calculateRow("lifesupport", eventInfo.newValue)); +on(`change:ship_officers`, eventInfo => calculateRow("command", eventInfo.newValue)); +on(`change:ship_armor_modules`, eventInfo => calculateRow("armor", eventInfo.newValue)); +on(`change:ship_jumpdrive_modules`, eventInfo => calculateRow("jumpdrives", eventInfo.newValue)); +on(`change:ship_computer_modules`, eventInfo => calculateRow("computer", eventInfo.newValue)); +on(`change:ship_galleys`, eventInfo => calculateRow("galley", eventInfo.newValue)); +on(`change:ship_weapons`, eventInfo => calculateRow("weaponmount", eventInfo.newValue)); +on(`change:ship_medbays`, eventInfo => calculateRow("medbays", eventInfo.newValue)); +on(`change:ship_cryopods`, eventInfo => calculateRow("cryochamber", eventInfo.newValue)); +on(`change:ship_livingquarters`, eventInfo => calculateRow("livingquarters", eventInfo.newValue)); +on(`change:ship_crew`, eventInfo => calculateRow("barracks", eventInfo.newValue)); +on(`change:ship_cargo`, eventInfo => calculateRow("cargoholds", eventInfo.newValue)); +on(`change:ship_sciencelabs`, eventInfo => calculateRow("sciencelabs", eventInfo.newValue)); +on(`change:ship_thrusters change:ship_thruster_hullreq`, eventInfo => calculateRow("thrusters", eventInfo.newValue)); +on(`change:ship_fuel_extra change:ship_fuel_min`, eventInfo => calculateRow("fuel", eventInfo.newValue)); +on(`change:ship_engine_hullreq change:ship_engine_thrusterreq change:ship_jumpdrive_modules`, eventInfo => calculateRow("engine", eventInfo.newValue)); +on(`change:ship_frame`, eventInfo => calculateRow("frame", eventInfo.newValue)); + +on(`change:ship_computer_modules`, eventInfo => calculateCombatIntelligence(eventInfo.newValue)); +on(`change:ship_thrusters`, eventInfo => calculateSpeed(eventInfo.newValue)); +on(`change:ship_total_hull`, eventInfo => calculateHullCost(eventInfo.newValue)); +on(`change:fuel_hull`, eventInfo => calculateFuel(eventInfo.newValue)); + +on(`change:hull`, eventInfo => checkFuelValue(eventInfo.newValue)); +on(`change:hull_max`, eventInfo => calculateHullValues()); + +on(`clicked:startship`, eventInfo => setAttrs({shipbuild:"on"})); +on(`clicked:completeship`, eventInfo => setAttrs({shipbuild:0})); + +on(`clicked:editname_on`, eventInfo => setAttrs({npcname_toggle:"on"})); +on(`clicked:editname_off`, eventInfo => setAttrs({npcname_toggle:0})); + +on("change:drop_name", (eventInfo) => { + getAttrs(["drop_name", "drop_content", "drop_data", "drop_category"], (values) => { + dropHandler(values); + }); +}); + +["life_support_hull","command_hull","armor_hull","jump_drives_hull","computer_hull","galley_hull", +"weapon_mount_hull","medical_bay_hull","cryochamber_hull","living_quarters_hull","barracks_hull", +"cargo_hold_hull", "science_lab_hull"].forEach(hull => on(`change:${hull}`, eventInfo => recalculateBaseHull())); + ["base_hull", "thrusters_hull", "engine_hull", "fuel_hull", "frame_hull"].forEach(hull => on(`change:${hull}`, eventInfo => recalculateTotalHull())); \ No newline at end of file diff --git a/Mothership Official/src/pug/mothership.pug b/Mothership Official/src/pug/mothership.pug index 349c0221fe..ac38170596 100644 --- a/Mothership Official/src/pug/mothership.pug +++ b/Mothership Official/src/pug/mothership.pug @@ -1,429 +1,429 @@ -include sheetdata.pug - -.ms-wrapper.compendium-drop-target.monsters - input(type="hidden", name="attr_sheet_toggle", value="pc") - input(type="hidden", name="attr_init", value="0") - input(type="hidden", name="attr_settings_toggle") - input.sheet-skill-toggle(type="hidden", name="attr_sheet_skill_toggles") - - input(accept="Category", name="attr_drop_category", type="hidden") - input(accept="Name", name="attr_drop_name", type="hidden") - input(accept="data", name="attr_drop_data", type="hidden") - input(accept="Content", name="attr_drop_content", type="hidden") - - label.ms-settings__toggle - input(type="checkbox", name="attr_settings_toggle") - span y - - .ms-settings - .ms-settings__row - .ms-settings__label(data-i18n="sheet type") - select.ms-settings__input(name="attr_sheet_toggle") - option(data-i18n="PC", value="pc") - option(data-i18n="NPC", value="npc") - option(data-i18n="Ship", value="ship") - .ms-settings__row--ship - .ms-settings__label(data-i18n="ship builder") - button(data-i18n="launch", name="act_startship", type="action") - - .ms-pc - .ms-header - .ms-header__logo - img(src="https://s3.amazonaws.com/files.d20.io/images/145353993/itv_F4exdWuwHavdksYfCQ/max.png?1592850121", data-i18n-title="Mothership Logo") - .ms-header__details - each field in headerfields - div(class=`ms-header__field--${field.attr}`) - .ms-header__title(data-i18n=field.label) - input.ms-header__input.ms-rounded(name=`attr_${field.attr}`, type=field.type) - .ms-skillsaves - .ms-stats - each field in toprowfields - .ms-topstat - .ms-topstat__label(data-i18n=field.attr) - input.ms-topstat__stat(placeholder=field.placeholder, name=`attr_${field.attr}`, type="number") - .ms-topstat__label--invert(data-i18n=field.subtext) - .ms-topstat--minmax - .ms-topstat__label(data-i18n="health") - .ms-topstat__minmaxwrapper - input.ms-topstat__max(name="attr_health_max", placeholder="78", type="number") - input.ms-topstat__min(name="attr_health", placeholder="78", type="number") - .ms-topstat__label--small(data-i18n="max") - .ms-topstat__label--small(data-i18n="current") - .ms-stats__main - each stat in stats - - - const roll1 = [ - `&{template:ms}`, - `{{name=${stat.attr}}}`, - `{{character_name=@{character_name}}}`, - `{{roll=[[1d100cs1cf100]]}}`, - `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, - `{{target=@{${stat.attr}}}}` - ].join(" "); - .ms-mainstat - .ms-mainstat__label - button(data-i18n=stat.attr, type="roll", value=roll1) - span.ms-tooltip - p - span(data-i18n=stat.label) - input.ms-mainstat__input(name=`attr_${stat.attr}`, type="number") - .ms-patches - h1(data-i18n="patch") - textarea.ms-patches__textarea.ms-rounded(name=`attr_patch`) - h1(data-i18n="trinket") - textarea.ms-patches__textarea.ms-rounded(name=`attr_trinket`) - .ms-saves - .ms-saves__col--left - each save in saves - - - const roll2 = [ - `&{template:ms}`, - `{{name=${save.name}}}`, - `{{character_name=@{character_name}}}`, - `{{roll=[[1d100cs1cf100]]}}`, - `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, - `{{target=@{${save.name}}}}` - ].join(" "); - .ms-saves__label - button.ms-saves__name(data-i18n=save.name, type="roll", value=roll2) - span.ms-tooltip - p - span(data-i18n=save.desc) - .ms-saves__subtext(data-i18n=save.subtext) - .ms-saves__col--right - each save in saves - .ms-saves__inputwrapper - input.ms-saves__input(name=`attr_${save.name}`, type="number") - .ms-stress_panic - .ms-stress_panic__label(data-i18n="stress & panic") - input.ms-stress_panic__input.ms-rounded(name=`attr_stress_panic`, type="text") - - .ms-skills - h1(data-i18n="skills") - .ms-skillpoints - .ms-skillpoints__label(data-i18n="skill points") - input.ms-skillpoints__input.ms-rounded(name=`attr_skill_points`, type="number") - .ms-tooltip--skills - ul - li - strong.ms-tooltip__label(data-i18n="trained skills") - span(data-i18n="cost 1 point") - li - strong.ms-tooltip__label(data-i18n="expert skills") - span(data-i18n="cost 2 points") - li - strong.ms-tooltip__label(data-i18n="master skills") - span(data-i18n="cost 3 points") - span(data-i18n="To take an Expert or Master skill you must first take one of its prerequisite skills") - .ms-skills__trained - h2(data-i18n="trained +10%") - .ms-tooltip - p(data-i18n="You’ve received standard training in this area equivalent to a bachelor's degree or on-the-job training for a couple years.") - each skill in skills.trained - - - const attr = skill.name.replace(/ /g,"_"); - const roll3 = [ - `&{template:ms}`, - `{{name=${skill.name}}}`, - `{{character_name=@{character_name}}}`, - `{{roll=[[1d100cs1cf100]]}}`, - `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, - `{{target=[[?{Attribute|Strength,@{strength}|Speed,@{speed}|Intellect,@{intellect}|Combat,@{combat}}+10]]}}` - ].join(" "); - - .ms-skill-wrapper - .ms-skill(class=`ms-skill--${attr}`) - input(name=`attr_${attr}_settings`, type="hidden") - label.ms-skill__checkmark - input(name=`attr_${attr}`, type="checkbox") - span - div.ms-skill__button - button(data-i18n=skill.name, type="roll", value=roll3) - label.ms-skill__cog - input(name=`attr_${attr}_settings`, type="checkbox") - span y - .ms-skill__settings - .ms-skill__settingsrow - .ms-skill__settingstitle(data-i18n="notes") - input.ms-skill__settingsinput(name=`attr_${attr}_notes`, type="text") - span.ms-tooltip - p - span(data-i18n=skill.desc) - fieldset(class=`repeating_trained`) - - - const roll4 = [ - `&{template:ms}`, - `{{name=@{skill_name}}}}`, - `{{character_name=@{character_name}}}`, - `{{roll=[[1d100cs1cf100]]}}`, - `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, - `{{target=[[?{Attribute|Strength,@{strength}|Speed,@{speed}|Intellect,@{intellect}|Combat,@{combat}}+10]]}}` - ].join(" "); - - .ms-skill-wrapper - .ms-skill--repeating - input(name=`attr_skill_settings`, type="hidden", value="on") - label.ms-skill__checkmark - input(name=`attr_skill_trained`, type="checkbox") - span - div.ms-skill__button - button.edit-hide(type="roll", value=roll4) - span(name="attr_skill_name") - label.ms-skill__cog - input(name=`attr_skill_settings`, type="checkbox") - span y - .ms-skill__settings - .ms-skill__settingsrow - .ms-skill__settingstitle(data-i18n="name") - input.ms-skill__settingsinput(data-i18n-title="custom skill", name="attr_skill_name", type="text") - .ms-skill__settingsrow - .ms-skill__settingstitle(data-i18n="notes") - input.ms-skill__settingsinput(name=`attr_skill_notes`, type="text") - span.ms-tooltip - span(name="attr_skill_notes") - .ms-skills__expert - h2(data-i18n="expert +15%") - .ms-tooltip - p(data-i18n="You have the equivalent of a doctorate or many years of experience.") - each skill in skills.expert - - - const attr = skill.name.replace(/ /g,"_"); - const roll5 = [ - `&{template:ms}`, - `{{name=${skill.name}}}`, - `{{character_name=@{character_name}}}`, - `{{roll=[[1d100cs1cf100]]}}`, - `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, - `{{target=[[?{Attribute|Strength,@{strength}|Speed,@{speed}|Intellect,@{intellect}|Combat,@{combat}}+15]]}}` - ].join(" "); - - .ms-skill-wrapper - .ms-skill(class=`ms-skill--${attr}`) - input(name=`attr_${attr}_settings`, type="hidden") - label.ms-skill__checkmark - input(name=`attr_${attr}`, type="checkbox") - span - div.ms-skill__button - button(data-i18n=skill.name, type="roll", value=roll5) - span(name="attr_skill_name") - label.ms-skill__cog - input(name=`attr_${attr}_settings`, type="checkbox") - span y - .ms-skill__settings - .ms-skill__settingsrow - .ms-skill__settingstitle(data-i18n="notes") - input.ms-skill__settingsinput(name=`attr_${attr}_notes`, type="text") - span.ms-tooltip - p - span(data-i18n=skill.desc) - p - strong.ms-tooltip__label(data-i18n="prerequisites") - div(data-i18n=skill.prereq.join(", ")) - - fieldset(class=`repeating_expert`) - - - const roll6 = [ - `&{template:ms}`, - `{{name=@{skill_name}}}}`, - `{{character_name=@{character_name}}}`, - `{{roll=[[1d100cs1cf100]]}}`, - `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, - `{{target=[[?{Attribute|Strength,@{strength}|Speed,@{speed}|Intellect,@{intellect}|Combat,@{combat}}+20]]}}` - ].join(" "); - - .ms-skill-wrapper - .ms-skill--repeating - input(name=`attr_skill_settings`, type="hidden", value="on") - label.ms-skill__checkmark - input(name=`attr_skill_trained`, type="checkbox") - span - div.ms-skill__button - button.edit-hide(type="roll", value=roll6) - span(name="attr_skill_name") - label.ms-skill__cog - input(name=`attr_skill_settings`, type="checkbox") - span y - .ms-skill__settings - .ms-skill__settingsrow - .ms-skill__settingstitle(data-i18n="name") - input.ms-skill__settingsinput(data-i18n-value="custom skill", name="attr_skill_name", type="text") - .ms-skill__settingsrow - .ms-skill__settingstitle(data-i18n="notes") - input.ms-skill__settingsinput(name=`attr_skill_notes`, type="text") - span.ms-tooltip - span(name="attr_skill_notes") - - .ms-skills__master - h2(data-i18n="master +20%") - .ms-tooltip - p(data-i18n="You are one of the luminaries of this field and are aware of cutting edge techniques or highly specialized and niche information.") - each skill in skills.master - - - const attr = skill.name.replace(/ /g,"_"); - const roll7 = [ - `&{template:ms}`, - `{{name=${skill.name}}}`, - `{{character_name=@{character_name}}}`, - `{{roll=[[1d100cs1cf100]]}}`, - `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, - `{{target=[[?{Attribute|Strength,@{strength}|Speed,@{speed}|Intellect,@{intellect}|Combat,@{combat}}+20]]}}` - ].join(" "); - - .ms-skill-wrapper - .ms-skill(class=`ms-skill--${attr}`) - input(name=`attr_${attr}_settings`, type="hidden") - label.ms-skill__checkmark - input(name=`attr_${attr}`, type="checkbox") - span - div.ms-skill__button - button(data-i18n=skill.name, type="roll", value=roll7) - label.ms-skill__cog - input(name=`attr_${attr}_settings`, type="checkbox") - span y - .ms-skill__settings - .ms-skill__settingsrow - .ms-skill__settingstitle(data-i18n="notes") - input.ms-skill__settingsinput(name=`attr_${attr}_notes`, type="text") - span.ms-tooltip - p - span(data-i18n=skill.desc) - p - strong.ms-tooltip__label(data-i18n="prerequisites") - div(data-i18n=skill.prereq.join(", ")) - fieldset(class=`repeating_master`) - - - const roll8 = [ - `&{template:ms}`, - `{{name=@{skill_name}}}}`, - `{{character_name=@{character_name}}}`, - `{{roll=[[1d100cs1cf100]]}}`, - `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, - `{{target=[[?{Attribute|Strength,@{strength}|Speed,@{speed}|Intellect,@{intellect}|Combat,@{combat}}+20]]}}` - ].join(" "); - - .ms-skill-wrapper - .ms-skill--repeating - input(name=`attr_skill_settings`, type="hidden", value="on") - label.ms-skill__checkmark - input(name=`attr_skill_trained`, type="checkbox") - span - div.ms-skill__button - button.edit-hide(type="roll", value=roll8) - span(name="attr_skill_name") - label.ms-skill__cog - input(name=`attr_skill_settings`, type="checkbox") - span y - .ms-skill__settings - .ms-skill__settingsrow - .ms-skill__settingstitle(data-i18n="name") - input.ms-skill__settingsinput(data-i18n-value="custom skill", name="attr_skill_name", type="text") - .ms-skill__settingsrow - .ms-skill__settingstitle(data-i18n="notes") - input.ms-skill__settingsinput(name=`attr_skill_notes`, type="text") - span.ms-tooltip - span(name="attr_skill_notes") - .ms-gear - .ms-equipment - h1(data-i18n="equipment") - .ms-equipmentrow--head - .ms-equipmentrow__name--head(data-i18n="item") - .ms-equipmentrow__type--head(data-i18n="type") - fieldset(class=`repeating_equipment`) - .ms-equipmentrow - input(name=`attr_equipment_settings`, type="hidden", value="on") - input(name=`attr_equipment_linkedid`, type="hidden") - input.ms-equipmentrow__name(name=`attr_equipment_name`, type="text") - input.ms-equipmentrow__type(name=`attr_equipment_type`, type="hidden") - select.ms-equipmentrow__type(name=`attr_equipment_type`) - option(data-i18n="Gear") - option(data-i18n="Weapon") - option(data-i18n="Ammunition") - option(data-i18n="Armor") - option(data-i18n="Patch") - option(data-i18n="Trinket") - option(data-i18n="Other") - label.ms-equipmentrow__cog - input(name=`attr_equipment_settings`, type="checkbox", checked) - span y - .ms-equipmentrow__settings - .ms-equipmentrow__settingsrow--full.show_armor - .ms-equipmentrow__settingstitle(data-i18n="armor bonus") - input.ms-equipmentrow__settingsinput(name="attr_equipment_armor_bonus", type="text") - .ms-equipmentrow__settingsrow--full - .ms-equipmentrow__settingstitle(data-i18n="notes") - textarea.ms-equipmentrow__textarea(name="attr_equipment_notes") - - .ms-credits - .ms-credits__label(data-i18n="credits") - input.ms-credits__input.ms-rounded(name=`attr_credits`, type="text") - - .ms-attacks - h1(data-i18n="attacks") - .ms-attackrow--head - .ms-attackrow__name--head(data-i18n="attack") - .ms-attackrow__type--head(data-i18n="type") - .ms-attackrow__type--head(data-i18n="damage") - fieldset(class=`repeating_attacks`) - - - const roll9 = [ - `&{template:ms}`, - `{{name=@{attack_name}}}`, - `{{character_name=@{character_name}}}`, - `{{roll=[[1d100cs1cf100]]}}`, - `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, - `{{target=[[@{combat}]]}}`, - `{{ranges=@{attack_range_s}}}`, - `{{rangem=@{attack_range_m}}}`, - `{{rangel=@{attack_range_l}}}`, - `{{damage=[[@{attack_damage}]]}}` - ].join(" "); - .ms-attackrow - input(name=`attr_attack_settings`, type="hidden", value="on") - input(name=`attr_attack_linkedid`, type="hidden") - button.ms-attackrow__name(type="roll", value=roll9) - span(name=`attr_attack_name`, type="text") - input.ms-attackrow__skill(name=`attr_attack_type`, type="hidden") - select.ms-attackrow__skill(name=`attr_attack_type`) - option(data-i18n="Ranged") - option(data-i18n="Melee") - input.ms-attackrow__damage(name=`attr_attack_damage`, type="text") - label.ms-attackrow__cog - input(name=`attr_attack_settings`, type="checkbox", checked) - span y - .ms-attackrow__settings - .ms-attackrow__settingsrow--full - .ms-attackrow__settingstitle(data-i18n="name") - input.ms-attackrow__settingsinput(data-i18n-value="custom skill", name="attr_attack_name", type="text") - .ms-attackrow__settingsrow--range.show_ranged - .ms-attackrow__settingstitle(data-i18n="range") - input.ms-attackrow__settingsinput(data-i18n-placeholder="short", name="attr_attack_range_s", type="text") - input.ms-attackrow__settingsinput(data-i18n-placeholder="medium", name="attr_attack_range_m", type="text") - input.ms-attackrow__settingsinput(data-i18n-placeholder="long", name="attr_attack_range_l", type="text") - .ms-attackrow__settingsrow - div - .ms-attackrow__settingstitle(data-i18n="critical damage") - input.ms-attackrow__settingsinput(data-i18n-placeholder="damage", name="attr_attack_crit_damage", type="text") - div - .ms-attackrow__settingstitle(data-i18n="critical effect") - input.ms-attackrow__settingsinput(data-i18n-placeholder="effect", name="attr_attack_crit_effect", type="text") - .ms-attackrow__settingsrow - div - .ms-attackrow__settingstitle(data-i18n="shots") - input.ms-attackrow__settingsinput(data-i18n-placeholder="shots", name="attr_attack_shots", type="text") - div - .ms-attackrow__settingstitle(data-i18n="ammunition") - input.ms-attackrow__settingsinput(data-i18n-placeholder="damage", name="attr_attack_ammunition", type="text") - .ms-attackrow__settingsrow--full - .ms-attackrow__settingstitle(data-i18n="notes") - textarea.ms-sattackrow__textarea(name="attr_attack_notes") - .ms-ship - include shipsheet.pug - - .ms-npc - include npc.pug - -include rolltemplates.pug - -script(type="text/worker") - +include sheetdata.pug + +.ms-wrapper.compendium-drop-target.monsters + input(type="hidden", name="attr_sheet_toggle", value="pc") + input(type="hidden", name="attr_init", value="0") + input(type="hidden", name="attr_settings_toggle") + input.sheet-skill-toggle(type="hidden", name="attr_sheet_skill_toggles") + + input(accept="Category", name="attr_drop_category", type="hidden") + input(accept="Name", name="attr_drop_name", type="hidden") + input(accept="data", name="attr_drop_data", type="hidden") + input(accept="Content", name="attr_drop_content", type="hidden") + + label.ms-settings__toggle + input(type="checkbox", name="attr_settings_toggle") + span y + + .ms-settings + .ms-settings__row + .ms-settings__label(data-i18n="sheet type") + select.ms-settings__input(name="attr_sheet_toggle") + option(data-i18n="PC", value="pc") + option(data-i18n="NPC", value="npc") + option(data-i18n="Ship", value="ship") + .ms-settings__row--ship + .ms-settings__label(data-i18n="ship builder") + button(data-i18n="launch", name="act_startship", type="action") + + .ms-pc + .ms-header + .ms-header__logo + img(src="https://s3.amazonaws.com/files.d20.io/images/145353993/itv_F4exdWuwHavdksYfCQ/max.png?1592850121", data-i18n-title="Mothership Logo") + .ms-header__details + each field in headerfields + div(class=`ms-header__field--${field.attr}`) + .ms-header__title(data-i18n=field.label) + input.ms-header__input.ms-rounded(name=`attr_${field.attr}`, type=field.type) + .ms-skillsaves + .ms-stats + each field in toprowfields + .ms-topstat + .ms-topstat__label(data-i18n=field.attr) + input.ms-topstat__stat(placeholder=field.placeholder, name=`attr_${field.attr}`, type="number") + .ms-topstat__label--invert(data-i18n=field.subtext) + .ms-topstat--minmax + .ms-topstat__label(data-i18n="health") + .ms-topstat__minmaxwrapper + input.ms-topstat__max(name="attr_health_max", placeholder="78", type="number") + input.ms-topstat__min(name="attr_health", placeholder="78", type="number") + .ms-topstat__label--small(data-i18n="max") + .ms-topstat__label--small(data-i18n="current") + .ms-stats__main + each stat in stats + - + const roll1 = [ + `&{template:ms}`, + `{{name=${stat.attr}}}`, + `{{character_name=@{character_name}}}`, + `{{roll=[[1d100cs1cf100]]}}`, + `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, + `{{target=@{${stat.attr}}}}` + ].join(" "); + .ms-mainstat + .ms-mainstat__label + button(data-i18n=stat.attr, type="roll", value=roll1) + span.ms-tooltip + p + span(data-i18n=stat.label) + input.ms-mainstat__input(name=`attr_${stat.attr}`, type="number") + .ms-patches + h1(data-i18n="patch") + textarea.ms-patches__textarea.ms-rounded(name=`attr_patch`) + h1(data-i18n="trinket") + textarea.ms-patches__textarea.ms-rounded(name=`attr_trinket`) + .ms-saves + .ms-saves__col--left + each save in saves + - + const roll2 = [ + `&{template:ms}`, + `{{name=${save.name}}}`, + `{{character_name=@{character_name}}}`, + `{{roll=[[1d100cs1cf100]]}}`, + `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, + `{{target=@{${save.name}}}}` + ].join(" "); + .ms-saves__label + button.ms-saves__name(data-i18n=save.name, type="roll", value=roll2) + span.ms-tooltip + p + span(data-i18n=save.desc) + .ms-saves__subtext(data-i18n=save.subtext) + .ms-saves__col--right + each save in saves + .ms-saves__inputwrapper + input.ms-saves__input(name=`attr_${save.name}`, type="number") + .ms-stress_panic + .ms-stress_panic__label(data-i18n="stress & panic") + input.ms-stress_panic__input.ms-rounded(name=`attr_stress_panic`, type="text") + + .ms-skills + h1(data-i18n="skills") + .ms-skillpoints + .ms-skillpoints__label(data-i18n="skill points") + input.ms-skillpoints__input.ms-rounded(name=`attr_skill_points`, type="number") + .ms-tooltip--skills + ul + li + strong.ms-tooltip__label(data-i18n="trained skills") + span(data-i18n="cost 1 point") + li + strong.ms-tooltip__label(data-i18n="expert skills") + span(data-i18n="cost 2 points") + li + strong.ms-tooltip__label(data-i18n="master skills") + span(data-i18n="cost 3 points") + span(data-i18n="To take an Expert or Master skill you must first take one of its prerequisite skills") + .ms-skills__trained + h2(data-i18n="trained +10%") + .ms-tooltip + p(data-i18n="You’ve received standard training in this area equivalent to a bachelor's degree or on-the-job training for a couple years.") + each skill in skills.trained + - + const attr = skill.name.replace(/ /g,"_"); + const roll3 = [ + `&{template:ms}`, + `{{name=${skill.name}}}`, + `{{character_name=@{character_name}}}`, + `{{roll=[[1d100cs1cf100]]}}`, + `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, + `{{target=[[?{Attribute|Strength,@{strength}|Speed,@{speed}|Intellect,@{intellect}|Combat,@{combat}}+10]]}}` + ].join(" "); + + .ms-skill-wrapper + .ms-skill(class=`ms-skill--${attr}`) + input(name=`attr_${attr}_settings`, type="hidden") + label.ms-skill__checkmark + input(name=`attr_${attr}`, type="checkbox") + span + div.ms-skill__button + button(data-i18n=skill.name, type="roll", value=roll3) + label.ms-skill__cog + input(name=`attr_${attr}_settings`, type="checkbox") + span y + .ms-skill__settings + .ms-skill__settingsrow + .ms-skill__settingstitle(data-i18n="notes") + input.ms-skill__settingsinput(name=`attr_${attr}_notes`, type="text") + span.ms-tooltip + p + span(data-i18n=skill.desc) + fieldset(class=`repeating_trained`) + - + const roll4 = [ + `&{template:ms}`, + `{{name=@{skill_name}}}}`, + `{{character_name=@{character_name}}}`, + `{{roll=[[1d100cs1cf100]]}}`, + `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, + `{{target=[[?{Attribute|Strength,@{strength}|Speed,@{speed}|Intellect,@{intellect}|Combat,@{combat}}+10]]}}` + ].join(" "); + + .ms-skill-wrapper + .ms-skill--repeating + input(name=`attr_skill_settings`, type="hidden", value="on") + label.ms-skill__checkmark + input(name=`attr_skill_trained`, type="checkbox") + span + div.ms-skill__button + button.edit-hide(type="roll", value=roll4) + span(name="attr_skill_name") + label.ms-skill__cog + input(name=`attr_skill_settings`, type="checkbox") + span y + .ms-skill__settings + .ms-skill__settingsrow + .ms-skill__settingstitle(data-i18n="name") + input.ms-skill__settingsinput(data-i18n-title="custom skill", name="attr_skill_name", type="text") + .ms-skill__settingsrow + .ms-skill__settingstitle(data-i18n="notes") + input.ms-skill__settingsinput(name=`attr_skill_notes`, type="text") + span.ms-tooltip + span(name="attr_skill_notes") + .ms-skills__expert + h2(data-i18n="expert +15%") + .ms-tooltip + p(data-i18n="You have the equivalent of a doctorate or many years of experience.") + each skill in skills.expert + - + const attr = skill.name.replace(/ /g,"_"); + const roll5 = [ + `&{template:ms}`, + `{{name=${skill.name}}}`, + `{{character_name=@{character_name}}}`, + `{{roll=[[1d100cs1cf100]]}}`, + `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, + `{{target=[[?{Attribute|Strength,@{strength}|Speed,@{speed}|Intellect,@{intellect}|Combat,@{combat}}+15]]}}` + ].join(" "); + + .ms-skill-wrapper + .ms-skill(class=`ms-skill--${attr}`) + input(name=`attr_${attr}_settings`, type="hidden") + label.ms-skill__checkmark + input(name=`attr_${attr}`, type="checkbox") + span + div.ms-skill__button + button(data-i18n=skill.name, type="roll", value=roll5) + span(name="attr_skill_name") + label.ms-skill__cog + input(name=`attr_${attr}_settings`, type="checkbox") + span y + .ms-skill__settings + .ms-skill__settingsrow + .ms-skill__settingstitle(data-i18n="notes") + input.ms-skill__settingsinput(name=`attr_${attr}_notes`, type="text") + span.ms-tooltip + p + span(data-i18n=skill.desc) + p + strong.ms-tooltip__label(data-i18n="prerequisites") + div(data-i18n=skill.prereq.join(", ")) + + fieldset(class=`repeating_expert`) + - + const roll6 = [ + `&{template:ms}`, + `{{name=@{skill_name}}}}`, + `{{character_name=@{character_name}}}`, + `{{roll=[[1d100cs1cf100]]}}`, + `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, + `{{target=[[?{Attribute|Strength,@{strength}|Speed,@{speed}|Intellect,@{intellect}|Combat,@{combat}}+20]]}}` + ].join(" "); + + .ms-skill-wrapper + .ms-skill--repeating + input(name=`attr_skill_settings`, type="hidden", value="on") + label.ms-skill__checkmark + input(name=`attr_skill_trained`, type="checkbox") + span + div.ms-skill__button + button.edit-hide(type="roll", value=roll6) + span(name="attr_skill_name") + label.ms-skill__cog + input(name=`attr_skill_settings`, type="checkbox") + span y + .ms-skill__settings + .ms-skill__settingsrow + .ms-skill__settingstitle(data-i18n="name") + input.ms-skill__settingsinput(data-i18n-value="custom skill", name="attr_skill_name", type="text") + .ms-skill__settingsrow + .ms-skill__settingstitle(data-i18n="notes") + input.ms-skill__settingsinput(name=`attr_skill_notes`, type="text") + span.ms-tooltip + span(name="attr_skill_notes") + + .ms-skills__master + h2(data-i18n="master +20%") + .ms-tooltip + p(data-i18n="You are one of the luminaries of this field and are aware of cutting edge techniques or highly specialized and niche information.") + each skill in skills.master + - + const attr = skill.name.replace(/ /g,"_"); + const roll7 = [ + `&{template:ms}`, + `{{name=${skill.name}}}`, + `{{character_name=@{character_name}}}`, + `{{roll=[[1d100cs1cf100]]}}`, + `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, + `{{target=[[?{Attribute|Strength,@{strength}|Speed,@{speed}|Intellect,@{intellect}|Combat,@{combat}}+20]]}}` + ].join(" "); + + .ms-skill-wrapper + .ms-skill(class=`ms-skill--${attr}`) + input(name=`attr_${attr}_settings`, type="hidden") + label.ms-skill__checkmark + input(name=`attr_${attr}`, type="checkbox") + span + div.ms-skill__button + button(data-i18n=skill.name, type="roll", value=roll7) + label.ms-skill__cog + input(name=`attr_${attr}_settings`, type="checkbox") + span y + .ms-skill__settings + .ms-skill__settingsrow + .ms-skill__settingstitle(data-i18n="notes") + input.ms-skill__settingsinput(name=`attr_${attr}_notes`, type="text") + span.ms-tooltip + p + span(data-i18n=skill.desc) + p + strong.ms-tooltip__label(data-i18n="prerequisites") + div(data-i18n=skill.prereq.join(", ")) + fieldset(class=`repeating_master`) + - + const roll8 = [ + `&{template:ms}`, + `{{name=@{skill_name}}}}`, + `{{character_name=@{character_name}}}`, + `{{roll=[[1d100cs1cf100]]}}`, + `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, + `{{target=[[?{Attribute|Strength,@{strength}|Speed,@{speed}|Intellect,@{intellect}|Combat,@{combat}}+20]]}}` + ].join(" "); + + .ms-skill-wrapper + .ms-skill--repeating + input(name=`attr_skill_settings`, type="hidden", value="on") + label.ms-skill__checkmark + input(name=`attr_skill_trained`, type="checkbox") + span + div.ms-skill__button + button.edit-hide(type="roll", value=roll8) + span(name="attr_skill_name") + label.ms-skill__cog + input(name=`attr_skill_settings`, type="checkbox") + span y + .ms-skill__settings + .ms-skill__settingsrow + .ms-skill__settingstitle(data-i18n="name") + input.ms-skill__settingsinput(data-i18n-value="custom skill", name="attr_skill_name", type="text") + .ms-skill__settingsrow + .ms-skill__settingstitle(data-i18n="notes") + input.ms-skill__settingsinput(name=`attr_skill_notes`, type="text") + span.ms-tooltip + span(name="attr_skill_notes") + .ms-gear + .ms-equipment + h1(data-i18n="equipment") + .ms-equipmentrow--head + .ms-equipmentrow__name--head(data-i18n="item") + .ms-equipmentrow__type--head(data-i18n="type") + fieldset(class=`repeating_equipment`) + .ms-equipmentrow + input(name=`attr_equipment_settings`, type="hidden", value="on") + input(name=`attr_equipment_linkedid`, type="hidden") + input.ms-equipmentrow__name(name=`attr_equipment_name`, type="text") + input.ms-equipmentrow__type(name=`attr_equipment_type`, type="hidden") + select.ms-equipmentrow__type(name=`attr_equipment_type`) + option(data-i18n="Gear") + option(data-i18n="Weapon") + option(data-i18n="Ammunition") + option(data-i18n="Armor") + option(data-i18n="Patch") + option(data-i18n="Trinket") + option(data-i18n="Other") + label.ms-equipmentrow__cog + input(name=`attr_equipment_settings`, type="checkbox", checked) + span y + .ms-equipmentrow__settings + .ms-equipmentrow__settingsrow--full.show_armor + .ms-equipmentrow__settingstitle(data-i18n="armor bonus") + input.ms-equipmentrow__settingsinput(name="attr_equipment_armor_bonus", type="text") + .ms-equipmentrow__settingsrow--full + .ms-equipmentrow__settingstitle(data-i18n="notes") + textarea.ms-equipmentrow__textarea(name="attr_equipment_notes") + + .ms-credits + .ms-credits__label(data-i18n="credits") + input.ms-credits__input.ms-rounded(name=`attr_credits`, type="text") + + .ms-attacks + h1(data-i18n="attacks") + .ms-attackrow--head + .ms-attackrow__name--head(data-i18n="attack") + .ms-attackrow__type--head(data-i18n="type") + .ms-attackrow__type--head(data-i18n="damage") + fieldset(class=`repeating_attacks`) + - + const roll9 = [ + `&{template:ms}`, + `{{name=@{attack_name}}}`, + `{{character_name=@{character_name}}}`, + `{{roll=[[1d100cs1cf100]]}}`, + `{{roll2=[[?{Advantage/Disadvantage|Normal,0|Advantage/Disadvantage,1d100cs1cf100}]]}}`, + `{{target=[[@{combat}]]}}`, + `{{ranges=@{attack_range_s}}}`, + `{{rangem=@{attack_range_m}}}`, + `{{rangel=@{attack_range_l}}}`, + `{{damage=[[@{attack_damage}]]}}` + ].join(" "); + .ms-attackrow + input(name=`attr_attack_settings`, type="hidden", value="on") + input(name=`attr_attack_linkedid`, type="hidden") + button.ms-attackrow__name(type="roll", value=roll9) + span(name=`attr_attack_name`, type="text") + input.ms-attackrow__skill(name=`attr_attack_type`, type="hidden") + select.ms-attackrow__skill(name=`attr_attack_type`) + option(data-i18n="Ranged") + option(data-i18n="Melee") + input.ms-attackrow__damage(name=`attr_attack_damage`, type="text") + label.ms-attackrow__cog + input(name=`attr_attack_settings`, type="checkbox", checked) + span y + .ms-attackrow__settings + .ms-attackrow__settingsrow--full + .ms-attackrow__settingstitle(data-i18n="name") + input.ms-attackrow__settingsinput(data-i18n-value="custom skill", name="attr_attack_name", type="text") + .ms-attackrow__settingsrow--range.show_ranged + .ms-attackrow__settingstitle(data-i18n="range") + input.ms-attackrow__settingsinput(data-i18n-placeholder="short", name="attr_attack_range_s", type="text") + input.ms-attackrow__settingsinput(data-i18n-placeholder="medium", name="attr_attack_range_m", type="text") + input.ms-attackrow__settingsinput(data-i18n-placeholder="long", name="attr_attack_range_l", type="text") + .ms-attackrow__settingsrow + div + .ms-attackrow__settingstitle(data-i18n="critical damage") + input.ms-attackrow__settingsinput(data-i18n-placeholder="damage", name="attr_attack_crit_damage", type="text") + div + .ms-attackrow__settingstitle(data-i18n="critical effect") + input.ms-attackrow__settingsinput(data-i18n-placeholder="effect", name="attr_attack_crit_effect", type="text") + .ms-attackrow__settingsrow + div + .ms-attackrow__settingstitle(data-i18n="shots") + input.ms-attackrow__settingsinput(data-i18n-placeholder="shots", name="attr_attack_shots", type="text") + div + .ms-attackrow__settingstitle(data-i18n="ammunition") + input.ms-attackrow__settingsinput(data-i18n-placeholder="damage", name="attr_attack_ammunition", type="text") + .ms-attackrow__settingsrow--full + .ms-attackrow__settingstitle(data-i18n="notes") + textarea.ms-sattackrow__textarea(name="attr_attack_notes") + .ms-ship + include shipsheet.pug + + .ms-npc + include npc.pug + +include rolltemplates.pug + +script(type="text/worker") + include ../js/sheetworkers.js \ No newline at end of file diff --git a/Mothership Official/src/pug/rolltemplates.pug b/Mothership Official/src/pug/rolltemplates.pug index 411c559a64..48f4eb5fd7 100644 --- a/Mothership Official/src/pug/rolltemplates.pug +++ b/Mothership Official/src/pug/rolltemplates.pug @@ -1,28 +1,28 @@ -rolltemplate.sheet-rolltemplate-ms - .sheet-ms-container - | {{#name}} - h1 {{name}} - | {{/name}} - | {{#character_name}} - h2 {{character_name}} - | {{/character_name}} - | {{#roll}} - .sheet-ms-roll - .sheet-ms-roll__roll {{roll}} - | {{#rollGreater() roll2 0}} - .sheet-ms-roll__roll2 {{roll2}} - | {{/rollGreater() roll2 0}} - | {{#target}} - .sheet-ms-target - .sheet-ms-target__label(data-i18n="target:") - .sheet-ms-target__value {{target}} - | {{/target}} - | {{/roll}} - | {{#damage}} - .sheet-ms-damage - .sheet-ms-damage__label(data-i18n="damage:") - .sheet-ms-damage__value {{damage}} - | {{/damage}} - | {{#notes}} - .sheet-ms-notes {{notes}} +rolltemplate.sheet-rolltemplate-ms + .sheet-ms-container + | {{#name}} + h1 {{name}} + | {{/name}} + | {{#character_name}} + h2 {{character_name}} + | {{/character_name}} + | {{#roll}} + .sheet-ms-roll + .sheet-ms-roll__roll {{roll}} + | {{#rollGreater() roll2 0}} + .sheet-ms-roll__roll2 {{roll2}} + | {{/rollGreater() roll2 0}} + | {{#target}} + .sheet-ms-target + .sheet-ms-target__label(data-i18n="target:") + .sheet-ms-target__value {{target}} + | {{/target}} + | {{/roll}} + | {{#damage}} + .sheet-ms-damage + .sheet-ms-damage__label(data-i18n="damage:") + .sheet-ms-damage__value {{damage}} + | {{/damage}} + | {{#notes}} + .sheet-ms-notes {{notes}} | {{/notes}} \ No newline at end of file diff --git a/Mothership Official/src/pug/sheetdata.pug b/Mothership Official/src/pug/sheetdata.pug index f565a8925f..ed548a28b9 100644 --- a/Mothership Official/src/pug/sheetdata.pug +++ b/Mothership Official/src/pug/sheetdata.pug @@ -1,660 +1,660 @@ -- - - const headerfields = [{label: "name", attr: "character_name", type: "text"},{label: "level", attr: "level", type: "number"},{label: "rank / title", attr: "rank_title", type: "text"},{label: "XP", attr: "xp", type: "text"},{label: "class", attr: "class", type: "text"}]; - - const toprowfields = [{attr:"stress",subtext:"starts at 2",placeholder:"2"},{attr:"resolve",subtext:"starts at 0",placeholder:"0"}]; - - const stats = [ - { - attr:"strength", - label:"How able-bodied you are. Lifting, pushing, hitting things hard, etc." - }, - { - attr:"speed", - label:"How quickly you can act and react under pressure." - }, - { - attr:"intellect", - label:"How knowledgeable and experienced you are." - }, - { - attr:"combat", - label:"How good you are at fighting." - } - ] - - const saves = [ - { - name:"sanity", - subtext:"rationalization, logic", - desc:"Sanity is your ability to explain away logical inconsistencies in the universe, rationalize and make sense out of chaos, detect illusions and mimicry and think quickly under pressure." - }, - { - name:"fear", - subtext:"surprise, loneliness", - desc:"Fear is how well you can cope with emotional trauma, and covers not only fear, but also loneliness, depression or any other emotional surge." - }, - { - name:"body", - subtext:"hunger, disease, infection", - desc:"Body is your reflexes, and how well you can resist hunger, disease or any other organism that might attempt to invade your insides." - }, - { - name:"armor", - subtext:"physical damage", - desc:"Armor is how resistant you ae to damage sustained during combat, whether that be through bullets, claws, teeth, etc." - } - ]; - - const skills = { - trained: [ - { - name: "linguistics", - desc: "Study of language" - }, - { - name: "biology", - desc: "Study of life" - }, - { - name: "first aid", - desc: "Emergency medical care and treatment" - }, - { - name: "hydroponics", - desc: "Growing plants in nutrient solutions without soil (farming in space)" - }, - { - name: "geology", - desc: "The solid features of any terrestrial planet or natural satellite" - }, - { - name: "zero-g", - desc: "Working in a vaccuum, vaccsuits, etc." - }, - { - name: "scavenging", - desc: "Searching discarded wastes for useful items" - }, - { - name: "heavy machinery", - desc: "Operation and use of large pieces of equipment (cranes, exosuits, forkliftsm etc.)" - }, - { - name: "computers", - desc: "Fluent use of computers and networks" - }, - { - name: "mechanical repair", - desc: "Fixing broken machines" - }, - { - name: "driving", - desc: "Operation and control of motor vehicles" - }, - { - name: "piloting", - desc: "Operation and control of air and spacecraft" - }, - { - name: "mathematics", - desc: "The science of numbers, quantity, and space" - }, - { - name: "art", - desc: "The expression or application of a species' creative ability and imagination" - }, - { - name: "archaeology", - desc: "Ancient cultures and their artifacts" - }, - { - name: "theology", - desc: "Study of religion" - }, - { - name: "military training", - desc: "Standard basic training given to all military personnel" - }, - { - name: "rimwise", - desc: "Outer rim colonies and seedy parts of the galaxy" - }, - { - name: "athletics", - desc: "Physical sports and games" - }, - { - name: "chemistry", - desc: "The identification of the substances of which matter is composed" - }, - ], - expert: [ - { - name: "psychology", - prereq: ["biology"], - desc: "The study of behavior and the human mind" - }, - { - name: "genetics", - prereq: ["biology"], - desc: "Heredity and the variation of the inherited characteristics" - }, - { - name: "pathology", - prereq: ["first aid"], - desc: "Study of the cause and effect of disease" - }, - { - name: "botany", - prereq: ["hydroponics"], - desc: "The study of plant life" - }, - { - name: "planetology", - prereq: ["geology"], - desc: "Study of planets and other celestial body" - }, - { - name: "asteroid mining", - prereq: ["geology","zero-g","heavy machinery","scavenging"], - desc: "Training in the tools and procedures used in mining asteroids" - }, - { - name: "jury rigging", - prereq: ["scavenging","mechanical repair"], - desc: "Makeshift repairs" - }, - { - name: "engineering", - prereq: ["heavy machinery","computers","mechanical repair"], - desc: "Design, building, and use of engines, machines, and structures" - }, - { - name: "hacking", - prereq: ["computers"], - desc: "Unauthorized access to computer systems" - }, - { - name: "vehicle specialization", - prereq: ["mechanical repair","piloting","driving"], - desc: "Specific vehicle class" - }, - { - name: "astrogation", - prereq: ["piloting"], - desc: "Navigation in outer space" - }, - { - name: "physics", - prereq: ["mathematics"], - desc: "Study of nature and properties of matter and energy" - }, - { - name: "mysticism", - prereq: ["art","archaeology","theology"], - desc: "Spiritual apprehension of hidden knowledge" - }, - { - name: "tactics", - prereq: ["military training"], - desc: "Manuevering military forces in battle" - }, - { - name: "gunnery", - prereq: ["military training"], - desc: "Starship weaponry" - }, - { - name: "firearms", - prereq: ["military training","rimwise"], - desc: "Guns and their use" - }, - { - name: "close-quarters combat", - prereq: ["athletics","military training","rimwise"], - desc: "Hand-tohand, melee fighting" - }, - { - name: "explosives", - prereq: ["military training","chemistry"], - desc: "Bombs and incendiary devices" - }, - ], - master: [ - { - name: "sophontology", - prereq: ["linguistics", "psychology"], - desc: "Alien psychology" - }, - { - name: "xenobiology", - prereq: ["genetics","botany","pathology"], - desc: "Alien biology" - }, - { - name: "surgery", - prereq: ["pathology"], - desc: "Medical speciality involving manual operation" - }, - { - name: "cybernetics", - prereq: ["jury rigging","engineering"], - desc: "Interface between man and machine" - }, - { - name: "robotics", - prereq: ["engineering"], - desc: "Design and operation of robots, drones, and androids" - }, - { - name: "artificial intelligence", - prereq: ["engineering","hacking"], - desc: "Knowledge of simulacrum of human consciousness" - }, - { - name: "command", - prereq: ["vehicle specialization","tactics"], - desc: "Leadership and authority" - }, - { - name: "hyperspace", - prereq: ["astrogation","mysticism","physics"], - desc: "FTL travel" - }, - { - name: "xenoesotericism", - prereq: ["mysticism"], - desc: "Obscure alien mysticism, religion, and belief" - }, - { - name: "weapon specialization", - prereq: ["gunnery","firearms","close-quarters combat","explosives"], - desc: "Proficiency with a specific weapon" - }, - ] - }; - - const shipfields = [ - { - label: "ship name", - attr: "character_name", - type: "text" - }, - { - label: "type", - attr: "type", - type: "text" - }, - { - label: "class", - attr: "ship_class", - type: "text" - } - ]; - - const shipminmaxfields = [ - - ] - - const shipstats = [ - { - attr:"armor", - label:"The value the ship must roll under to avoid taking Damage. Generally the captain or acting captain of the ship rolls the Armor Save." - }, - { - attr:"combat", - label:"Used during Combat Checks. You can use whichever is higher: your own Combat Stat or the ship's." - }, - { - attr:"intellect", - label:"Used as both a stat and a Sanity Save, should the need arise." - }, - { - attr:"speed", - label:"Often used to see if the ship can dodge asteroids or escape explosions from collapsing stars." - } - ] - - const primary_modules = { - life_support: { - desc: "Life support keeps the human crew alive. Each point of life support can support up to 10 humans. For every point below the required minimum, anyone not wearing a vaccsuit must make a Body Save every hour or take 1d10 damage. This includes those in cryochambers as well, but does not include androids. Many ships include 2-3 times the required amount of life support in case of extra passengers or damage to the system.", - fields: [ - { - name: "human passengers", - attr: "ship_passengers", - after: "/10" - }, - { - name: "life support", - attr: "ship_lifesupport_modules", - display: true, - after: "equals" - }, - ] - }, - command: { - desc: "The command module is the cockpit, command center, or bridge of a ship. For every 4 officer positions, one command module is required. Officers can be captains, first mates, navigation officers, communications officers, and is largely up to the Warden and the players to decide.", - fields: [ - { - name: "officers", - attr: "ship_officers", - after: "/4" - }, - { - name: "command modules", - attr: "ship_command_modules", - display: true, - after: "equals" - }, - ] - }, - armor: { - desc: "Armor plating protects the ship fromsmall metoerites, space dust and debris, as well as, if need be, attacks from other vessels. Every point of armor costs 3 hull, and grants the ship +10% Armor Save (Max 80).", - fields: [ - { - name: "armor", - attr: "ship_armor_modules", - after: "x10" - }, - { - name: "armor save", - attr: "armor", - display: true - }, - ] - } - }; - - const secondary_modules = { - jump_drives: { - desc: "Jump drives enable the ship to travel through hyperspace. Every point of Jump Drive increasesthe ship’s jump capability by 1 (Max 9). The first drive costs 1 hull, the second costs 2, the third costs 3, etc.", - fields: [ - { - name: "jump drives", - attr: "ship_jumpdrive_modules", - after: "..." - }, - ] - }, - computer: { - desc: "The ship’s computer is a powerful artificial intelligence that helps with astrogation, combat, and anumber of other autonomous tasks. A ship’s Intellect is equal to the number of computer modules x10 +30%. It’s Combat is equal to the number of computer modules x10 +10%. A computer module is required for each jumpdrive. Additionally, each computer module equipped allows the computer to take more actions during combat.", - fields: [ - { - name: "computer modules", - attr: "ship_computer_modules", - after: "equals" - }, - ] - }, - galley: { - desc: "Galleys contain a kitchen, restrooms, and a common area on a ship. Any ships making trips longer than 1 day must have 1 galley for every 2 life support modules or else the crew must take Body Saves once/day. Failure means 2d10 damage and 1d10 Stress. Galleys must be re-stocked once a month and extra stores take up 1 Cargo.", - fields: [ - { - name: "galleys", - attr: "ship_galleys", - after: "equals" - }, - ] - }, - weapon_mount: { - desc: "For every weapon your ship has you must have 1 mount for it. You can find the list of ship weapons in The Player's Survival Guide", - fields: [ - { - name: "weapons", - attr: "ship_weapons", - after: "arrow" - }, - { - name: "weapon mounts", - attr: "ship_weapon_mounts", - display: true, - after: "equals" - }, - ] - }, - medical_bay: { - desc: "Medical bays allow scientists, doctors, and other researchers to heal crew members and perform various procedures (biopsies, autopsies, surgery). Each connected medbay on the ship grants +5% to the Intellect of the Scientists or Androids using them. Medical bays also grant advantage on Body Saves made for healing.", - fields: [ - { - name: "medbays", - attr: "ship_medbays", - after: "x5" - }, - { - name: "medical intellect bonus", - attr: "ship_medint_bonus", - display: true - }, - ] - }, - cryochamber: { - desc: "Cryochambers allow humans to sleep during long trips, particularly through hyperspace. Androids do not require them. Each point of hull spent on cryochambers accomodates up to 4 cryosleep pods. Individuals who don’t go into cryosleep during hyperspace jumps often have strange and terrifying experiences.", - fields: [ - { - name: "cryo-sleep pods", - attr: "ship_cryopods", - after: "/4" - }, - { - name: "cryo-chambers", - attr: "ship_cryochambers", - display: true, - after: "equals" - }, - ] - }, - living_quarters: { - desc: "Generally, if a ship is to travel through normal space for at least a week, then living quarters or “staterooms” are provided for each of the ship’s officers, or other important crew members.", - fields: [ - { - name: "officers", - attr: "ship_officers", - after: "arrow", - display: true - }, - { - name: "living quarters", - attr: "ship_livingquarters", - after: "equals" - }, - ] - }, - barracks: { - desc: "The same as living quarters, except they are non-private and house up to twelve crew members. Like living quarters, they are not-essential rooms, but ships that need them, but don’t have them, give their crew +1 Stress per journey or month of travel.", - fields: [ - { - name: "crew", - attr: "ship_crew", - after: "/12" - }, - { - name: "barracks", - attr: "ship_barracks", - display: true, - after: "equals" - }, - ] - }, - cargo_hold: { - desc: "Cargo holds are essentially 20x20m rooms used for storage. Each cargo hold can hold up to 10 cargo units (each cargo is roughly the size of a large pallet). Cargo holds can also be used for any other basic room not provided for on this list (brigs, secret compartments, mining equipment, training facilities, hangars, armories, etc.).", - fields: [ - { - name: "cargo", - attr: "ship_cargo", - after: "/10" - }, - { - name: "cargo holds", - attr: "ship_cargoholds", - display: true, - after: "equals" - }, - ] - }, - science_lab: { - desc: "Similar to the medical bay, the science lab allows for detailed research. Each connected sciencelab grants +5% Intellect to Scientists and Androids using them to conduct research or experiments. Additionally, they can be designated as repair shops and used by Teamsters to repair electronics, machines, or even Androids.", - fields: [ - { - name: "science labs", - attr: "ship_sciencelabs", - after: "x5" - }, - { - name: "research intellect bonus", - attr: "ship_resint_bonus", - display: true - }, - ] - } - } - - const required_modules = { - thrusters: { - desc: "Without thrusters, the ship cannot move. Every thruster module equipped increases the speed ofthe ship by +10% (to a maximum of 80). Additionally, thrusters cost an extra 1 hull for every 10 base hull.", - fields: [ - { - name: "hull req.", - attr: "ship_thruster_hullreq", - display: true, - after: "+" - }, - { - name: "thrusters", - attr: "ship_thrusters", - after: "equals" - }, - ] - }, - engine: { - desc: "Without the engine, the entire ship ceases to operate and becomes a ruin. You must have 1 engine module for every jump drive, plus 1 for every 4 thrusters, plus 1 for every 20 points of base hull.", - fields: [ - { - name: "hull req.", - attr: "ship_engine_hullreq", - display: true, - after: "+" - }, - { - name: "thruster req.", - attr: "ship_engine_thrusterreq", - display: true, - after: "+" - }, - { - name: "jump drives", - attr: "ship_jumpdrive_modules", - display: true, - after: "=" - }, - { - name: "engine", - attr: "ship_engine", - display: true, - after: "equals" - }, - ] - }, - fuel: { - desc: "The engine needs fuel to run on. Every jump requires double the fuel of the jump (Jump 2 = 4 fuel) and thrusters burn 1 unit of fuel per day. The engine requires at least 3 fuel for every point of engine plus any extra fuel capacity you want to add. More fuel can be stored in Cargo Holds at 1 Fuel per 10 Cargo.", - fields: [ - { - name: "min. fuel", - attr: "ship_fuel_min", - display: true, - after: "+" - }, - { - name: "extra fuel", - attr: "ship_fuel_extra", - after: "equals" - }, - ] - }, - frame: { - desc: "Frame covers the miscellaneous parts of a ship, docking gear, airlocks, ventillation, corridors, comms relays, everything else a ship generally uses. Frame is 1 point per 10 points of base hull.", - fields: [ - { - name: "frame", - attr: "ship_frame", - display: true, - after: "equals" - }, - ] - }, - } - - const shipsecondaries = [ - { - name:"life support", - attr:"ship_lifesupport_modules", - placeholder:"2", - label:"Life support keeps the human crew alive. Each point of life support can support up to 10 humans. For every point below the required minimum, anyone not wearing a vaccsuit must make a Body Save every hour or take 1d10 damage. This includes those in cryochambers as well, but does not include androids. Many ships include 2-3 times the required amount of life support in case of extra passengers or damage to the system." - }, - { - name:"command modules", - attr:"ship_command_modules", - placeholder:"2", - label:"The command module is the cockpit, command center, or bridge of a ship. For every 4 officer positions, one command module is required. Officers can be captains, first mates, navigation officers, communications officers, and is largely up to the Warden and the players to decide." - }, - { - name:"jump drives", - attr:"ship_jumpdrive_modules", - placeholder:"2", - label:"Jump drives enable the ship to travel through hyperspace. Every point of Jump Drive increasesthe ship’s jump capability by 1 (Max 9). The first drive costs 1 hull, the second costs 2, the third costs 3, etc.", - }, - { - name:"computer modules", - attr:"ship_computer_modules", - placeholder:"2", - label:"The ship’s computer is a powerful artificial intelligence that helps with astrogation, combat, and anumber of other autonomous tasks. A ship’s Intellect is equal to the number of computer modules x10 +30%. It’s Combat is equal to the number of computer modules x10 +10%. A computer module is required for each jumpdrive. Additionally, each computer module equipped allows the computer to take more actions during combat." - }, - { - name:"galleys", - attr:"ship_galleys", - placeholder:"2", - label:"Galleys contain a kitchen, restrooms, and a common area on a ship. Any ships making trips longer than 1 day must have 1 galley for every 2 life support modules or else the crew must take Body Saves once/day. Failure means 2d10 damage and 1d10 Stress. Galleys must be re-stocked once a month and extra stores take up 1 Cargo." - }, - { - name:"weapon mounts", - attr:"ship_weapon_mounts", - placeholder:"2", - label:"For every weapon your ship has you must have 1 mount for it. You can find the list of ship weapons in The Player's Survival Guide" - }, - { - name:"medbays", - attr:"ship_medbays", - placeholder:"2", - label:"Medical bays allow scientists, doctors, and other researchers to heal crew members and perform various procedures (biopsies, autopsies, surgery). Each connected medbay on the ship grants +5% to the Intellect of the Scientists or Androids using them. Medical bays also grant advantage on Body Saves made for healing." - }, - { - name:"cryo-chambers", - attr:"ship_cryochambers", - placeholder:"2", - label:"Cryochambers allow humans to sleep during long trips, particularly through hyperspace. Androids do not require them. Each point of hull spent on cryochambers accomodates up to 4 cryosleep pods. Individuals who don’t go into cryosleep during hyperspace jumps often have strange and terrifying experiences." - }, - { - name:"living quarters", - attr:"ship_livingquarters", - placeholder:"2", - label:"Generally, if a ship is to travel through normal space for at least a week, then living quarters or “staterooms” are provided for each of the ship’s officers, or other important crew members." - }, - { - name:"barracks", - attr:"ship_barracks", - placeholder:"2", - label:"The same as living quarters, except they are non-private and house up to twelve crew members. Like living quarters, they are not-essential rooms, but ships that need them, but don’t have them, give their crew +1 Stress per journey or month of travel." - }, - { - name:"cargo holds", - attr:"ship_cargoholds", - placeholder:"2", - label:"Cargo holds are essentially 20x20m rooms used for storage. Each cargo hold can hold up to 10 cargo units (each cargo is roughly the size of a large pallet). Cargo holds can also be used for any other basic room not provided for on this list (brigs, secret compartments, mining equipment, training facilities, hangars, armories, etc.).", - }, - { - name:"science labs", - attr:"ship_sciencelabs", - placeholder:"2", - label:"Similar to the medical bay, the science lab allows for detailed research. Each connected sciencelab grants +5% Intellect to Scientists and Androids using them to conduct research or experiments. Additionally, they can be designated as repair shops and used by Teamsters to repair electronics, machines, or even Androids.", - }, +- + + const headerfields = [{label: "name", attr: "character_name", type: "text"},{label: "level", attr: "level", type: "number"},{label: "rank / title", attr: "rank_title", type: "text"},{label: "XP", attr: "xp", type: "text"},{label: "class", attr: "class", type: "text"}]; + + const toprowfields = [{attr:"stress",subtext:"starts at 2",placeholder:"2"},{attr:"resolve",subtext:"starts at 0",placeholder:"0"}]; + + const stats = [ + { + attr:"strength", + label:"How able-bodied you are. Lifting, pushing, hitting things hard, etc." + }, + { + attr:"speed", + label:"How quickly you can act and react under pressure." + }, + { + attr:"intellect", + label:"How knowledgeable and experienced you are." + }, + { + attr:"combat", + label:"How good you are at fighting." + } + ] + + const saves = [ + { + name:"sanity", + subtext:"rationalization, logic", + desc:"Sanity is your ability to explain away logical inconsistencies in the universe, rationalize and make sense out of chaos, detect illusions and mimicry and think quickly under pressure." + }, + { + name:"fear", + subtext:"surprise, loneliness", + desc:"Fear is how well you can cope with emotional trauma, and covers not only fear, but also loneliness, depression or any other emotional surge." + }, + { + name:"body", + subtext:"hunger, disease, infection", + desc:"Body is your reflexes, and how well you can resist hunger, disease or any other organism that might attempt to invade your insides." + }, + { + name:"armor", + subtext:"physical damage", + desc:"Armor is how resistant you ae to damage sustained during combat, whether that be through bullets, claws, teeth, etc." + } + ]; + + const skills = { + trained: [ + { + name: "linguistics", + desc: "Study of language" + }, + { + name: "biology", + desc: "Study of life" + }, + { + name: "first aid", + desc: "Emergency medical care and treatment" + }, + { + name: "hydroponics", + desc: "Growing plants in nutrient solutions without soil (farming in space)" + }, + { + name: "geology", + desc: "The solid features of any terrestrial planet or natural satellite" + }, + { + name: "zero-g", + desc: "Working in a vaccuum, vaccsuits, etc." + }, + { + name: "scavenging", + desc: "Searching discarded wastes for useful items" + }, + { + name: "heavy machinery", + desc: "Operation and use of large pieces of equipment (cranes, exosuits, forkliftsm etc.)" + }, + { + name: "computers", + desc: "Fluent use of computers and networks" + }, + { + name: "mechanical repair", + desc: "Fixing broken machines" + }, + { + name: "driving", + desc: "Operation and control of motor vehicles" + }, + { + name: "piloting", + desc: "Operation and control of air and spacecraft" + }, + { + name: "mathematics", + desc: "The science of numbers, quantity, and space" + }, + { + name: "art", + desc: "The expression or application of a species' creative ability and imagination" + }, + { + name: "archaeology", + desc: "Ancient cultures and their artifacts" + }, + { + name: "theology", + desc: "Study of religion" + }, + { + name: "military training", + desc: "Standard basic training given to all military personnel" + }, + { + name: "rimwise", + desc: "Outer rim colonies and seedy parts of the galaxy" + }, + { + name: "athletics", + desc: "Physical sports and games" + }, + { + name: "chemistry", + desc: "The identification of the substances of which matter is composed" + }, + ], + expert: [ + { + name: "psychology", + prereq: ["biology"], + desc: "The study of behavior and the human mind" + }, + { + name: "genetics", + prereq: ["biology"], + desc: "Heredity and the variation of the inherited characteristics" + }, + { + name: "pathology", + prereq: ["first aid"], + desc: "Study of the cause and effect of disease" + }, + { + name: "botany", + prereq: ["hydroponics"], + desc: "The study of plant life" + }, + { + name: "planetology", + prereq: ["geology"], + desc: "Study of planets and other celestial body" + }, + { + name: "asteroid mining", + prereq: ["geology","zero-g","heavy machinery","scavenging"], + desc: "Training in the tools and procedures used in mining asteroids" + }, + { + name: "jury rigging", + prereq: ["scavenging","mechanical repair"], + desc: "Makeshift repairs" + }, + { + name: "engineering", + prereq: ["heavy machinery","computers","mechanical repair"], + desc: "Design, building, and use of engines, machines, and structures" + }, + { + name: "hacking", + prereq: ["computers"], + desc: "Unauthorized access to computer systems" + }, + { + name: "vehicle specialization", + prereq: ["mechanical repair","piloting","driving"], + desc: "Specific vehicle class" + }, + { + name: "astrogation", + prereq: ["piloting"], + desc: "Navigation in outer space" + }, + { + name: "physics", + prereq: ["mathematics"], + desc: "Study of nature and properties of matter and energy" + }, + { + name: "mysticism", + prereq: ["art","archaeology","theology"], + desc: "Spiritual apprehension of hidden knowledge" + }, + { + name: "tactics", + prereq: ["military training"], + desc: "Manuevering military forces in battle" + }, + { + name: "gunnery", + prereq: ["military training"], + desc: "Starship weaponry" + }, + { + name: "firearms", + prereq: ["military training","rimwise"], + desc: "Guns and their use" + }, + { + name: "close-quarters combat", + prereq: ["athletics","military training","rimwise"], + desc: "Hand-tohand, melee fighting" + }, + { + name: "explosives", + prereq: ["military training","chemistry"], + desc: "Bombs and incendiary devices" + }, + ], + master: [ + { + name: "sophontology", + prereq: ["linguistics", "psychology"], + desc: "Alien psychology" + }, + { + name: "xenobiology", + prereq: ["genetics","botany","pathology"], + desc: "Alien biology" + }, + { + name: "surgery", + prereq: ["pathology"], + desc: "Medical speciality involving manual operation" + }, + { + name: "cybernetics", + prereq: ["jury rigging","engineering"], + desc: "Interface between man and machine" + }, + { + name: "robotics", + prereq: ["engineering"], + desc: "Design and operation of robots, drones, and androids" + }, + { + name: "artificial intelligence", + prereq: ["engineering","hacking"], + desc: "Knowledge of simulacrum of human consciousness" + }, + { + name: "command", + prereq: ["vehicle specialization","tactics"], + desc: "Leadership and authority" + }, + { + name: "hyperspace", + prereq: ["astrogation","mysticism","physics"], + desc: "FTL travel" + }, + { + name: "xenoesotericism", + prereq: ["mysticism"], + desc: "Obscure alien mysticism, religion, and belief" + }, + { + name: "weapon specialization", + prereq: ["gunnery","firearms","close-quarters combat","explosives"], + desc: "Proficiency with a specific weapon" + }, + ] + }; + + const shipfields = [ + { + label: "ship name", + attr: "character_name", + type: "text" + }, + { + label: "type", + attr: "type", + type: "text" + }, + { + label: "class", + attr: "ship_class", + type: "text" + } + ]; + + const shipminmaxfields = [ + + ] + + const shipstats = [ + { + attr:"armor", + label:"The value the ship must roll under to avoid taking Damage. Generally the captain or acting captain of the ship rolls the Armor Save." + }, + { + attr:"combat", + label:"Used during Combat Checks. You can use whichever is higher: your own Combat Stat or the ship's." + }, + { + attr:"intellect", + label:"Used as both a stat and a Sanity Save, should the need arise." + }, + { + attr:"speed", + label:"Often used to see if the ship can dodge asteroids or escape explosions from collapsing stars." + } + ] + + const primary_modules = { + life_support: { + desc: "Life support keeps the human crew alive. Each point of life support can support up to 10 humans. For every point below the required minimum, anyone not wearing a vaccsuit must make a Body Save every hour or take 1d10 damage. This includes those in cryochambers as well, but does not include androids. Many ships include 2-3 times the required amount of life support in case of extra passengers or damage to the system.", + fields: [ + { + name: "human passengers", + attr: "ship_passengers", + after: "/10" + }, + { + name: "life support", + attr: "ship_lifesupport_modules", + display: true, + after: "equals" + }, + ] + }, + command: { + desc: "The command module is the cockpit, command center, or bridge of a ship. For every 4 officer positions, one command module is required. Officers can be captains, first mates, navigation officers, communications officers, and is largely up to the Warden and the players to decide.", + fields: [ + { + name: "officers", + attr: "ship_officers", + after: "/4" + }, + { + name: "command modules", + attr: "ship_command_modules", + display: true, + after: "equals" + }, + ] + }, + armor: { + desc: "Armor plating protects the ship fromsmall metoerites, space dust and debris, as well as, if need be, attacks from other vessels. Every point of armor costs 3 hull, and grants the ship +10% Armor Save (Max 80).", + fields: [ + { + name: "armor", + attr: "ship_armor_modules", + after: "x10" + }, + { + name: "armor save", + attr: "armor", + display: true + }, + ] + } + }; + + const secondary_modules = { + jump_drives: { + desc: "Jump drives enable the ship to travel through hyperspace. Every point of Jump Drive increasesthe ship’s jump capability by 1 (Max 9). The first drive costs 1 hull, the second costs 2, the third costs 3, etc.", + fields: [ + { + name: "jump drives", + attr: "ship_jumpdrive_modules", + after: "..." + }, + ] + }, + computer: { + desc: "The ship’s computer is a powerful artificial intelligence that helps with astrogation, combat, and anumber of other autonomous tasks. A ship’s Intellect is equal to the number of computer modules x10 +30%. It’s Combat is equal to the number of computer modules x10 +10%. A computer module is required for each jumpdrive. Additionally, each computer module equipped allows the computer to take more actions during combat.", + fields: [ + { + name: "computer modules", + attr: "ship_computer_modules", + after: "equals" + }, + ] + }, + galley: { + desc: "Galleys contain a kitchen, restrooms, and a common area on a ship. Any ships making trips longer than 1 day must have 1 galley for every 2 life support modules or else the crew must take Body Saves once/day. Failure means 2d10 damage and 1d10 Stress. Galleys must be re-stocked once a month and extra stores take up 1 Cargo.", + fields: [ + { + name: "galleys", + attr: "ship_galleys", + after: "equals" + }, + ] + }, + weapon_mount: { + desc: "For every weapon your ship has you must have 1 mount for it. You can find the list of ship weapons in The Player's Survival Guide", + fields: [ + { + name: "weapons", + attr: "ship_weapons", + after: "arrow" + }, + { + name: "weapon mounts", + attr: "ship_weapon_mounts", + display: true, + after: "equals" + }, + ] + }, + medical_bay: { + desc: "Medical bays allow scientists, doctors, and other researchers to heal crew members and perform various procedures (biopsies, autopsies, surgery). Each connected medbay on the ship grants +5% to the Intellect of the Scientists or Androids using them. Medical bays also grant advantage on Body Saves made for healing.", + fields: [ + { + name: "medbays", + attr: "ship_medbays", + after: "x5" + }, + { + name: "medical intellect bonus", + attr: "ship_medint_bonus", + display: true + }, + ] + }, + cryochamber: { + desc: "Cryochambers allow humans to sleep during long trips, particularly through hyperspace. Androids do not require them. Each point of hull spent on cryochambers accomodates up to 4 cryosleep pods. Individuals who don’t go into cryosleep during hyperspace jumps often have strange and terrifying experiences.", + fields: [ + { + name: "cryo-sleep pods", + attr: "ship_cryopods", + after: "/4" + }, + { + name: "cryo-chambers", + attr: "ship_cryochambers", + display: true, + after: "equals" + }, + ] + }, + living_quarters: { + desc: "Generally, if a ship is to travel through normal space for at least a week, then living quarters or “staterooms” are provided for each of the ship’s officers, or other important crew members.", + fields: [ + { + name: "officers", + attr: "ship_officers", + after: "arrow", + display: true + }, + { + name: "living quarters", + attr: "ship_livingquarters", + after: "equals" + }, + ] + }, + barracks: { + desc: "The same as living quarters, except they are non-private and house up to twelve crew members. Like living quarters, they are not-essential rooms, but ships that need them, but don’t have them, give their crew +1 Stress per journey or month of travel.", + fields: [ + { + name: "crew", + attr: "ship_crew", + after: "/12" + }, + { + name: "barracks", + attr: "ship_barracks", + display: true, + after: "equals" + }, + ] + }, + cargo_hold: { + desc: "Cargo holds are essentially 20x20m rooms used for storage. Each cargo hold can hold up to 10 cargo units (each cargo is roughly the size of a large pallet). Cargo holds can also be used for any other basic room not provided for on this list (brigs, secret compartments, mining equipment, training facilities, hangars, armories, etc.).", + fields: [ + { + name: "cargo", + attr: "ship_cargo", + after: "/10" + }, + { + name: "cargo holds", + attr: "ship_cargoholds", + display: true, + after: "equals" + }, + ] + }, + science_lab: { + desc: "Similar to the medical bay, the science lab allows for detailed research. Each connected sciencelab grants +5% Intellect to Scientists and Androids using them to conduct research or experiments. Additionally, they can be designated as repair shops and used by Teamsters to repair electronics, machines, or even Androids.", + fields: [ + { + name: "science labs", + attr: "ship_sciencelabs", + after: "x5" + }, + { + name: "research intellect bonus", + attr: "ship_resint_bonus", + display: true + }, + ] + } + } + + const required_modules = { + thrusters: { + desc: "Without thrusters, the ship cannot move. Every thruster module equipped increases the speed ofthe ship by +10% (to a maximum of 80). Additionally, thrusters cost an extra 1 hull for every 10 base hull.", + fields: [ + { + name: "hull req.", + attr: "ship_thruster_hullreq", + display: true, + after: "+" + }, + { + name: "thrusters", + attr: "ship_thrusters", + after: "equals" + }, + ] + }, + engine: { + desc: "Without the engine, the entire ship ceases to operate and becomes a ruin. You must have 1 engine module for every jump drive, plus 1 for every 4 thrusters, plus 1 for every 20 points of base hull.", + fields: [ + { + name: "hull req.", + attr: "ship_engine_hullreq", + display: true, + after: "+" + }, + { + name: "thruster req.", + attr: "ship_engine_thrusterreq", + display: true, + after: "+" + }, + { + name: "jump drives", + attr: "ship_jumpdrive_modules", + display: true, + after: "=" + }, + { + name: "engine", + attr: "ship_engine", + display: true, + after: "equals" + }, + ] + }, + fuel: { + desc: "The engine needs fuel to run on. Every jump requires double the fuel of the jump (Jump 2 = 4 fuel) and thrusters burn 1 unit of fuel per day. The engine requires at least 3 fuel for every point of engine plus any extra fuel capacity you want to add. More fuel can be stored in Cargo Holds at 1 Fuel per 10 Cargo.", + fields: [ + { + name: "min. fuel", + attr: "ship_fuel_min", + display: true, + after: "+" + }, + { + name: "extra fuel", + attr: "ship_fuel_extra", + after: "equals" + }, + ] + }, + frame: { + desc: "Frame covers the miscellaneous parts of a ship, docking gear, airlocks, ventillation, corridors, comms relays, everything else a ship generally uses. Frame is 1 point per 10 points of base hull.", + fields: [ + { + name: "frame", + attr: "ship_frame", + display: true, + after: "equals" + }, + ] + }, + } + + const shipsecondaries = [ + { + name:"life support", + attr:"ship_lifesupport_modules", + placeholder:"2", + label:"Life support keeps the human crew alive. Each point of life support can support up to 10 humans. For every point below the required minimum, anyone not wearing a vaccsuit must make a Body Save every hour or take 1d10 damage. This includes those in cryochambers as well, but does not include androids. Many ships include 2-3 times the required amount of life support in case of extra passengers or damage to the system." + }, + { + name:"command modules", + attr:"ship_command_modules", + placeholder:"2", + label:"The command module is the cockpit, command center, or bridge of a ship. For every 4 officer positions, one command module is required. Officers can be captains, first mates, navigation officers, communications officers, and is largely up to the Warden and the players to decide." + }, + { + name:"jump drives", + attr:"ship_jumpdrive_modules", + placeholder:"2", + label:"Jump drives enable the ship to travel through hyperspace. Every point of Jump Drive increasesthe ship’s jump capability by 1 (Max 9). The first drive costs 1 hull, the second costs 2, the third costs 3, etc.", + }, + { + name:"computer modules", + attr:"ship_computer_modules", + placeholder:"2", + label:"The ship’s computer is a powerful artificial intelligence that helps with astrogation, combat, and anumber of other autonomous tasks. A ship’s Intellect is equal to the number of computer modules x10 +30%. It’s Combat is equal to the number of computer modules x10 +10%. A computer module is required for each jumpdrive. Additionally, each computer module equipped allows the computer to take more actions during combat." + }, + { + name:"galleys", + attr:"ship_galleys", + placeholder:"2", + label:"Galleys contain a kitchen, restrooms, and a common area on a ship. Any ships making trips longer than 1 day must have 1 galley for every 2 life support modules or else the crew must take Body Saves once/day. Failure means 2d10 damage and 1d10 Stress. Galleys must be re-stocked once a month and extra stores take up 1 Cargo." + }, + { + name:"weapon mounts", + attr:"ship_weapon_mounts", + placeholder:"2", + label:"For every weapon your ship has you must have 1 mount for it. You can find the list of ship weapons in The Player's Survival Guide" + }, + { + name:"medbays", + attr:"ship_medbays", + placeholder:"2", + label:"Medical bays allow scientists, doctors, and other researchers to heal crew members and perform various procedures (biopsies, autopsies, surgery). Each connected medbay on the ship grants +5% to the Intellect of the Scientists or Androids using them. Medical bays also grant advantage on Body Saves made for healing." + }, + { + name:"cryo-chambers", + attr:"ship_cryochambers", + placeholder:"2", + label:"Cryochambers allow humans to sleep during long trips, particularly through hyperspace. Androids do not require them. Each point of hull spent on cryochambers accomodates up to 4 cryosleep pods. Individuals who don’t go into cryosleep during hyperspace jumps often have strange and terrifying experiences." + }, + { + name:"living quarters", + attr:"ship_livingquarters", + placeholder:"2", + label:"Generally, if a ship is to travel through normal space for at least a week, then living quarters or “staterooms” are provided for each of the ship’s officers, or other important crew members." + }, + { + name:"barracks", + attr:"ship_barracks", + placeholder:"2", + label:"The same as living quarters, except they are non-private and house up to twelve crew members. Like living quarters, they are not-essential rooms, but ships that need them, but don’t have them, give their crew +1 Stress per journey or month of travel." + }, + { + name:"cargo holds", + attr:"ship_cargoholds", + placeholder:"2", + label:"Cargo holds are essentially 20x20m rooms used for storage. Each cargo hold can hold up to 10 cargo units (each cargo is roughly the size of a large pallet). Cargo holds can also be used for any other basic room not provided for on this list (brigs, secret compartments, mining equipment, training facilities, hangars, armories, etc.).", + }, + { + name:"science labs", + attr:"ship_sciencelabs", + placeholder:"2", + label:"Similar to the medical bay, the science lab allows for detailed research. Each connected sciencelab grants +5% Intellect to Scientists and Androids using them to conduct research or experiments. Additionally, they can be designated as repair shops and used by Teamsters to repair electronics, machines, or even Androids.", + }, ]; \ No newline at end of file diff --git a/Mothership Official/src/scss/_rolltemplate.scss b/Mothership Official/src/scss/_rolltemplate.scss index c49b03ada1..f369cc1a4b 100644 --- a/Mothership Official/src/scss/_rolltemplate.scss +++ b/Mothership Official/src/scss/_rolltemplate.scss @@ -1,147 +1,147 @@ - - -.sheet-rolltemplate-ms { - - .sheet-ms { - - &-container { - padding: $ms-margin-large; - - background: $ms-background; - color: $ms-foreground; - - border-radius: 2rem; - border-top-left-radius: 0; - border-top-right-radius: 0; - border: $ms-border-thick; - - font-family: $ms-fonts-body; - - h1, h2 { - margin: 0; - padding: $ms-margin; - - font-family: $ms-fonts-header; - line-height: 1; - text-align: center; - } - - h1 { - width: 90%; - - margin-top: -$ms-margin-large; - margin-left: -$ms-margin-large; - font-size: $ms-font-h1; - text-transform: uppercase; - - background: $ms-invert-background; - color: $ms-invert-foreground; - - border-bottom-right-radius: 1.5em; - } - - h2 { - font-size: $ms-font-h2; - font-weight: normal; - text-transform: uppercase; - } - - .importantroll, - .fullcrit, - .fullfail, - .inlinerollresult { - border: none; - background: transparent; - - font-family: inherit; - line-height: 1em; - } - - .fullcrit { - color: darkgreen; - } - - .fullfail { - color: darkred; - } - } - - &-roll { - box-sizing: border-box; - - display: grid; - grid-template-columns: repeat(4, 1fr); - align-items: center; - width: 100%; - - &__roll, - &__roll2 { - height: 4rem; - grid-column: span 2; - - background: $ms-background; - border-radius: 1.5rem; - color: $ms-foreground; - - font-size: $ms-font-h1 * 1.5; - line-height: 4rem; - text-align: center; - } - - &__roll { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - - border: $ms-border-thick; - - &:only-child { - grid-column: 2 / span 2; - - border-radius: 1.5rem; - } - } - - &__roll2 { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - - border: $ms-border-thick; - border-left: none; - } - } - - &-target, - &-damage { - box-sizing: border-box; - - display: grid; - grid-template-columns: 1fr 6rem; - align-items: center; - gap: $ms-margin-large * 2; - padding: $ms-margin-small; - - font-size: $ms-font-large; - - background: $ms-background; - border-radius: 1.5rem; - color: $ms-foreground; - - &__label { - font-family: $ms-fonts-header; - font-weight: bold; - text-transform: uppercase; - } - - &__value { - border: $ms-border; - border-radius: .5rem; - padding: $ms-margin-small; - - font-weight: bold; - text-align: center; - } - } - - } - + + +.sheet-rolltemplate-ms { + + .sheet-ms { + + &-container { + padding: $ms-margin-large; + + background: $ms-background; + color: $ms-foreground; + + border-radius: 2rem; + border-top-left-radius: 0; + border-top-right-radius: 0; + border: $ms-border-thick; + + font-family: $ms-fonts-body; + + h1, h2 { + margin: 0; + padding: $ms-margin; + + font-family: $ms-fonts-header; + line-height: 1; + text-align: center; + } + + h1 { + width: 90%; + + margin-top: -$ms-margin-large; + margin-left: -$ms-margin-large; + font-size: $ms-font-h1; + text-transform: uppercase; + + background: $ms-invert-background; + color: $ms-invert-foreground; + + border-bottom-right-radius: 1.5em; + } + + h2 { + font-size: $ms-font-h2; + font-weight: normal; + text-transform: uppercase; + } + + .importantroll, + .fullcrit, + .fullfail, + .inlinerollresult { + border: none; + background: transparent; + + font-family: inherit; + line-height: 1em; + } + + .fullcrit { + color: darkgreen; + } + + .fullfail { + color: darkred; + } + } + + &-roll { + box-sizing: border-box; + + display: grid; + grid-template-columns: repeat(4, 1fr); + align-items: center; + width: 100%; + + &__roll, + &__roll2 { + height: 4rem; + grid-column: span 2; + + background: $ms-background; + border-radius: 1.5rem; + color: $ms-foreground; + + font-size: $ms-font-h1 * 1.5; + line-height: 4rem; + text-align: center; + } + + &__roll { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + + border: $ms-border-thick; + + &:only-child { + grid-column: 2 / span 2; + + border-radius: 1.5rem; + } + } + + &__roll2 { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + + border: $ms-border-thick; + border-left: none; + } + } + + &-target, + &-damage { + box-sizing: border-box; + + display: grid; + grid-template-columns: 1fr 6rem; + align-items: center; + gap: $ms-margin-large * 2; + padding: $ms-margin-small; + + font-size: $ms-font-large; + + background: $ms-background; + border-radius: 1.5rem; + color: $ms-foreground; + + &__label { + font-family: $ms-fonts-header; + font-weight: bold; + text-transform: uppercase; + } + + &__value { + border: $ms-border; + border-radius: .5rem; + padding: $ms-margin-small; + + font-weight: bold; + text-align: center; + } + } + + } + } \ No newline at end of file diff --git a/Mothership Official/src/scss/_skillcontrol.scss b/Mothership Official/src/scss/_skillcontrol.scss index f21819bd1c..1b998ecac9 100644 --- a/Mothership Official/src/scss/_skillcontrol.scss +++ b/Mothership Official/src/scss/_skillcontrol.scss @@ -1,47 +1,47 @@ -$skillList: - "psychology", - "genetics", - "pathology", - "botany", - "planetology", - "asteroid_mining", - "jury_rigging", - "engineering", - "hacking", - "vehicle_specialization", - "astrogation", - "physics", - "mysticism", - "tactics", - "gunnery", - "firearms", - "close-quarters_combat", - "explosives", - "sophontology", - "xenobiology", - "surgery", - "cybernetics", - "robotics", - "artificial_intelligence", - "command", - "hyperspace", - "xenoesotericism", - "weapon_specialization"; - -input.sheet-skill-toggle { - border: 1px solid red; - - @each $skill in $skillList { - - &[value*=#{$skill}] { - ~ * .sheet-ms-skill--#{$skill} { - opacity: 1; - - button[type="roll"], - .sheet-ms-skill__checkmark { - pointer-events: unset; - } - } - } - } +$skillList: + "psychology", + "genetics", + "pathology", + "botany", + "planetology", + "asteroid_mining", + "jury_rigging", + "engineering", + "hacking", + "vehicle_specialization", + "astrogation", + "physics", + "mysticism", + "tactics", + "gunnery", + "firearms", + "close-quarters_combat", + "explosives", + "sophontology", + "xenobiology", + "surgery", + "cybernetics", + "robotics", + "artificial_intelligence", + "command", + "hyperspace", + "xenoesotericism", + "weapon_specialization"; + +input.sheet-skill-toggle { + border: 1px solid red; + + @each $skill in $skillList { + + &[value*=#{$skill}] { + ~ * .sheet-ms-skill--#{$skill} { + opacity: 1; + + button[type="roll"], + .sheet-ms-skill__checkmark { + pointer-events: unset; + } + } + } + } } \ No newline at end of file diff --git a/Mothership Official/src/scss/mothership.scss b/Mothership Official/src/scss/mothership.scss index 7924166870..dc4db57f98 100644 --- a/Mothership Official/src/scss/mothership.scss +++ b/Mothership Official/src/scss/mothership.scss @@ -1,1944 +1,1944 @@ -@import url("https://fonts.googleapis.com/css?family=Montserrat:400|Montserrat:800|Diadact%20Gothic:400|&display=swap"); - -// ABSTRACTS - -// Colours - -$ms-foreground: #111; -$ms-background: white; -$ms-invert-foreground: white; -$ms-invert-background: #111; -$ms-recessed: dimgray; -$ms-light: lightgray; -$ms-lighter: lighten(lightgray, 10%); - -$ms-accent: red; -$ms-enabled: rgb(255, 174, 0); - -$ms-tooltip-background: rgba($ms-foreground, .9); - -// Margins and Spacing - -$ms-margin: 1rem; -$ms-margin-small: .5rem; -$ms-margin-large: 1.25rem; - -// Borders - -$ms-border: 2px solid $ms-foreground; -$ms-border-thick: 3px solid $ms-foreground; -$ms-border-thicker: 4px solid $ms-foreground; -$ms-border-recessed: 1px solid $ms-recessed; -$ms-border-settings: 2px solid $ms-recessed; -$ms-border-settings-highlight: 3px dashed $ms-enabled; -$ms-border-radius: 1.5em; - -// Fonts and Sizes - -$ms-fonts-header: "Montserrat", "Arial Black", sans-serif; -$ms-fonts-body: "Century Gothic", "Diadact Gothic", sans-serif; -$ms-fonts-input: "Century Gothic", "Diadact Gothic", sans-serif; -$ms-pictos: "Pictos"; - -$ms-font-general: 1.25rem; -$ms-font-small: 1rem; -$ms-font-large: 1.5rem; -$ms-font-h1: 1.75rem; -$ms-font-h2: 1.65rem; -$ms-font-h3: 1.55rem; -$ms-font-input: 1.45rem; - -.sheet-ms { - - &-wrapper { - position: relative; - - // Specificity hack - - &#{&} { - * { - box-sizing: border-box; - } - - input[type="text"], - input[type="number"], - select, - textarea { - width: 100%; - - border: none; - border-radius: 0; - - background: $ms-background; - color: $ms-foreground; - - font-size: $ms-font-input; - font-family: $ms-fonts-input; - - &.sheet-ms-rounded { - border-radius: 1em; - } - - &:focus, - &:active { - outline: none; - } - } - - input[type="number"] { - -moz-appearance: textfield; - - &::-webkit-outer-spin-button, - &::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; - } - } - - select { - -webkit-appearance: none; - -moz-appearance: none; - - margin: 0; - - cursor: pointer; - - background: transparent url("https://s3.amazonaws.com/files.d20.io/images/138210258/mZTqw1vke8SrkprMJmiZQw/med.png?1590443723") right 5px center no-repeat; - } - - textarea { - resize: vertical; - height: 5em; - } - - button[type="roll"] { - box-shadow: unset; - - background: transparent; - border: none; - overflow: hidden; - - text-overflow: ellipsis; - text-shadow: none; - - &:before { - display: none; - } - - &:hover { - cursor: pointer; - - color: $ms-accent !important; - text-shadow: none; - } - } - - label { - margin: 0; - padding: 0; - } - - .itemcontrol { - position: relative; - - button.repcontrol_del, - a.repcontrol_move { - display: block; - top: calc(50% - 1.5rem); - z-index: 1000; - position: relative; - border: $ms-border; - border-radius: 1em; - padding: 0; - margin: 0; - height: 3rem; - width: 3rem; - box-shadow: none; - - line-height: 2em; - text-shadow: none; - - font-weight: bold; - } - - button.repcontrol_del { - margin-right: .25rem; - - background: darken($ms-accent, 20%); - color: #fff; - } - - a.repcontrol_move { - margin-left: .25rem; - - background: #fff; - color: #000; - } - - } - - .repcontrol { - background-color: transparent; - - min-height: 2.5em; - - button.repcontrol_add, - button.repcontrol_del, - button.repcontrol_move, - button.repcontrol_edit { - z-index: 1000; - - border: 0; - padding: 0; - margin: 0; - - background: none; - box-shadow: none; - - font-size: 0; - line-height: 1; - - &:before { - display: block; - margin: 0; - padding: .35em; - height: 1em; - width: 1em; - - border: $ms-border; - border-radius: 1em; - background: none; - box-shadow: none; - } - } - - button.repcontrol_add:before { - display: block; - content: "&"; - - font-family: "Pictos"; - font-size: 12pt; - font-weight: bold; - } - - button.repcontrol_edit { - &:before { - display: block; - content: "p"; - right: 5px; - - font-family: "Pictos"; - font-size: 12pt; - font-weight: bold; - } - } - } - } - } - - &-settings { - display: none; - grid-template-columns: 1fr 1fr; - gap: $ms-margin-small; - - position: absolute; - left: 0; - top: 20px; - z-index: 100; - width: 40%; - padding: $ms-margin-small; - - background: $ms-background; - border: $ms-border-thicker; - border-radius: $ms-border-radius; - - font-size: $ms-font-small; - - &__toggle { - width: 2.5rem; - height: 2.5rem; - position: absolute; - left: 0; - top: 0; - z-index: 100; - cursor: pointer; - padding: .25rem !important; - - border-radius: 50%; - background: $ms-invert-background; - - text-align: center; - - span { - color: $ms-invert-foreground; - - font-family: $ms-pictos; - font-weight: normal; - } - - input[type="checkbox"] { - display: none; - - &:checked + span { - color: $ms-accent; - } - } - } - - &__row { - display: grid; - grid-template-columns: 1fr 2fr; - align-items: center; - padding: $ms-margin-small; - - border-bottom: $ms-border; - - &--pc, - &--ship { - @extend .sheet-ms-settings__row; - display: none; - } - - button[type="action"] { - width: 50%; - margin: auto; - - border: $ms-border; - - font-family: $ms-fonts-header; - font-weight: bold; - text-transform: uppercase; - } - } - - &__label { - font-family: $ms-fonts-header; - font-size: $ms-font-general; - font-weight: bold; - text-transform: uppercase; - } - - &__setting { - - } - } - - &-ship, - &-npc, - &-pc { - position: relative; - - display: grid; - gap: $ms-margin-large; - - background: $ms-background; - color: $ms-foreground; - - font-family: $ms-fonts-body; - font-size: $ms-font-general; - - h1 { - grid-column: 1 / -1; - - color: $ms-foreground; - - font-family: $ms-fonts-header; - font-size: $ms-font-h1 * 2; - font-weight: bold; - text-align: center; - text-transform: uppercase; - } - - .sheet-ms { - - &-header { - display: grid; - grid-template-columns: 1fr 1fr; - gap: $ms-margin-large; - align-items: center; - grid-column: 1 / -1; - padding: $ms-margin-large; - - background: $ms-invert-background; - color: $ms-invert-foreground; - - font-family: $ms-fonts-header; - font-weight: bold; - text-transform: uppercase; - - &__logo { - - } - - &__details { - display: grid; - grid-template-columns: 1fr 1fr 1fr 1fr; - gap: $ms-margin-large; - } - - &__field { - display: flex; - flex-direction: row no-wrap; - align-items: center; - - &--ship_class, - &--type, - &--character_name, - &--level, - &--rank_title, - &--xp, - &--class { - @extend .sheet-ms-header__field; - } - - &--character_name { - grid-column: 1 / -1; - } - - &--rank_title, - &--class { - grid-column: span 3; - } - - &--ship_class, - &--type { - grid-column: span 2; - } - } - - &__title { - flex-shrink: 0; - margin-right: $ms-margin; - } - - &__input[type="text"], - &__input[type="number"] { - flex-grow: 1; - flex-shrink: 1; - - width: 50% !important; - - text-align: center; - font-size: $ms-font-large; - } - } - - &-skillsaves { - display: grid; - grid-template-columns: 2fr 1fr; - grid-gap: $ms-margin; - - } - - &-stats { - display: grid; - grid-template-columns: 1fr 1fr 1.5fr; - - &__toprow { - display: grid; - grid-template-columns: 1fr 1fr 1.5fr; - grid-gap: $ms-margin; - align-items: start; - justify-items: center; - } - - &__main { - grid-column: 1 / span 2; - padding: $ms-margin-large * 2 0; - display: grid; - gap: $ms-margin-large * 3; - } - } - - &-topstat { - display: grid; - justify-items: center; - gap: $ms-margin; - - &__label { - grid-column: 1 / -1; - - font-family: $ms-fonts-header; - font-size: $ms-font-h1; - font-weight: bold; - line-height: 1; - text-align: center; - text-transform: uppercase; - - &--invert { - @extend .sheet-ms-topstat__label; - - padding: 2px 5px; - border-radius: 1em; - - background: $ms-invert-background; - color: $ms-invert-foreground; - - font-size: $ms-font-general; - } - - &--small { - @extend .sheet-ms-topstat__label; - grid-column: span 1; - - font-size: $ms-font-general; - } - } - - input.sheet-ms-topstat__stat[type="number"] { - height: 52px; - width: 52px; - padding: $ms-margin; - border: $ms-border-thicker; - border-radius: 50%; - - font-size: $ms-font-h1; - font-weight: bold; - text-align: center; - } - - &--minmax { - @extend .sheet-ms-topstat; - width: 60%; - grid-template-columns: 1fr 2fr; - justify-self: center; - - .sheet-ms-topstat__label { - text-align: left; - } - } - - &__minmaxwrapper { - grid-column: 1 / -1; - display: grid; - grid-template-columns: 1fr 2fr; - align-items: start; - max-height: 50px; - padding: 0; - - border: $ms-border-thicker; - border-radius: 2.5em; - } - - input.sheet-ms-topstat__max[type="number"] { - height: 50px; - width: 50px; - margin: -4px; - border: $ms-border-thicker; - border-radius: 50%; - - font-size: $ms-font-h1; - font-weight: bold; - text-align: center; - line-height: 1.5; - } - - input.sheet-ms-topstat__min[type="number"] { - height: 45px; - width: 100px; - padding: 0; - margin: 0; - - background: transparent; - - font-size: $ms-font-h1 * 2; - font-weight: bold; - text-align: center; - } - - } - - &-mainstat { - position: relative; - display: grid; - grid-template-columns: 1fr 5em; - align-items: center; - gap: 0; - width: 100%; - - &__label { - border-top-left-radius: 2em; - border-bottom-left-radius: 2em; - - background: $ms-invert-background; - padding: 0 $ms-margin-small; - - button[type="roll"] { - width: 100%; - padding: $ms-margin-small; - - color: $ms-invert-foreground; - - font-family: $ms-fonts-header; - font-size: $ms-font-h1 * 1.2; - font-weight: bold; - text-align: left; - text-transform: uppercase; - - &:hover + .sheet-ms-tooltip { - display: inline-block; - } - } - } - - input.sheet-ms-mainstat__input[type="number"] { - margin: -.75em; - height: 1.75em; - width: 1.75em; - - border: $ms-border-thicker; - border-radius: 4em; - - font-size: $ms-font-h1 * 1.75; - font-weight: bold; - text-align: center; - } - } - - &-patches { - padding: $ms-margin; - margin-top: $ms-margin-large; - - background: $ms-invert-background; - border-radius: 2em; - color: $ms-invert-foreground; - - h1 { - font-size: $ms-font-h1; - - color: $ms-invert-foreground; - } - - &__textarea { - resize: none !important; - - height: 5em !important; - } - } - - &-saves { - display: grid; - grid-template-columns: .25fr 2fr 80px .25fr; - gap: $ms-margin-large 0; - - &__col { - display: grid; - gap: $ms-margin; - - &--right, - &--left { - @extend .sheet-ms-saves__col; - } - - &--right { - padding: 3em $ms-margin; - border-radius: 50%/3em; - - background: $ms-invert-background; - color: $ms-invert-foreground; - } - - &--left { - grid-column: 2; - padding: 3em 0; - - align-items: center; - justify-content: end; - } - } - - button.sheet-ms-saves__name[type="roll"] { - display: block; - margin: 0; - margin-top: $ms-margin-small * 2; - padding: $ms-margin-small; - width: 100%; - - border-radius: 0; - - background: $ms-light; - - font-family: $ms-fonts-header; - font-size: $ms-font-h1 * 1.2; - font-weight: bold; - text-align: left; - text-transform: uppercase; - - &:hover ~ .sheet-ms-tooltip { - display: inline-block; - - left: -50px; - width: 300px; - } - } - - &__label { - position: relative; - } - - .sheet-ms-saves__input[type="number"] { - height: 60px; - width: 60px; - - font-size: $ms-font-h1 * 2; - font-weight: bold; - text-align: center; - } - } - - &-stress_panic { - grid-column: 1 / -1; - display: grid; - grid-template-columns: 1fr 3fr; - align-items: center; - padding: $ms-margin-small; - border-radius: 1.5em; - - background: $ms-invert-background; - color: $ms-invert-foreground; - - font-size: $ms-font-h2; - - &__label { - font-family: $ms-fonts-header; - font-weight: bold; - text-align: center; - text-transform: uppercase; - } - - &__input[type="text"] { - text-align: center; - } - } - - &-cargo, - &-crew, - &-skillpoints { - position: relative; - display: grid; - grid-template-columns: 1fr .75fr; - align-items: center; - padding: $ms-margin-small; - border-radius: 1.5em; - - background: $ms-invert-background; - color: $ms-invert-foreground; - - font-size: $ms-font-h2; - - &__label { - font-family: $ms-fonts-header; - font-weight: bold; - text-align: center; - text-transform: uppercase; - - cursor: pointer; - - &:hover ~ .sheet-ms-tooltip--skills { - left: 0; - display: block; - - font-size: $ms-font-small; - } - } - - &__input[type="number"] { - text-align: center; - } - } - - &-cargowrap { - display: grid; - grid-template-columns: 1fr 1fr; - gap: $ms-margin-large; - margin-top: $ms-margin-large; - } - - &-skills { - position: relative; - - display: grid; - align-items: start; - grid-template-columns: 1fr 1fr 1fr; - gap: $ms-margin-large * 2; - - h1 { - grid-column: span 2; - align-self: center; - text-align: left; - } - - h2 { - padding: $ms-margin-small; - - border: $ms-border-thick; - border-radius: 1em; - - background: $ms-background; - color: $ms-foreground; - - font-family: $ms-fonts-header; - font-size: $ms-font-h2; - font-weight: bold; - line-height: 1; - text-align: center; - text-transform: uppercase; - - cursor: pointer; - - &:hover + .sheet-ms-tooltip { - display: block; - left: 0; - - z-index: 9999; - } - } - - &__trained, - &__expert, - &__master { - display: grid; - gap: 1em; - position: relative; - } - - &__expert, - &__master { - - .sheet-ms-skill { - opacity: .5; - - button[type="roll"], - .sheet-ms-skill__checkmark { - pointer-events: none; - } - } - } - - .repcontainer { - display: grid; - gap: $ms-margin-large; - } - } - - &-skill { - position: relative; - display: grid; - grid-template-columns: 20px 1fr 20px; - align-items: center; - width: 100%; - - &-wrapper { - position: relative; - } - - &:hover + .sheet-ms-tooltip { - cursor: pointer; - - display: inline-block; - } - - &__checkmark { - z-index: 999; - cursor: pointer; - min-height: 26px; - min-width: 26px; - - border: $ms-border-thick; - border-radius: 50%; - background: $ms-background; - - input[type="checkbox"] { - display: none; - - &:checked { - - + span { - display: block; - height: 20px; - width: 20px; - border-radius: 50%; - - background: $ms-background url("https://s3.amazonaws.com/files.d20.io/images/138210119/cvUNlZk3lj7GZXQEsKIBWw/max.png?1590443685") no-repeat center/75%; - } - } - } - } - - &__button { - margin-left: -1em; - - button[type="roll"] { - width: 85%; - min-height: 3em; - border-radius: 2em; - padding: .75em; - padding-left: 1.5em; - - background: $ms-invert-background; - color: $ms-invert-foreground !important; - - font-family: $ms-fonts-header; - font-size: $ms-font-general; - font-weight: bold; - text-align: left; - text-transform: uppercase; - } - } - - &__cog { - cursor: pointer; - - &:hover span { - opacity: 1; - } - - input[type="checkbox"] { - display: none; - - &:checked + span { - opacity: 1; - } - } - - span { - opacity: 0.125; - - font-family: $ms-pictos; - font-size: $ms-font-large; - } - } - - &__settings { - grid-column: 1 / -1; - - display: none; - gap: $ms-margin-small; - margin: $ms-margin-small; - padding: $ms-margin-small; - - border-top: $ms-border-settings-highlight; - - background: $ms-light; - background-clip: padding-box; - - &row { - &:not(:first-child) { - border-top: $ms-recessed; - } - } - - &title { - font-family: $ms-fonts-header; - font-size: $ms-font-general; - font-weight: bold; - text-transform: uppercase; - } - - input.sheet-ms-skill__settingsinput[type="text"] { - border-radius: 2em; - font-size: $ms-font-general !important; - } - } - - &--repeating { - @extend .sheet-ms-skill; - - button[type="roll"] { - pointer-events: unset !important; - } - - opacity: 1 !important; - } - - input[name*="settings"][value="on"] ~ .sheet-ms-skill__settings { - display: grid; - } - } - - &-tooltip { - display: none; - position: absolute; - top: 25px; - left: 50px; - z-index: 1000; - - min-width: 60px; - max-width: 250px; - min-height: 1.5rem; - margin: 1rem; - padding: 1rem; - - border-radius: 1em; - - background: $ms-tooltip-background; - color: $ms-invert-foreground; - - strong.sheet-ms-tooltip__label { - font-family: $ms-fonts-header; - font-weight: bold; - text-transform: uppercase; - - &:after { - display: inline; - content: ":"; - margin-right: .5rem; - } - - + span { - text-transform: capitalize; - - &:first-letter { - text-transform: uppercase; - } - } - } - - > div { - text-transform: capitalize; - } - - p { - margin: 0; - padding: 0; - font-family: $ms-fonts-body; - - &:first-letter { - text-transform: uppercase; - } - } - - &--skills { - @extend .sheet-ms-tooltip; - width: 600px !important; - padding: $ms-margin-small; - - ul { - margin: 0; - padding: 0; - - li { - margin: none; - list-style-type: none; - - text-align: center; - - strong { - display: block; - - font-family: $ms-fonts-header; - text-transform: uppercase; - } - } - } - - > span { - grid-column: 1 / -1; - display: block; - - text-align: center; - - &:first-letter { - text-transform: uppercase; - } - } - } - } - - &-gear { - display: grid; - grid-template-columns: 1fr 1.5fr; - grid-gap: $ms-margin; - } - - &-credits { - position: absolute; - bottom: 0; - right: 0; - - display: grid; - grid-template-columns: 1fr 1.5fr; - align-items: center; - width: 90%; - margin-top: $ms-margin; - padding: $ms-margin-small; - border-top-left-radius: 1.5em; - - background: $ms-invert-background; - color: $ms-invert-foreground; - - font-size: $ms-font-h2; - - &__label { - font-family: $ms-fonts-header; - font-weight: bold; - text-align: center; - text-transform: uppercase; - } - - &__input[type="text"] { - text-align: center; - } - } - - &-shipcargo, - &-shipofficers, - &-shipweapons, - &-attacks, - &-equipment { - position: relative; - padding: $ms-margin; - border: $ms-border-thick; - - border-bottom-left-radius: 1.5em; - border-bottom-right-radius: 1.5em; - - overflow: hidden; - - h1 { - width: 90%; - margin-top: -$ms-margin; - margin-left: -$ms-margin; - margin-bottom: $ms-margin; - padding: $ms-margin-small; - border-bottom-right-radius: 1.5em; - - background: $ms-invert-background; - color: $ms-invert-foreground; - - font-size: $ms-font-h1; - font-family: $ms-fonts-header; - text-align: left; - } - } - - &-shipcargo { - .repcontainer { - display: grid; - grid-template-columns: 1fr 1fr; - gap: $ms-margin-small; - } - } - - &-equipment { - padding-bottom: 3em; - } - - &-shipcargorow, - &-shipofficerrow, - &-shipweaponrow, - &-equipmentrow, - &-npcattackrow, - &-npcabilityrow, - &-attackrow { - display: grid; - gap: 0 $ms-margin; - align-items: center; - margin-bottom: $ms-margin-small; - padding-bottom: $ms-margin-small; - - border-bottom: $ms-border-thick; - - > * { - &:not(:first-child) { - text-align: center; - } - } - - &__name, - &__type { - - &--head { - font-family: $ms-fonts-header; - font-weight: bold; - - text-transform: uppercase; - } - } - - &__name { - text-align: left !important; - } - - &--head { - - > div { - &:not(:first-child) { - text-align: center; - } - } - } - - select, - input[type="number"], - input[type="text"], - textarea { - border-radius: .5rem; - background-color: $ms-lighter; - } - - &__cog { - cursor: pointer; - - &:hover span { - opacity: 1; - } - - input[type="checkbox"] { - display: none; - - &:checked + span { - opacity: 1; - } - } - - span { - opacity: 0.125; - - font-family: $ms-pictos; - font-size: $ms-font-large; - } - } - - button[type="roll"] { - font-weight: bold; - text-align: left; - } - - &__settings { - grid-column: 1 / -1; - - display: none; - gap: $ms-margin-small; - margin: $ms-margin-small; - padding: $ms-margin-small; - - border-top: $ms-border-settings-highlight; - - background: $ms-light; - background-clip: padding-box; - - &row { - &:not(:first-child) { - border-top: $ms-recessed; - } - } - - &title { - font-family: $ms-fonts-header; - font-size: $ms-font-general; - font-weight: bold; - text-transform: uppercase; - } - - input[type="text"], - textarea { - border-radius: 1em; - background-color: $ms-background; - } - } - } - - &-equipmentrow { - grid-template-columns: 1fr .75fr 2em; - - &--head { - @extend .sheet-ms-equipmentrow; - } - - input[name*="settings"][value="on"] ~ .sheet-ms-equipmentrow__settings { - display: grid; - } - - &__settingsrow { - display: grid; - grid-template-columns: 1fr 1fr; - gap: $ms-margin; - - &--full { - @extend .sheet-ms-equipmentrow__settingsrow; - grid-template-columns: 1fr; - } - } - - .sheet-show_armor { - display: none; - } - - input[name*="type"][value*="Armor"] ~ * .sheet-show_armor { - display: grid; - } - } - - &-attackrow { - grid-template-columns: 1.5fr 1fr 1fr 2em; - - &--head { - @extend .sheet-ms-attackrow; - } - - input[name*="settings"][value="on"] ~ .sheet-ms-attackrow__settings { - display: grid; - } - - &__settingsrow { - display: grid; - grid-template-columns: 1fr 1fr; - gap: $ms-margin; - - &--full, - &--range { - @extend .sheet-ms-attackrow__settingsrow; - } - - &--full { - grid-template-columns: 1fr; - } - - &--range { - grid-column: 1 / -1; - display: grid; - grid-template-columns: 1fr 1fr 1fr; - - .sheet-ms-attackrow__settingstitle { - grid-column: 1 / -1; - } - } - - &--critical { - grid-column: 1 / -1; - display: grid; - grid-template-columns: 1fr 1fr; - } - } - - .sheet-show_ranged { - display: none; - } - - select[name*="type"][value*="Ranged"] ~ * .sheet-show_ranged { - display: grid; - } - } - - &-npcattackrow { - display: flex; - justify-content: flex-start; - align-items: center; - flex-wrap: wrap; - gap: .125rem !important; - height: 2.5rem; - - border-bottom: 0; - - &__cog { - flex-basis: 3rem; - margin-left: auto !important; - } - - &__settings { - flex-basis: 100%; - margin-left: auto !important; - } - - &__arrow { - flex-basis: 1em; - font-family: $ms-pictos; - } - - &--head { - @extend .sheet-ms-npcattackrow; - } - - input[name*="settings"][value="on"] ~ .sheet-ms-npcattackrow__settings { - display: grid; - } - } - - &-npcabilityrow { - border-bottom: 0px; - } - - &-npcabilityrow { - grid-template-columns: 1fr 3rem; - - &--head { - @extend .sheet-ms-npcabilityrow; - } - - input[name*="settings"][value="on"] ~ .sheet-ms-npcabilityrow__settings { - display: grid; - } - - &__text { - grid-column: 1 / -1; - padding: 0 $ms-margin-large; - - font-size: $ms-font-large; - text-align: left !important; - } - } - - &-shipweaponrow { - grid-template-columns: 1fr 1fr 2em; - - &--head { - @extend .sheet-ms-shipweaponrow; - } - - input[name*="settings"][value="on"] ~ .sheet-ms-shipweaponrow__settings { - display: grid; - } - } - - &-shipofficerrow { - grid-template-columns: 1fr 1fr; - - &--head { - @extend .sheet-ms-shipofficerrow; - } - - input[name*="settings"][value="on"] ~ .sheet-ms-shipofficerrow__settings { - display: grid; - } - } - - &-shipcargorow { - grid-template-columns: 1fr .25fr; - - &--head { - display: grid; - grid-template-columns: 1fr .25fr 1fr .25fr; - } - - input[name*="settings"][value="on"] ~ .sheet-ms-shipofficerrow__settings { - display: grid; - } - } - - &-shipbuilder { - position: relative; - - grid-column: 1 / -1; - - display: grid; - gap: $ms-margin-large; - margin-top: $ms-margin-large * 1.5; - padding: $ms-margin-large; - - border: 3px dashed $ms-foreground; - border-radius: 4rem; - - h2 { - display: inline; - padding: $ms-margin-small; - padding-right: 0; - - background: $ms-invert-background; - color: $ms-invert-foreground; - - border-radius: 2rem; - - font-family: $ms-fonts-header; - text-transform: uppercase; - - .sheet-ms-invert { - margin: $ms-margin-small; - padding: 0 $ms-margin-small; - - background: $ms-background; - color: $ms-foreground; - - border-radius: 2em; - } - } - - &__hwrap { - grid-column: 1 / -1; - } - - &__block { - display: grid; - grid-template-columns: 1fr 1fr; - - border: $ms-border-thick; - - &--engine { - - .sheet-ms-shipbuilder__flex > * { - margin-right: 0; - } - - } - } - - &__title { - grid-column: 1 / -1; - padding: 0; - - h3 { - display: inline-block; - min-width: 50%; - padding: $ms-margin-small $ms-margin-large; - margin: 0; - padding-right: $ms-margin-large; - - border-bottom-right-radius: 2em; - - background: $ms-invert-background; - color: $ms-invert-foreground; - - font-family: $ms-fonts-header; - text-align: left; - text-transform: uppercase; - } - } - - &__flex { - display: flex; - align-items: center; - justify-content: space-between; - padding: $ms-margin; - - > * { - margin-right: 3rem; - } - } - - &__desc { - padding: $ms-margin-small $ms-margin-large; - - p { - font-family: $ms-fonts-body; - } - } - - &__item { - display: grid; - grid-template-columns: 1fr; - grid-template-rows: 4rem 1fr; - justify-content: center; - - max-width: 6rem; - min-height: 8rem; - - text-align: center; - } - - &__label { - font-family: $ms-fonts-header; - font-size: $ms-font-small; - font-weight: bold; - text-transform: uppercase; - } - - &__hull { - padding: $ms-margin; - } - - &__arrow, - &__equals, - &__modifier { - margin-top: -3rem; - min-height: 3rem; - min-width: 3rem; - max-height: 3rem; - max-width: 3rem; - padding: .5rem; - - line-height: 1.5em; - - border-radius: 4rem; - - background: $ms-invert-background; - color: $ms-invert-foreground; - - text-align: center; - font-weight: bold; - - } - - &__spacer { - min-width: 4rem; - max-width: 4rem; - } - - &__arrow { - font-family: $ms-pictos; - } - - &__display { - display: block; - height: 3.5rem; - width: 3.5rem; - margin:auto; - padding: .5em 0; - - border: $ms-border; - - background: $ms-light; - - font-size: $ms-font-general; - font-weight: bold; - text-align: center; - } - - &__panel { - grid-column: 1 / -1; - position: sticky; - bottom: 0; - display: flex; - align-items: flex-start; - justify-content: space-around; - padding: $ms-margin-large; - - border-top: $ms-border-thicker; - background: $ms-light; - - font-size: $ms-font-large; - - &item { - text-align: center; - } - } - - &__wrapdisplay { - display: flex; - align-items: baseline; - } - - &__largelabel { - font-family: $ms-fonts-header; - font-size: $ms-font-large; - text-align: center; - text-transform: uppercase; - font-weight: bold; - } - - &__largedisplay { - display: block; - - font-size: $ms-font-h1 * 2; - font-weight: bold; - text-align: center; - - &:empty { - &:before { - content: "-" - } - } - } - - &__complete { - grid-column: 1 / -1; - text-align: center; - - button[type="action"] { - border: $ms-border-thick; - padding: $ms-margin-large; - - border-radius: 1rem; - - font-family: $ms-fonts-header; - font-size: $ms-font-h1 * 2; - font-weight: bold; - text-transform: uppercase; - - &:hover { - color: $ms-accent; - border-color: $ms-accent; - } - } - } - - input[type="number"].sheet-ms-shipbuilder__input { - height: 3.5rem; - width: 3.5rem; - margin:auto; - padding: 0; - - border: $ms-border; - - text-align: center; - } - } - - &-shipwrapper { - display: grid; - grid-template-columns: .75fr 1fr 1fr; - gap: $ms-margin-large; - padding-bottom: 14rem; - } - - &-crewwrap { - display: grid; - grid-template-rows: auto 3rem 3rem; - gap: $ms-margin-large; - align-items: start; - } - - &-shipstats { - grid-row: span 3; - align-self: start; - - display: grid; - gap: $ms-margin-large; - align-items: start; - - .sheet-ms-mainstat { - display: grid; - grid-template-columns: 1fr 3rem; - margin-top: $ms-margin-large * 2; - } - - .sheet-ms-topstat--minmax { - gap: .5rem; - - width: 80%; - } - } - - &-hullvalues { - display: grid; - grid-template-columns: 1fr 1fr 1fr; - gap: $ms-margin-small; - width: 80%; - margin: auto; - - input[name="attr_hull_toggle"] { - &[value="25"] ~ { - .sheet-ms-topstat--25 { - .sheet-ms-topstat__stat { - border-color: $ms-accent; - } - .sheet-ms-topstat__label--invert { - background-color: $ms-accent; - } - } - } - - &[value="50"] ~ { - .sheet-ms-topstat--50, - .sheet-ms-topstat--25 { - .sheet-ms-topstat__stat { - border-color: $ms-accent; - } - .sheet-ms-topstat__label--invert { - background-color: $ms-accent; - } - } - } - - &[value="75"] ~ { - .sheet-ms-topstat--75, - .sheet-ms-topstat--50, - .sheet-ms-topstat--25 { - .sheet-ms-topstat__stat { - border-color: $ms-accent; - } - .sheet-ms-topstat__label--invert { - background-color: $ms-accent; - } - } - } - } - } - - &-shipcargo { - grid-column: span 2; - } - - &-shipsecondaries { - grid-column: span 2; - - display: grid; - grid-template-columns: 1fr 1fr 1fr 1fr; - gap: $ms-margin; - padding: $ms-margin; - - .sheet-ms-topstat { - grid-template-rows: 2em 1fr; - gap: .5em; - - position: relative; - width: 100%; - margin-bottom: 32px; - padding-bottom: 10px; - - background: $ms-light; - border-radius: 2rem; - - &__label { - align-self: center; - font-size: $ms-font-general; - - cursor: pointer; - - &:hover + .sheet-ms-tooltip { - display: inline-block; - left: calc(50% - 150px); - width: 400px; - } - } - - &__stat { - margin-bottom: -32px; - } - } - } - } - } - - &-npcwrapper { - display: block; - - > input { - float: right; - } - } - - &-npcsettings { - display: grid; - grid-template-columns: 1fr 1fr; - - &__row { - display: grid; - grid-template-columns: .5fr 1fr; - gap: $ms-margin-large; - padding: $ms-margin-small; - border-bottom: 1px solid $ms-foreground; - } - } - - &-npcname { - display: flex; - align-items: center; - min-height: 10rem; - padding: 2em; - padding-bottom: 0; - padding-left: 1em; - - background: $ms-invert-background; - color: $ms-invert-foreground; - - button[type="action"].sheet-ms-npcname_button { - border: none; - background: transparent; - padding: 0 !important; - margin: 0; - - color: $ms-foreground; - - font-family: $ms-fonts-header; - font-size: 38pt; - color: $ms-invert-foreground; - font-weight: bold; - text-transform: uppercase; - - &:hover { - color: $ms-accent; - } - - &:active { - padding: 0; - margin: 0; - text-indent: 0; - } - } - - button.sheet-ms-npcname_switch, - input[type="text"] { - display: none; - } - - button.sheet-ms-npcname_switch { - height: 4rem; - width: 4rem; - min-height: 4rem; - min-width: 4rem; - max-height: 4rem; - max-width: 4rem; - margin-left: 1rem; - - border: $ms-invert-foreground 3px solid; - border-radius: 2rem !important; - background: $ms-invert-background; - color: $ms-invert-foreground; - - font-size: 14pt; - font-weight: bold; - } - - input[type="text"][name="attr_character_name"] { - max-width: 50%; - margin: 0; - padding: 0; - - border-bottom: $ms-border-thick !important; - - font-family: $ms-fonts-header; - font-size: 24pt !important; - font-weight: bold; - } - - input[type="hidden"][value="on"] { - & ~ input[type="text"], - & ~ button.sheet-ms-npcname_switch { - display: block; - } - - & ~ .sheet-ms-npcname_button { - display: none; - } - } - } - - - &-npcstats { - display: grid; - grid-template-columns: 1fr 1fr 1fr .75fr; - align-items: center; - gap: $ms-margin; - margin: $ms-margin-large 0; - - .sheet-ms-mainstat { - grid-template-columns: 1fr 3em; - } - } - - &-npcrepeating { - display: grid; - grid-template-columns: 1fr 1fr; - gap: $ms-margin-large; - - h3 { - border-bottom: $ms-border-thick; - margin-bottom: 1rem; - - font-family: $ms-fonts-header; - font-size: 18pt; - line-height: 16pt; - text-transform: uppercase; - } - - .repcontrol { - margin: $ms-margin-large 0; - } - } - - &-npcdescription { - h3 { - border-bottom: $ms-border-thick; - margin-bottom: 1rem; - - font-family: $ms-fonts-header; - font-size: 18pt; - line-height: 16pt; - text-transform: uppercase; - } - } -} - -@import "rolltemplate"; -@import "skillcontrol"; +@import url("https://fonts.googleapis.com/css?family=Montserrat:400|Montserrat:800|Diadact%20Gothic:400|&display=swap"); + +// ABSTRACTS + +// Colours + +$ms-foreground: #111; +$ms-background: white; +$ms-invert-foreground: white; +$ms-invert-background: #111; +$ms-recessed: dimgray; +$ms-light: lightgray; +$ms-lighter: lighten(lightgray, 10%); + +$ms-accent: red; +$ms-enabled: rgb(255, 174, 0); + +$ms-tooltip-background: rgba($ms-foreground, .9); + +// Margins and Spacing + +$ms-margin: 1rem; +$ms-margin-small: .5rem; +$ms-margin-large: 1.25rem; + +// Borders + +$ms-border: 2px solid $ms-foreground; +$ms-border-thick: 3px solid $ms-foreground; +$ms-border-thicker: 4px solid $ms-foreground; +$ms-border-recessed: 1px solid $ms-recessed; +$ms-border-settings: 2px solid $ms-recessed; +$ms-border-settings-highlight: 3px dashed $ms-enabled; +$ms-border-radius: 1.5em; + +// Fonts and Sizes + +$ms-fonts-header: "Montserrat", "Arial Black", sans-serif; +$ms-fonts-body: "Century Gothic", "Diadact Gothic", sans-serif; +$ms-fonts-input: "Century Gothic", "Diadact Gothic", sans-serif; +$ms-pictos: "Pictos"; + +$ms-font-general: 1.25rem; +$ms-font-small: 1rem; +$ms-font-large: 1.5rem; +$ms-font-h1: 1.75rem; +$ms-font-h2: 1.65rem; +$ms-font-h3: 1.55rem; +$ms-font-input: 1.45rem; + +.sheet-ms { + + &-wrapper { + position: relative; + + // Specificity hack + + &#{&} { + * { + box-sizing: border-box; + } + + input[type="text"], + input[type="number"], + select, + textarea { + width: 100%; + + border: none; + border-radius: 0; + + background: $ms-background; + color: $ms-foreground; + + font-size: $ms-font-input; + font-family: $ms-fonts-input; + + &.sheet-ms-rounded { + border-radius: 1em; + } + + &:focus, + &:active { + outline: none; + } + } + + input[type="number"] { + -moz-appearance: textfield; + + &::-webkit-outer-spin-button, + &::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + } + + select { + -webkit-appearance: none; + -moz-appearance: none; + + margin: 0; + + cursor: pointer; + + background: transparent url("https://s3.amazonaws.com/files.d20.io/images/138210258/mZTqw1vke8SrkprMJmiZQw/med.png?1590443723") right 5px center no-repeat; + } + + textarea { + resize: vertical; + height: 5em; + } + + button[type="roll"] { + box-shadow: unset; + + background: transparent; + border: none; + overflow: hidden; + + text-overflow: ellipsis; + text-shadow: none; + + &:before { + display: none; + } + + &:hover { + cursor: pointer; + + color: $ms-accent !important; + text-shadow: none; + } + } + + label { + margin: 0; + padding: 0; + } + + .itemcontrol { + position: relative; + + button.repcontrol_del, + a.repcontrol_move { + display: block; + top: calc(50% - 1.5rem); + z-index: 1000; + position: relative; + border: $ms-border; + border-radius: 1em; + padding: 0; + margin: 0; + height: 3rem; + width: 3rem; + box-shadow: none; + + line-height: 2em; + text-shadow: none; + + font-weight: bold; + } + + button.repcontrol_del { + margin-right: .25rem; + + background: darken($ms-accent, 20%); + color: #fff; + } + + a.repcontrol_move { + margin-left: .25rem; + + background: #fff; + color: #000; + } + + } + + .repcontrol { + background-color: transparent; + + min-height: 2.5em; + + button.repcontrol_add, + button.repcontrol_del, + button.repcontrol_move, + button.repcontrol_edit { + z-index: 1000; + + border: 0; + padding: 0; + margin: 0; + + background: none; + box-shadow: none; + + font-size: 0; + line-height: 1; + + &:before { + display: block; + margin: 0; + padding: .35em; + height: 1em; + width: 1em; + + border: $ms-border; + border-radius: 1em; + background: none; + box-shadow: none; + } + } + + button.repcontrol_add:before { + display: block; + content: "&"; + + font-family: "Pictos"; + font-size: 12pt; + font-weight: bold; + } + + button.repcontrol_edit { + &:before { + display: block; + content: "p"; + right: 5px; + + font-family: "Pictos"; + font-size: 12pt; + font-weight: bold; + } + } + } + } + } + + &-settings { + display: none; + grid-template-columns: 1fr 1fr; + gap: $ms-margin-small; + + position: absolute; + left: 0; + top: 20px; + z-index: 100; + width: 40%; + padding: $ms-margin-small; + + background: $ms-background; + border: $ms-border-thicker; + border-radius: $ms-border-radius; + + font-size: $ms-font-small; + + &__toggle { + width: 2.5rem; + height: 2.5rem; + position: absolute; + left: 0; + top: 0; + z-index: 100; + cursor: pointer; + padding: .25rem !important; + + border-radius: 50%; + background: $ms-invert-background; + + text-align: center; + + span { + color: $ms-invert-foreground; + + font-family: $ms-pictos; + font-weight: normal; + } + + input[type="checkbox"] { + display: none; + + &:checked + span { + color: $ms-accent; + } + } + } + + &__row { + display: grid; + grid-template-columns: 1fr 2fr; + align-items: center; + padding: $ms-margin-small; + + border-bottom: $ms-border; + + &--pc, + &--ship { + @extend .sheet-ms-settings__row; + display: none; + } + + button[type="action"] { + width: 50%; + margin: auto; + + border: $ms-border; + + font-family: $ms-fonts-header; + font-weight: bold; + text-transform: uppercase; + } + } + + &__label { + font-family: $ms-fonts-header; + font-size: $ms-font-general; + font-weight: bold; + text-transform: uppercase; + } + + &__setting { + + } + } + + &-ship, + &-npc, + &-pc { + position: relative; + + display: grid; + gap: $ms-margin-large; + + background: $ms-background; + color: $ms-foreground; + + font-family: $ms-fonts-body; + font-size: $ms-font-general; + + h1 { + grid-column: 1 / -1; + + color: $ms-foreground; + + font-family: $ms-fonts-header; + font-size: $ms-font-h1 * 2; + font-weight: bold; + text-align: center; + text-transform: uppercase; + } + + .sheet-ms { + + &-header { + display: grid; + grid-template-columns: 1fr 1fr; + gap: $ms-margin-large; + align-items: center; + grid-column: 1 / -1; + padding: $ms-margin-large; + + background: $ms-invert-background; + color: $ms-invert-foreground; + + font-family: $ms-fonts-header; + font-weight: bold; + text-transform: uppercase; + + &__logo { + + } + + &__details { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + gap: $ms-margin-large; + } + + &__field { + display: flex; + flex-direction: row no-wrap; + align-items: center; + + &--ship_class, + &--type, + &--character_name, + &--level, + &--rank_title, + &--xp, + &--class { + @extend .sheet-ms-header__field; + } + + &--character_name { + grid-column: 1 / -1; + } + + &--rank_title, + &--class { + grid-column: span 3; + } + + &--ship_class, + &--type { + grid-column: span 2; + } + } + + &__title { + flex-shrink: 0; + margin-right: $ms-margin; + } + + &__input[type="text"], + &__input[type="number"] { + flex-grow: 1; + flex-shrink: 1; + + width: 50% !important; + + text-align: center; + font-size: $ms-font-large; + } + } + + &-skillsaves { + display: grid; + grid-template-columns: 2fr 1fr; + grid-gap: $ms-margin; + + } + + &-stats { + display: grid; + grid-template-columns: 1fr 1fr 1.5fr; + + &__toprow { + display: grid; + grid-template-columns: 1fr 1fr 1.5fr; + grid-gap: $ms-margin; + align-items: start; + justify-items: center; + } + + &__main { + grid-column: 1 / span 2; + padding: $ms-margin-large * 2 0; + display: grid; + gap: $ms-margin-large * 3; + } + } + + &-topstat { + display: grid; + justify-items: center; + gap: $ms-margin; + + &__label { + grid-column: 1 / -1; + + font-family: $ms-fonts-header; + font-size: $ms-font-h1; + font-weight: bold; + line-height: 1; + text-align: center; + text-transform: uppercase; + + &--invert { + @extend .sheet-ms-topstat__label; + + padding: 2px 5px; + border-radius: 1em; + + background: $ms-invert-background; + color: $ms-invert-foreground; + + font-size: $ms-font-general; + } + + &--small { + @extend .sheet-ms-topstat__label; + grid-column: span 1; + + font-size: $ms-font-general; + } + } + + input.sheet-ms-topstat__stat[type="number"] { + height: 52px; + width: 52px; + padding: $ms-margin; + border: $ms-border-thicker; + border-radius: 50%; + + font-size: $ms-font-h1; + font-weight: bold; + text-align: center; + } + + &--minmax { + @extend .sheet-ms-topstat; + width: 60%; + grid-template-columns: 1fr 2fr; + justify-self: center; + + .sheet-ms-topstat__label { + text-align: left; + } + } + + &__minmaxwrapper { + grid-column: 1 / -1; + display: grid; + grid-template-columns: 1fr 2fr; + align-items: start; + max-height: 50px; + padding: 0; + + border: $ms-border-thicker; + border-radius: 2.5em; + } + + input.sheet-ms-topstat__max[type="number"] { + height: 50px; + width: 50px; + margin: -4px; + border: $ms-border-thicker; + border-radius: 50%; + + font-size: $ms-font-h1; + font-weight: bold; + text-align: center; + line-height: 1.5; + } + + input.sheet-ms-topstat__min[type="number"] { + height: 45px; + width: 100px; + padding: 0; + margin: 0; + + background: transparent; + + font-size: $ms-font-h1 * 2; + font-weight: bold; + text-align: center; + } + + } + + &-mainstat { + position: relative; + display: grid; + grid-template-columns: 1fr 5em; + align-items: center; + gap: 0; + width: 100%; + + &__label { + border-top-left-radius: 2em; + border-bottom-left-radius: 2em; + + background: $ms-invert-background; + padding: 0 $ms-margin-small; + + button[type="roll"] { + width: 100%; + padding: $ms-margin-small; + + color: $ms-invert-foreground; + + font-family: $ms-fonts-header; + font-size: $ms-font-h1 * 1.2; + font-weight: bold; + text-align: left; + text-transform: uppercase; + + &:hover + .sheet-ms-tooltip { + display: inline-block; + } + } + } + + input.sheet-ms-mainstat__input[type="number"] { + margin: -.75em; + height: 1.75em; + width: 1.75em; + + border: $ms-border-thicker; + border-radius: 4em; + + font-size: $ms-font-h1 * 1.75; + font-weight: bold; + text-align: center; + } + } + + &-patches { + padding: $ms-margin; + margin-top: $ms-margin-large; + + background: $ms-invert-background; + border-radius: 2em; + color: $ms-invert-foreground; + + h1 { + font-size: $ms-font-h1; + + color: $ms-invert-foreground; + } + + &__textarea { + resize: none !important; + + height: 5em !important; + } + } + + &-saves { + display: grid; + grid-template-columns: .25fr 2fr 80px .25fr; + gap: $ms-margin-large 0; + + &__col { + display: grid; + gap: $ms-margin; + + &--right, + &--left { + @extend .sheet-ms-saves__col; + } + + &--right { + padding: 3em $ms-margin; + border-radius: 50%/3em; + + background: $ms-invert-background; + color: $ms-invert-foreground; + } + + &--left { + grid-column: 2; + padding: 3em 0; + + align-items: center; + justify-content: end; + } + } + + button.sheet-ms-saves__name[type="roll"] { + display: block; + margin: 0; + margin-top: $ms-margin-small * 2; + padding: $ms-margin-small; + width: 100%; + + border-radius: 0; + + background: $ms-light; + + font-family: $ms-fonts-header; + font-size: $ms-font-h1 * 1.2; + font-weight: bold; + text-align: left; + text-transform: uppercase; + + &:hover ~ .sheet-ms-tooltip { + display: inline-block; + + left: -50px; + width: 300px; + } + } + + &__label { + position: relative; + } + + .sheet-ms-saves__input[type="number"] { + height: 60px; + width: 60px; + + font-size: $ms-font-h1 * 2; + font-weight: bold; + text-align: center; + } + } + + &-stress_panic { + grid-column: 1 / -1; + display: grid; + grid-template-columns: 1fr 3fr; + align-items: center; + padding: $ms-margin-small; + border-radius: 1.5em; + + background: $ms-invert-background; + color: $ms-invert-foreground; + + font-size: $ms-font-h2; + + &__label { + font-family: $ms-fonts-header; + font-weight: bold; + text-align: center; + text-transform: uppercase; + } + + &__input[type="text"] { + text-align: center; + } + } + + &-cargo, + &-crew, + &-skillpoints { + position: relative; + display: grid; + grid-template-columns: 1fr .75fr; + align-items: center; + padding: $ms-margin-small; + border-radius: 1.5em; + + background: $ms-invert-background; + color: $ms-invert-foreground; + + font-size: $ms-font-h2; + + &__label { + font-family: $ms-fonts-header; + font-weight: bold; + text-align: center; + text-transform: uppercase; + + cursor: pointer; + + &:hover ~ .sheet-ms-tooltip--skills { + left: 0; + display: block; + + font-size: $ms-font-small; + } + } + + &__input[type="number"] { + text-align: center; + } + } + + &-cargowrap { + display: grid; + grid-template-columns: 1fr 1fr; + gap: $ms-margin-large; + margin-top: $ms-margin-large; + } + + &-skills { + position: relative; + + display: grid; + align-items: start; + grid-template-columns: 1fr 1fr 1fr; + gap: $ms-margin-large * 2; + + h1 { + grid-column: span 2; + align-self: center; + text-align: left; + } + + h2 { + padding: $ms-margin-small; + + border: $ms-border-thick; + border-radius: 1em; + + background: $ms-background; + color: $ms-foreground; + + font-family: $ms-fonts-header; + font-size: $ms-font-h2; + font-weight: bold; + line-height: 1; + text-align: center; + text-transform: uppercase; + + cursor: pointer; + + &:hover + .sheet-ms-tooltip { + display: block; + left: 0; + + z-index: 9999; + } + } + + &__trained, + &__expert, + &__master { + display: grid; + gap: 1em; + position: relative; + } + + &__expert, + &__master { + + .sheet-ms-skill { + opacity: .5; + + button[type="roll"], + .sheet-ms-skill__checkmark { + pointer-events: none; + } + } + } + + .repcontainer { + display: grid; + gap: $ms-margin-large; + } + } + + &-skill { + position: relative; + display: grid; + grid-template-columns: 20px 1fr 20px; + align-items: center; + width: 100%; + + &-wrapper { + position: relative; + } + + &:hover + .sheet-ms-tooltip { + cursor: pointer; + + display: inline-block; + } + + &__checkmark { + z-index: 999; + cursor: pointer; + min-height: 26px; + min-width: 26px; + + border: $ms-border-thick; + border-radius: 50%; + background: $ms-background; + + input[type="checkbox"] { + display: none; + + &:checked { + + + span { + display: block; + height: 20px; + width: 20px; + border-radius: 50%; + + background: $ms-background url("https://s3.amazonaws.com/files.d20.io/images/138210119/cvUNlZk3lj7GZXQEsKIBWw/max.png?1590443685") no-repeat center/75%; + } + } + } + } + + &__button { + margin-left: -1em; + + button[type="roll"] { + width: 85%; + min-height: 3em; + border-radius: 2em; + padding: .75em; + padding-left: 1.5em; + + background: $ms-invert-background; + color: $ms-invert-foreground !important; + + font-family: $ms-fonts-header; + font-size: $ms-font-general; + font-weight: bold; + text-align: left; + text-transform: uppercase; + } + } + + &__cog { + cursor: pointer; + + &:hover span { + opacity: 1; + } + + input[type="checkbox"] { + display: none; + + &:checked + span { + opacity: 1; + } + } + + span { + opacity: 0.125; + + font-family: $ms-pictos; + font-size: $ms-font-large; + } + } + + &__settings { + grid-column: 1 / -1; + + display: none; + gap: $ms-margin-small; + margin: $ms-margin-small; + padding: $ms-margin-small; + + border-top: $ms-border-settings-highlight; + + background: $ms-light; + background-clip: padding-box; + + &row { + &:not(:first-child) { + border-top: $ms-recessed; + } + } + + &title { + font-family: $ms-fonts-header; + font-size: $ms-font-general; + font-weight: bold; + text-transform: uppercase; + } + + input.sheet-ms-skill__settingsinput[type="text"] { + border-radius: 2em; + font-size: $ms-font-general !important; + } + } + + &--repeating { + @extend .sheet-ms-skill; + + button[type="roll"] { + pointer-events: unset !important; + } + + opacity: 1 !important; + } + + input[name*="settings"][value="on"] ~ .sheet-ms-skill__settings { + display: grid; + } + } + + &-tooltip { + display: none; + position: absolute; + top: 25px; + left: 50px; + z-index: 1000; + + min-width: 60px; + max-width: 250px; + min-height: 1.5rem; + margin: 1rem; + padding: 1rem; + + border-radius: 1em; + + background: $ms-tooltip-background; + color: $ms-invert-foreground; + + strong.sheet-ms-tooltip__label { + font-family: $ms-fonts-header; + font-weight: bold; + text-transform: uppercase; + + &:after { + display: inline; + content: ":"; + margin-right: .5rem; + } + + + span { + text-transform: capitalize; + + &:first-letter { + text-transform: uppercase; + } + } + } + + > div { + text-transform: capitalize; + } + + p { + margin: 0; + padding: 0; + font-family: $ms-fonts-body; + + &:first-letter { + text-transform: uppercase; + } + } + + &--skills { + @extend .sheet-ms-tooltip; + width: 600px !important; + padding: $ms-margin-small; + + ul { + margin: 0; + padding: 0; + + li { + margin: none; + list-style-type: none; + + text-align: center; + + strong { + display: block; + + font-family: $ms-fonts-header; + text-transform: uppercase; + } + } + } + + > span { + grid-column: 1 / -1; + display: block; + + text-align: center; + + &:first-letter { + text-transform: uppercase; + } + } + } + } + + &-gear { + display: grid; + grid-template-columns: 1fr 1.5fr; + grid-gap: $ms-margin; + } + + &-credits { + position: absolute; + bottom: 0; + right: 0; + + display: grid; + grid-template-columns: 1fr 1.5fr; + align-items: center; + width: 90%; + margin-top: $ms-margin; + padding: $ms-margin-small; + border-top-left-radius: 1.5em; + + background: $ms-invert-background; + color: $ms-invert-foreground; + + font-size: $ms-font-h2; + + &__label { + font-family: $ms-fonts-header; + font-weight: bold; + text-align: center; + text-transform: uppercase; + } + + &__input[type="text"] { + text-align: center; + } + } + + &-shipcargo, + &-shipofficers, + &-shipweapons, + &-attacks, + &-equipment { + position: relative; + padding: $ms-margin; + border: $ms-border-thick; + + border-bottom-left-radius: 1.5em; + border-bottom-right-radius: 1.5em; + + overflow: hidden; + + h1 { + width: 90%; + margin-top: -$ms-margin; + margin-left: -$ms-margin; + margin-bottom: $ms-margin; + padding: $ms-margin-small; + border-bottom-right-radius: 1.5em; + + background: $ms-invert-background; + color: $ms-invert-foreground; + + font-size: $ms-font-h1; + font-family: $ms-fonts-header; + text-align: left; + } + } + + &-shipcargo { + .repcontainer { + display: grid; + grid-template-columns: 1fr 1fr; + gap: $ms-margin-small; + } + } + + &-equipment { + padding-bottom: 3em; + } + + &-shipcargorow, + &-shipofficerrow, + &-shipweaponrow, + &-equipmentrow, + &-npcattackrow, + &-npcabilityrow, + &-attackrow { + display: grid; + gap: 0 $ms-margin; + align-items: center; + margin-bottom: $ms-margin-small; + padding-bottom: $ms-margin-small; + + border-bottom: $ms-border-thick; + + > * { + &:not(:first-child) { + text-align: center; + } + } + + &__name, + &__type { + + &--head { + font-family: $ms-fonts-header; + font-weight: bold; + + text-transform: uppercase; + } + } + + &__name { + text-align: left !important; + } + + &--head { + + > div { + &:not(:first-child) { + text-align: center; + } + } + } + + select, + input[type="number"], + input[type="text"], + textarea { + border-radius: .5rem; + background-color: $ms-lighter; + } + + &__cog { + cursor: pointer; + + &:hover span { + opacity: 1; + } + + input[type="checkbox"] { + display: none; + + &:checked + span { + opacity: 1; + } + } + + span { + opacity: 0.125; + + font-family: $ms-pictos; + font-size: $ms-font-large; + } + } + + button[type="roll"] { + font-weight: bold; + text-align: left; + } + + &__settings { + grid-column: 1 / -1; + + display: none; + gap: $ms-margin-small; + margin: $ms-margin-small; + padding: $ms-margin-small; + + border-top: $ms-border-settings-highlight; + + background: $ms-light; + background-clip: padding-box; + + &row { + &:not(:first-child) { + border-top: $ms-recessed; + } + } + + &title { + font-family: $ms-fonts-header; + font-size: $ms-font-general; + font-weight: bold; + text-transform: uppercase; + } + + input[type="text"], + textarea { + border-radius: 1em; + background-color: $ms-background; + } + } + } + + &-equipmentrow { + grid-template-columns: 1fr .75fr 2em; + + &--head { + @extend .sheet-ms-equipmentrow; + } + + input[name*="settings"][value="on"] ~ .sheet-ms-equipmentrow__settings { + display: grid; + } + + &__settingsrow { + display: grid; + grid-template-columns: 1fr 1fr; + gap: $ms-margin; + + &--full { + @extend .sheet-ms-equipmentrow__settingsrow; + grid-template-columns: 1fr; + } + } + + .sheet-show_armor { + display: none; + } + + input[name*="type"][value*="Armor"] ~ * .sheet-show_armor { + display: grid; + } + } + + &-attackrow { + grid-template-columns: 1.5fr 1fr 1fr 2em; + + &--head { + @extend .sheet-ms-attackrow; + } + + input[name*="settings"][value="on"] ~ .sheet-ms-attackrow__settings { + display: grid; + } + + &__settingsrow { + display: grid; + grid-template-columns: 1fr 1fr; + gap: $ms-margin; + + &--full, + &--range { + @extend .sheet-ms-attackrow__settingsrow; + } + + &--full { + grid-template-columns: 1fr; + } + + &--range { + grid-column: 1 / -1; + display: grid; + grid-template-columns: 1fr 1fr 1fr; + + .sheet-ms-attackrow__settingstitle { + grid-column: 1 / -1; + } + } + + &--critical { + grid-column: 1 / -1; + display: grid; + grid-template-columns: 1fr 1fr; + } + } + + .sheet-show_ranged { + display: none; + } + + select[name*="type"][value*="Ranged"] ~ * .sheet-show_ranged { + display: grid; + } + } + + &-npcattackrow { + display: flex; + justify-content: flex-start; + align-items: center; + flex-wrap: wrap; + gap: .125rem !important; + height: 2.5rem; + + border-bottom: 0; + + &__cog { + flex-basis: 3rem; + margin-left: auto !important; + } + + &__settings { + flex-basis: 100%; + margin-left: auto !important; + } + + &__arrow { + flex-basis: 1em; + font-family: $ms-pictos; + } + + &--head { + @extend .sheet-ms-npcattackrow; + } + + input[name*="settings"][value="on"] ~ .sheet-ms-npcattackrow__settings { + display: grid; + } + } + + &-npcabilityrow { + border-bottom: 0px; + } + + &-npcabilityrow { + grid-template-columns: 1fr 3rem; + + &--head { + @extend .sheet-ms-npcabilityrow; + } + + input[name*="settings"][value="on"] ~ .sheet-ms-npcabilityrow__settings { + display: grid; + } + + &__text { + grid-column: 1 / -1; + padding: 0 $ms-margin-large; + + font-size: $ms-font-large; + text-align: left !important; + } + } + + &-shipweaponrow { + grid-template-columns: 1fr 1fr 2em; + + &--head { + @extend .sheet-ms-shipweaponrow; + } + + input[name*="settings"][value="on"] ~ .sheet-ms-shipweaponrow__settings { + display: grid; + } + } + + &-shipofficerrow { + grid-template-columns: 1fr 1fr; + + &--head { + @extend .sheet-ms-shipofficerrow; + } + + input[name*="settings"][value="on"] ~ .sheet-ms-shipofficerrow__settings { + display: grid; + } + } + + &-shipcargorow { + grid-template-columns: 1fr .25fr; + + &--head { + display: grid; + grid-template-columns: 1fr .25fr 1fr .25fr; + } + + input[name*="settings"][value="on"] ~ .sheet-ms-shipofficerrow__settings { + display: grid; + } + } + + &-shipbuilder { + position: relative; + + grid-column: 1 / -1; + + display: grid; + gap: $ms-margin-large; + margin-top: $ms-margin-large * 1.5; + padding: $ms-margin-large; + + border: 3px dashed $ms-foreground; + border-radius: 4rem; + + h2 { + display: inline; + padding: $ms-margin-small; + padding-right: 0; + + background: $ms-invert-background; + color: $ms-invert-foreground; + + border-radius: 2rem; + + font-family: $ms-fonts-header; + text-transform: uppercase; + + .sheet-ms-invert { + margin: $ms-margin-small; + padding: 0 $ms-margin-small; + + background: $ms-background; + color: $ms-foreground; + + border-radius: 2em; + } + } + + &__hwrap { + grid-column: 1 / -1; + } + + &__block { + display: grid; + grid-template-columns: 1fr 1fr; + + border: $ms-border-thick; + + &--engine { + + .sheet-ms-shipbuilder__flex > * { + margin-right: 0; + } + + } + } + + &__title { + grid-column: 1 / -1; + padding: 0; + + h3 { + display: inline-block; + min-width: 50%; + padding: $ms-margin-small $ms-margin-large; + margin: 0; + padding-right: $ms-margin-large; + + border-bottom-right-radius: 2em; + + background: $ms-invert-background; + color: $ms-invert-foreground; + + font-family: $ms-fonts-header; + text-align: left; + text-transform: uppercase; + } + } + + &__flex { + display: flex; + align-items: center; + justify-content: space-between; + padding: $ms-margin; + + > * { + margin-right: 3rem; + } + } + + &__desc { + padding: $ms-margin-small $ms-margin-large; + + p { + font-family: $ms-fonts-body; + } + } + + &__item { + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 4rem 1fr; + justify-content: center; + + max-width: 6rem; + min-height: 8rem; + + text-align: center; + } + + &__label { + font-family: $ms-fonts-header; + font-size: $ms-font-small; + font-weight: bold; + text-transform: uppercase; + } + + &__hull { + padding: $ms-margin; + } + + &__arrow, + &__equals, + &__modifier { + margin-top: -3rem; + min-height: 3rem; + min-width: 3rem; + max-height: 3rem; + max-width: 3rem; + padding: .5rem; + + line-height: 1.5em; + + border-radius: 4rem; + + background: $ms-invert-background; + color: $ms-invert-foreground; + + text-align: center; + font-weight: bold; + + } + + &__spacer { + min-width: 4rem; + max-width: 4rem; + } + + &__arrow { + font-family: $ms-pictos; + } + + &__display { + display: block; + height: 3.5rem; + width: 3.5rem; + margin:auto; + padding: .5em 0; + + border: $ms-border; + + background: $ms-light; + + font-size: $ms-font-general; + font-weight: bold; + text-align: center; + } + + &__panel { + grid-column: 1 / -1; + position: sticky; + bottom: 0; + display: flex; + align-items: flex-start; + justify-content: space-around; + padding: $ms-margin-large; + + border-top: $ms-border-thicker; + background: $ms-light; + + font-size: $ms-font-large; + + &item { + text-align: center; + } + } + + &__wrapdisplay { + display: flex; + align-items: baseline; + } + + &__largelabel { + font-family: $ms-fonts-header; + font-size: $ms-font-large; + text-align: center; + text-transform: uppercase; + font-weight: bold; + } + + &__largedisplay { + display: block; + + font-size: $ms-font-h1 * 2; + font-weight: bold; + text-align: center; + + &:empty { + &:before { + content: "-" + } + } + } + + &__complete { + grid-column: 1 / -1; + text-align: center; + + button[type="action"] { + border: $ms-border-thick; + padding: $ms-margin-large; + + border-radius: 1rem; + + font-family: $ms-fonts-header; + font-size: $ms-font-h1 * 2; + font-weight: bold; + text-transform: uppercase; + + &:hover { + color: $ms-accent; + border-color: $ms-accent; + } + } + } + + input[type="number"].sheet-ms-shipbuilder__input { + height: 3.5rem; + width: 3.5rem; + margin:auto; + padding: 0; + + border: $ms-border; + + text-align: center; + } + } + + &-shipwrapper { + display: grid; + grid-template-columns: .75fr 1fr 1fr; + gap: $ms-margin-large; + padding-bottom: 14rem; + } + + &-crewwrap { + display: grid; + grid-template-rows: auto 3rem 3rem; + gap: $ms-margin-large; + align-items: start; + } + + &-shipstats { + grid-row: span 3; + align-self: start; + + display: grid; + gap: $ms-margin-large; + align-items: start; + + .sheet-ms-mainstat { + display: grid; + grid-template-columns: 1fr 3rem; + margin-top: $ms-margin-large * 2; + } + + .sheet-ms-topstat--minmax { + gap: .5rem; + + width: 80%; + } + } + + &-hullvalues { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: $ms-margin-small; + width: 80%; + margin: auto; + + input[name="attr_hull_toggle"] { + &[value="25"] ~ { + .sheet-ms-topstat--25 { + .sheet-ms-topstat__stat { + border-color: $ms-accent; + } + .sheet-ms-topstat__label--invert { + background-color: $ms-accent; + } + } + } + + &[value="50"] ~ { + .sheet-ms-topstat--50, + .sheet-ms-topstat--25 { + .sheet-ms-topstat__stat { + border-color: $ms-accent; + } + .sheet-ms-topstat__label--invert { + background-color: $ms-accent; + } + } + } + + &[value="75"] ~ { + .sheet-ms-topstat--75, + .sheet-ms-topstat--50, + .sheet-ms-topstat--25 { + .sheet-ms-topstat__stat { + border-color: $ms-accent; + } + .sheet-ms-topstat__label--invert { + background-color: $ms-accent; + } + } + } + } + } + + &-shipcargo { + grid-column: span 2; + } + + &-shipsecondaries { + grid-column: span 2; + + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + gap: $ms-margin; + padding: $ms-margin; + + .sheet-ms-topstat { + grid-template-rows: 2em 1fr; + gap: .5em; + + position: relative; + width: 100%; + margin-bottom: 32px; + padding-bottom: 10px; + + background: $ms-light; + border-radius: 2rem; + + &__label { + align-self: center; + font-size: $ms-font-general; + + cursor: pointer; + + &:hover + .sheet-ms-tooltip { + display: inline-block; + left: calc(50% - 150px); + width: 400px; + } + } + + &__stat { + margin-bottom: -32px; + } + } + } + } + } + + &-npcwrapper { + display: block; + + > input { + float: right; + } + } + + &-npcsettings { + display: grid; + grid-template-columns: 1fr 1fr; + + &__row { + display: grid; + grid-template-columns: .5fr 1fr; + gap: $ms-margin-large; + padding: $ms-margin-small; + border-bottom: 1px solid $ms-foreground; + } + } + + &-npcname { + display: flex; + align-items: center; + min-height: 10rem; + padding: 2em; + padding-bottom: 0; + padding-left: 1em; + + background: $ms-invert-background; + color: $ms-invert-foreground; + + button[type="action"].sheet-ms-npcname_button { + border: none; + background: transparent; + padding: 0 !important; + margin: 0; + + color: $ms-foreground; + + font-family: $ms-fonts-header; + font-size: 38pt; + color: $ms-invert-foreground; + font-weight: bold; + text-transform: uppercase; + + &:hover { + color: $ms-accent; + } + + &:active { + padding: 0; + margin: 0; + text-indent: 0; + } + } + + button.sheet-ms-npcname_switch, + input[type="text"] { + display: none; + } + + button.sheet-ms-npcname_switch { + height: 4rem; + width: 4rem; + min-height: 4rem; + min-width: 4rem; + max-height: 4rem; + max-width: 4rem; + margin-left: 1rem; + + border: $ms-invert-foreground 3px solid; + border-radius: 2rem !important; + background: $ms-invert-background; + color: $ms-invert-foreground; + + font-size: 14pt; + font-weight: bold; + } + + input[type="text"][name="attr_character_name"] { + max-width: 50%; + margin: 0; + padding: 0; + + border-bottom: $ms-border-thick !important; + + font-family: $ms-fonts-header; + font-size: 24pt !important; + font-weight: bold; + } + + input[type="hidden"][value="on"] { + & ~ input[type="text"], + & ~ button.sheet-ms-npcname_switch { + display: block; + } + + & ~ .sheet-ms-npcname_button { + display: none; + } + } + } + + + &-npcstats { + display: grid; + grid-template-columns: 1fr 1fr 1fr .75fr; + align-items: center; + gap: $ms-margin; + margin: $ms-margin-large 0; + + .sheet-ms-mainstat { + grid-template-columns: 1fr 3em; + } + } + + &-npcrepeating { + display: grid; + grid-template-columns: 1fr 1fr; + gap: $ms-margin-large; + + h3 { + border-bottom: $ms-border-thick; + margin-bottom: 1rem; + + font-family: $ms-fonts-header; + font-size: 18pt; + line-height: 16pt; + text-transform: uppercase; + } + + .repcontrol { + margin: $ms-margin-large 0; + } + } + + &-npcdescription { + h3 { + border-bottom: $ms-border-thick; + margin-bottom: 1rem; + + font-family: $ms-fonts-header; + font-size: 18pt; + line-height: 16pt; + text-transform: uppercase; + } + } +} + +@import "rolltemplate"; +@import "skillcontrol"; @import "tabcontrol"; \ No newline at end of file diff --git a/Ryuutama/images/gmCharacterSheetBanner.svg b/Ryuutama/images/gmCharacterSheetBanner.svg index cf473b0fa5..d16c93c3f2 100644 --- a/Ryuutama/images/gmCharacterSheetBanner.svg +++ b/Ryuutama/images/gmCharacterSheetBanner.svg @@ -1,687 +1,687 @@ - - - - - - + + + + + + diff --git a/Ryuutama/images/rollTitleBookendLeft.svg b/Ryuutama/images/rollTitleBookendLeft.svg index d1cef65f47..cc55e24d90 100644 --- a/Ryuutama/images/rollTitleBookendLeft.svg +++ b/Ryuutama/images/rollTitleBookendLeft.svg @@ -1,327 +1,327 @@ - - - - - - + + + + + + diff --git a/Ryuutama/images/rollTitleBookendRight.svg b/Ryuutama/images/rollTitleBookendRight.svg index cd5b5262b8..dca83d5b88 100644 --- a/Ryuutama/images/rollTitleBookendRight.svg +++ b/Ryuutama/images/rollTitleBookendRight.svg @@ -1,327 +1,327 @@ - - - - - - + + + + + + diff --git a/Ryuutama/images/rtlogo.svg b/Ryuutama/images/rtlogo.svg index 332fdee2fb..424df048a3 100644 --- a/Ryuutama/images/rtlogo.svg +++ b/Ryuutama/images/rtlogo.svg @@ -1,469 +1,469 @@ - - - - - - + + + + + + diff --git a/Swordpoint/README.md b/Swordpoint/README.md index 95ff13e3bf..95232e8f3b 100644 --- a/Swordpoint/README.md +++ b/Swordpoint/README.md @@ -1,2 +1,2 @@ -Swordpoint-character-sheet -Fan made character sheet for the Swordpoint TTRPG by Gallant Knight Games +Swordpoint-character-sheet +Fan made character sheet for the Swordpoint TTRPG by Gallant Knight Games diff --git a/Swordpoint/sheet.json b/Swordpoint/sheet.json index abf5cce41a..980d3c8ed8 100644 --- a/Swordpoint/sheet.json +++ b/Swordpoint/sheet.json @@ -1,9 +1,9 @@ -{ - "html": "swordpoint.html", - "css": "swordpoint.css", - "authors": "Steve Valladolid", - "roll20userid": "3665541", - "preview": "swordpoint.png", - "instructions": "Fan Made Character Sheet for the Swordpoint RPG by Gallant Knight Games", - "legacy": true -} +{ + "html": "swordpoint.html", + "css": "swordpoint.css", + "authors": "Steve Valladolid", + "roll20userid": "3665541", + "preview": "swordpoint.png", + "instructions": "Fan Made Character Sheet for the Swordpoint RPG by Gallant Knight Games", + "legacy": true +} diff --git a/Swordpoint/swordpoint.css b/Swordpoint/swordpoint.css index 3e345d4e5a..db42a85e2a 100644 --- a/Swordpoint/swordpoint.css +++ b/Swordpoint/swordpoint.css @@ -1,33 +1,33 @@ - -.charsheet { - background-color: #faf2f0; - min-width: 600px; - - -label { - display: inline-block; - width: 15%; -} - - -input { - display: inline-block; - width: 50px; -} - -option { - display: inline-block; - width: 50px; -} - - -textarea { - max-width:70%; - max-height:10px; - -} - - - - - + +.charsheet { + background-color: #faf2f0; + min-width: 600px; + + +label { + display: inline-block; + width: 15%; +} + + +input { + display: inline-block; + width: 50px; +} + +option { + display: inline-block; + width: 50px; +} + + +textarea { + max-width:70%; + max-height:10px; + +} + + + + + diff --git a/Swordpoint/swordpoint.html b/Swordpoint/swordpoint.html index ae18ff6df5..f45965517f 100644 --- a/Swordpoint/swordpoint.html +++ b/Swordpoint/swordpoint.html @@ -1,243 +1,243 @@ -
-
- -
- -

-

-

- - -
- -
-
- Character Name:
- Age:
- Profession:
-
-
- -
-
- Rank:
- Experience Points:
-
-
-
-

- -Background:
-
- -

-

- - -

Characteristics

- -

-

- -

- -
- -
- - STR: 
- - CON:
- - COU:
- -   INT:
- - POW:
- -  DEX:
- -  APP:
- -
- -
- -
- -
- - DAMAGE MODIFIER:
- - HIT POINTS:           /
- -
-
- MAGIC POINTS:    
- MOVEMENT (M):   
- STYLE POINTS:      /
- -
-
-
- - - - -

- -

Skills

-

- -

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

- - - -

Conditions

- -

- -
- Afraid - Confused - Exhausted - Heartbroken - Helpless - Sick - Wounded -
- -

- -

Melee / Ranged Attacks

-
*Input weapon name, attack skill value and damage including applicable damage bonus*
-

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

- -

Equipment & Gear

-
*A character carrying total ENC greater than their STR is Overloaded (-20% on physical actions) and move at half speed.*
- -

-
- Item: Enc: Info: -
- -

- -

Spells

- -

-
- Spell: Range: Cost:  MP   Effect  Duration: -
- -

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

+

+

+ + +
+ +
+
+ Character Name:
+ Age:
+ Profession:
+
+
+ +
+
+ Rank:
+ Experience Points:
+
+
+
+

+ +Background:
+
+ +

+

+ + +

Characteristics

+ +

+

+ +

+ +
+ +
+ + STR: 
+ + CON:
+ + COU:
+ +   INT:
+ + POW:
+ +  DEX:
+ +  APP:
+ +
+ +
+ +
+ +
+ + DAMAGE MODIFIER:
+ + HIT POINTS:           /
+ -
+
+ MAGIC POINTS:    
+ MOVEMENT (M):   
+ STYLE POINTS:      /
+ +
+
+
+ + + + +

+ +

Skills

+

+ +

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

+ + + +

Conditions

+ +

+ +
+ Afraid + Confused + Exhausted + Heartbroken + Helpless + Sick + Wounded +
+ +

+ +

Melee / Ranged Attacks

+
*Input weapon name, attack skill value and damage including applicable damage bonus*
+

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

+ +

Equipment & Gear

+
*A character carrying total ENC greater than their STR is Overloaded (-20% on physical actions) and move at half speed.*
+ +

+
+ Item: Enc: Info: +
+ +

+ +

Spells

+ +

+
+ Spell: Range: Cost:  MP   Effect  Duration: +
+ +

+ + + + + + diff --git a/WarlockOSR/assets/icons/gem-pendant.svg b/WarlockOSR/assets/icons/gem-pendant.svg index d6db34b70a..ed4551b7a8 100644 --- a/WarlockOSR/assets/icons/gem-pendant.svg +++ b/WarlockOSR/assets/icons/gem-pendant.svg @@ -1,9 +1,9 @@ - - - - - - - - + + + + + + + + \ No newline at end of file