Files
roll20-character-sheets/Genefunk 2090/genefunk2090.pug
T

862 lines
43 KiB
Plaintext

//- 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