mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-31 12:12:30 +00:00
862 lines
43 KiB
Plaintext
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 |