Files

255 lines
15 KiB
Plaintext

//-Variables
-
const currencyAbbreviations = {
shillings:'sh',
pounds:'l',
pennies:'p'
};
-
const textareaConverter = {
lineage:{obj:{name:'lineage',value:'','data-i18n-placeholder':`what's your lineage?`,class:'boxed'},header:'family lineage'},
retainers:{obj:{name:'retainers',value:'','data-i18n-placeholder':`what retainers do you have?`,class:'boxed'},header:'retainers & mounts'},
influence:{obj:{name:'influence',value:'','data-i18n-placeholder':`what is your influence in the world?`,class:'boxed'},header:'power & influence'},
information:{obj:{name:'information',value:''},header:'other information'}
};
-
const critEffects = [
{helperObj:{func:'rollLess',field:'crit_roll',values:'4'},display:'^{crit 1-3}'},
{helperObj:{func:'rollBetween',field:'crit_roll',values:'4 6'},display:'^{crit 4-6}'},
{helperObj:{func:'rollBetween',field:'crit_roll',values:'7 9'},display:'^{crit 7-9}'},
{helperObj:{func:'rollBetween',field:'crit_roll',values:'10 11'},display:'^{crit 10-11}'},
{helperObj:{func:'rollTotal',field:'crit_roll',values:'12'},display:'^{crit 12}'},
{helperObj:{func:'rollTotal',field:'crit_roll',values:'13'},display:'^{crit 13}'},
{helperObj:{func:'rollTotal',field:'crit_roll',values:'14'},display:'^{crit 14}'},
{helperObj:{func:'rollTotal',field:'crit_roll',values:'15'},display:'^{crit 15}'},
{helperObj:{func:'rollTotal',field:'crit_roll',values:'16'},display:'^{crit 16}'},
{helperObj:{func:'rollTotal',field:'crit_roll',values:'17'},display:'^{crit 17}'},
{helperObj:{func:'rollTotal',field:'crit_roll',values:'18'},display:'^{crit 18}'},
{helperObj:{func:'rollTotal',field:'crit_roll',values:'19'},display:'^{crit 19}'},
{helperObj:{func:'rollTotal',field:'crit_roll',values:'20'},display:'^{crit 20}'},
{helperObj:{func:'rollGreater',field:'crit_roll',values:'20'},display:'^{crit 21}'}
];
- saves = [{name:'movement restrictions (Str)',ability:'strength'},{name:'area effects & reflexes (Dex)',ability:'dexterity'},{name:'poison and disease and instant death (Con)',ability:'constitution'},{name:'mental effects (Int)',ability:'intelligence'},{name:'magical effects (Wis)',ability:'wisdom'}];
- let format;
//- Mixins
include htmlelements.pug
include rolltemplate mixins.pug
//- End mixins
+input({name:'template_start',type:'hidden',value:'&{template:lion_dragon} {{character_name=@{character_name}}} {{character_id=@{character_id}}}'})
+input({name:'sheet_version',type:'hidden',value:'0'})
- let section;
main
+input({name:'page_control',type:'radio',value:'1',id:'page-1-radio','class':'page-1-radio hidden',checked:'true'})
+input({name:'page_control',type:'radio',value:'2',id:'page-2-radio','class':'page-2-radio hidden'})
+input({name:'page_control',type:'radio',value:'all',id:'page-all-radio','class':'page-all-radio page-2-radio page-1-radio hidden'})
section#general
h1(data-i18n='Lion & Dragon').sheet-head
+label({class:'pseudo-button','for':'page-1-radio','data-i18n':'basics',id:'page-1-label'})
+label({class:'pseudo-button','for':'page-2-radio','data-i18n':'advanced',id:'page-2-label'})
+label({class:'pseudo-button','for':'page-all-radio','data-i18n':'all pages',id:'page-all-label'})
each val in ['character name','class','level','alignment']
- format;
+input-label(val,{name:val.replace(/\s/g,'_'),value:'',type:'text'},{class:`under ${val.replace(/\s+/g,'-')}`})
each val in ['social class','background']
- format;
+input-label(val,{name:val.replace(/\s/g,'_'),value:'',type:'text'},{class:`under ${val.replace(/&/g,'').replace(/\s+/g,'-')}`})
+dual-input-label('experience',[{name:'experience',value:'0',type:'number'},{name:'experience_max',value:'0',type:'number'}],{class:'experience under'})
.saving-throw
span.h3(data-i18n='saving throw')
+input-label('base',{name:'saving_throw',value:'16',type:'number',class:'ratio1-1 boxed'},{class:'under'})
+button({name:'saving_throw',type:'roll',value:'@{template_start}{{title=^{saving throw}}} {{roll=[[1d20]]}} {{dc=@{saving_throw}}}','class':'d20'})
+headedTextarea({name:'languages',value:'','data-i18n-placeholder':'what languages do you speak and/or read',class:'boxed'},'languages').languages
section#page-1.page
#ability-scores
.scores
each val in ['strength','dexterity','constitution','intelligence','wisdom','charisma']
- format;
+input-label(val.replace(/(.{3}).+/,'$1'),{name:val.replace(/\s/g,'_'),value:'10',type:'number',class:'ratio1-1 boxed'},{class:`over ${val}`})
+input({name:`${val}_mod`,type:'hidden',value:'0',class:`plus-control`})
+span({name:`${val}_mod`,class:`mod ${val} h3`})=0
+button({name:`${val}`,type:'roll',value:`@{template_start} {{title=^{${val}}}} {{roll=[[1d20+@{${val}_mod}]]}}`,'class':'d20'})
- format;
.derivatives
each obj in saves
- val = obj.name;
- format;
+input({name:`${val.replace(/\s+\(.+$/,'').replace(/\s/g,'_')}`,type:'number',value:'0',class:'boxed ratio1-1'})
span(data-i18n=val)
+button({name:`${val.replace(/\s+\(.+$/,'').replace(/\s/g,'_')}`,type:'roll',value:`@{template_start} {{title=^{${val}}}} {{roll=[[1d20+@{${val.replace(/\s+\(.+$/,'').replace(/\s/g,'_')}}+@{${obj.ability}_mod}]]}} {{dc=@{saving_throw}}}`,class:'d20'})
#defenses
+input-label('armor class',{name:'armor_class',type:'number',value:'10',class:'circle ratio1-1 boxed'},{class:'armor-class large'})
+input-label('shielded',{name:'shielded_armor_class',type:'number',value:'10',class:'circle ratio1-1 boxed'},{class:'shielded large'})
each val in ['armor','shield']
- format;
+input-label(val,{name:val,type:'text',value:'',class:'boxed'},{class:`${val} under`})
each val in ['hp','hp_max']
- format;
+input-label(val,{name:val,type:'number',value:'0',class:'boxed'},{class:`${val} under large`})
each val in ['initiative','base attack']
- format;
+input-label(val,{name:val,type:'number',value:'0',class:'boxed'},{class:`${val.replace(/\s+/,'-')} under large`})
+headedTextarea({name:'injuries','class':'boxed injuries fixed'},'injuries').injuries
+repeating_section('skills','skills')
- section = 'skills';
+input({name:'name',type:'text',value:'','data-i18n-placeholder':'skill name',title:repeatAttrTitle(section,'name')})
+input({name:'mod',type:'number',value:'',class:'boxed',title:repeatAttrTitle(section,'mod')})
+button({name:'roll',value:'@{template_start} {{title=@{name}}} {{roll=[[1d20+@{mod}]]}}',title:repeatButtonTitle(section)})
+repeating_section('benefits','class benefits')
- section = 'benefits';
+input({name:'name',type:'text',value:'',title:repeatAttrTitle(section,'name'),'data-i18n-placeholder':'benefit name'})
#arms.repeating-arms
h3(data-i18n="arms")
.repeat-columns
each label in ['weapon','ability','base','misc','damage','ability','misc','range','description']
-format;
h4(data-i18n=`${label}`)
fieldset(class=`repeating_arms`)
- section = 'arms';
+input({name:'name',type:'text',value:'',title:repeatAttrTitle(section,'name'),'data-i18n-placeholder':'weapon name',class:'right'})
+select({name:'type',title:repeatAttrTitle(section,'type')},
{value:'0','data-i18n':'none'},
{value:'@{strength_mod}',selected:'true','data-i18n':'melee'},
{value:'@{dexterity_mod}','data-i18n':'ranged'},
{value:'@{constitution_mod}','data-i18n':'constitution'},
{value:'@{intelligence_mod}','data-i18n':'intelligence'},
{value:'@{wisdom_mod}','data-i18n':'wisdom'},
{value:'@{charisma_mod}','data-i18n':'charisma'}
)
+input({name:'base_mod',type:'hidden',value:'0',class:'plus-control'})
+span({name:'base_mod',class:'h4',title:repeatAttrTitle(section,'base_mod')}) 0
+input({name:'custom_mod',type:'text',value:'',title:repeatAttrTitle(section,'custom_mod'),placeholder:0})
- format;
+input({name:'damage',type:'text',value:'','data-i18n-placeholder':'e.g. 1d8',title:repeatAttrTitle(section,'damage')})
+select({name:'damage ability',title:repeatAttrTitle(section,'damage_ability')},
{value:'0','data-i18n':'none',selected:'true'},
{value:'@{strength_mod}','data-i18n':'strength'},
{value:'@{dexterity_mod}','data-i18n':'dexterity'},
{value:'@{constitution_mod}','data-i18n':'constitution'},
{value:'@{intelligence_mod}','data-i18n':'intelligence'},
{value:'@{wisdom_mod}','data-i18n':'wisdom'},
{value:'@{charisma_mod}','data-i18n':'charisma'}
)
+input({name:'damage mod',type:'text',value:'',title:repeatAttrTitle(section,'damage_mod')})
+input({name:'range',type:'text',value:'','data-i18n-placeholder':'S/M/L',title:repeatAttrTitle(section,'range')})
+input({name:'description',type:'text',value:'',title:repeatAttrTitle(section,'description')})
+button({name:'roll',value:'@{template_start} {{title=@{name}}} {{roll=[[1d20+@{base_attack}[Base Attack]+@{type}[Ability]+[[0@{custom_mod}]][Custom Mod]]]}} {{damage=[[0@{damage}+@{damage_ability}[Ability]+[[0@{damage_mod}]][Custom Mod]]]}} {{range=@{range}}} {{description=@{description}}}',title:repeatButtonTitle(section)})
.repeating-equipment(id='equipment')
- section = 'equipment';
h3.header(data-i18n=section)
h4.label(data-i18n="encumbrance")
+input({name:'encumbrance',type:'number',value:'0',class:'boxed',readonly:true})
fieldset(class=`repeating_${section}`)
+input({name:'name',type:'text',value:'','data-i18n-placeholder':'item name',title:repeatAttrTitle(section,'name')})
+input({name:'weight',type:'number',value:'',class:'boxed',title:repeatAttrTitle(section,'weight')})
#defensive-combat.repeating-parry
h3(data-i18n="defensive combat")
.repeat-columns
each label in ['weapon','ability','base','misc','block','ability','misc']
-format;
h4(data-i18n=`${label}`)
fieldset(class=`repeating_parry`)
- section = 'parry';
+input({name:'name',type:'text',value:'',title:repeatAttrTitle(section,'name'),'data-i18n-placeholder':'weapon name',class:'right'})
+select({name:'type',title:repeatAttrTitle(section,'type')},
{value:'0','data-i18n':'none'},
{value:'2','data-i18n':'shield'},
{value:'@{strength_mod}',selected:'true','data-i18n':'melee'},
{value:'@{dexterity_mod}','data-i18n':'dexterity'},
{value:'@{constitution_mod}','data-i18n':'constitution'},
{value:'@{intelligence_mod}','data-i18n':'intelligence'},
{value:'@{wisdom_mod}','data-i18n':'wisdom'},
{value:'@{charisma_mod}','data-i18n':'charisma'}
)
+input({name:'base_mod',type:'hidden',value:'0',class:'plus-control'})
+span({name:'base_mod',class:'h4',title:repeatAttrTitle(section,'base_mod')}) 0
+input({name:'custom_mod',type:'text',value:'',title:repeatAttrTitle(section,'custom_mod'),placeholder:0})
- format;
+input({name:'block',type:'text',value:'','data-i18n-placeholder':'e.g. 1d8',title:repeatAttrTitle(section,'block')})
+select({name:'block ability',title:repeatAttrTitle(section,'block_ability')},
{value:'0','data-i18n':'none',selected:'true'},
{value:'@{strength_mod}','data-i18n':'strength'},
{value:'@{dexterity_mod}','data-i18n':'dexterity'},
{value:'@{constitution_mod}','data-i18n':'constitution'},
{value:'@{intelligence_mod}','data-i18n':'intelligence'},
{value:'@{wisdom_mod}','data-i18n':'wisdom'},
{value:'@{charisma_mod}','data-i18n':'charisma'}
)
+input({name:'block mod',type:'text',value:'',title:repeatAttrTitle(section,'block_mod')})
+button({name:'partial defense',value:'@{template_start} {{title=@{name}}} {{roll=[[1d20+@{type}[Ability]+@{base_attack}[Base Attack]+[[0@{custom_mod}]][Custom Mod] ]]}} {{block=[[0@{block}+@{block_ability}[Ability]+[[0@{block_mod}]][Custom Mod] ]]}}',title:repeatButtonTitle(section,'partial_defense'),class:'pictoscustom'}) e
+button({name:'full defense',value:'@{template_start} {{title=@{name}}} {{roll=[[1d20+@{type}[Ability]+@{base_attack}[Base Attack]+[[0@{custom_mod}]][Custom Mod]+4[Full Defense] ]]}} {{block=[[0@{block}+@{block_ability}[Ability]+[[0@{block_mod}]][Custom Mod] ]]}}',title:repeatButtonTitle(section,'full_defense'),class:'pictos3'}) b
section#page-2.page
each obj in [{section:'miracles',header:'clerical miracles'},{section:'lores',header:'magister lores'}]
-
let abilityLookup = {
'miracles':'wisdom',
'lores':'intelligence'
};
- let ability = abilityLookup[obj.section];
+repeating_section(obj.section,obj.header)
+input({name:'name',type:'text',value:'','data-i18n-placeholder':'name',title:repeatAttrTitle(obj.section,'name')})
+input({name:'custom_mod',type:'number',value:'',title:repeatAttrTitle(obj.section,'custom_mod'),placeholder:0})
+input({name:'total_mod',type:'hidden',value:'0',class:'plus-control'})
+span({name:'total_mod',class:'h4',title:repeatAttrTitle(obj.section,'total_mod')})=0
- format;
+button({name:'roll',value:`@{template_start} {{title=@{name}}} {{roll=[[1d20+@{${ability}_mod}[${ability} mod]+[[0@{custom_mod}]][custom mod]]]}}`,title:repeatButtonTitle(obj.section)})
#wealth
h3(data-i18n='wealth')
each val in ['pounds','shillings','pennies']
- format;
span.h4(data-i18n=currencyAbbreviations[val])
+input({name:val,type:'number',value:''})
+repeating_section('wealth',null,'wealth-section')
- section = 'wealth';
+input({name:'name',type:'text',value:'','data-i18n-placeholder':'item name',title:repeatAttrTitle(section,'name')})
+input({name:'quantity',type:'number',value:'0',title:repeatAttrTitle(section,'quantity'),class:'boxed ratio1-1'})
+headedTextarea({name:'grimoires',value:'','data-i18n-placeholder':'type your spells, grimoires, and artefacts here',class:'boxed'},'spells, grimoires, and artefacts')#grimoires
//- +repeating_section('prepared','prepared spells')
each val in ['lineage','retainers','influence','information']
-format;
+headedTextarea(textareaConverter[val].obj,textareaConverter[val].header)(id=val)
//- Universal roll template
+rolltemplate('lion_dragon')
+templateConditionalDisplay('roll')
+templateConditionalDisplay('dc','invert')
div
span(data-i18n='roll').label
.sheet-roll {{roll}}
+templateConditionalDisplay('dc')
.dc-compare
.sheet-roll {{roll}}
span(data-i18n='vs').sheet-vs
.sheet-dc {{dc}}
+rollLess({positive:false,field:'roll',values:'dc'})
span.dc-result ^{success}
+rollLess({positive:true,field:'roll',values:'dc'})
span.dc-result ^{failure}
+templateConditionalDisplay('is_attack')
+templateConditionalDisplay('crit_roll')
+rollWasCrit({positive:true,field:'roll'})
.sheet-crit_roll {{crit_roll}}
each obj in critEffects
-format;
+rollTemplateHelperFunction(obj.helperObj)
span
!= obj.display
-format;
+templateConditionalDisplay('range')
.sheet-range
span(data-i18n='range').sheet-label
|{{range}}
+templateConditionalDisplay('damage')
.sheet-damage
span(data-i18n='damage').sheet-label
span.sheet-roll {{damage}}
+templateConditionalDisplay('block')
.sheet-block
span(data-i18n='block').sheet-label
span.sheet-roll {{block}}
+templateConditionalDisplay('description')
.sheet-description
h5(data-i18n='description')
|{{description}}
script(type="text/worker")
include LionDragon.js