mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 03:40:32 +00:00
255 lines
15 KiB
Plaintext
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 |