mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 19:52:29 +00:00
264 lines
9.4 KiB
Plaintext
264 lines
9.4 KiB
Plaintext
-
|
|
const conditions = [
|
|
'bewildered',
|
|
'bleeding',
|
|
'blinded',
|
|
'burned',
|
|
'confused',
|
|
'deafened',
|
|
'incapacitated',
|
|
'infuriated',
|
|
'intoxicated',
|
|
'plagued',
|
|
'poisoned',
|
|
'panicked',
|
|
'sleeping',
|
|
'spellbound',
|
|
'wounded',
|
|
'comatose',
|
|
'death',
|
|
'in extremis',
|
|
'prone',
|
|
'restrained',
|
|
'unconscious'
|
|
];
|
|
-
|
|
const characteristics = {
|
|
'aptitude':{name:'aptitude',affects:['reflex goal']},
|
|
'athletics':{name:'athletics',affects:['reflex goal','movement rate','sprint speed','item_slots_max']},
|
|
'charisma':{name:'charisma',affects:['intuition goal']},
|
|
'logic':{name:'logic',affects:['vigilance goal']},
|
|
'wisdom':{name:'wisdom',affects:['intuition goal']},
|
|
'size':{name:'size',affects:['build goal','item_slots_max']},
|
|
'stamina':{name:'stamina',affects:['build goal']},
|
|
'willpower':{name:'willpower',affects:['vigilance goal']}
|
|
};
|
|
- varObjects.characteristics = characteristics;
|
|
- const attributes = ['vigilance','build','intuition','reflex'];
|
|
-
|
|
varObjects.attributesDetails = {
|
|
vigilance_goal:['logic','willpower'],
|
|
build_goal:['size','stamina'],
|
|
intuition_goal:['charisma','wisdom'],
|
|
reflex_goal:['athletics','aptitude']
|
|
};
|
|
-
|
|
const movementArmor = [
|
|
{name:'armor',value:0,trigger:{}},
|
|
{name:'movement rate',trigger:{calculation:'calcMovement'}},
|
|
{name:'sprint speed',trigger:{calculation:'calcSprint'}}
|
|
];
|
|
-
|
|
const basicSkills = {
|
|
assess:{name:'assess',characteristic:'wisdom'},
|
|
deceive:{name:'deceive',characteristic:'charisma'},
|
|
deduce:{name:'deduce',characteristic:'logic'},
|
|
disguise:{name:'disguise',characteristic:'charisma'},
|
|
encrypt:{name:'encrypt',characteristic:'logic'},
|
|
'first aid':{name:'first aid',characteristic:'wisdom'},
|
|
hide:{name:'hide',characteristic:'wisdom'},
|
|
legerdemain:{name:'legerdemain',characteristic:'aptitude'},
|
|
locksmith:{name:'locksmith',characteristic:'aptitude'},
|
|
'nurse (ment)':{name:'nurse (ment)',characteristic:'logic'},
|
|
'nurse (phys)':{name:'nurse (phys)',characteristic:'logic'},
|
|
persuade:{name:'persuade',characteristic:'charisma'},
|
|
research:{name:'research',characteristic:'logic'},
|
|
'ride/steer':{name:'ride/steer',characteristic:'athletics'},
|
|
search:{name:'search',characteristic:'wisdom'},
|
|
sneak:{name:'sneak',characteristic:'athletics'},
|
|
stunt:{name:'stunt',characteristic:'athletics'},
|
|
survive:{name:'survive',characteristic:'wisdom'},
|
|
threaten:{name:'threaten',characteristic:'charisma'},
|
|
tinker:{name:'tinker',characteristic:'aptitude'}
|
|
};
|
|
-
|
|
const combatSkills = {
|
|
melee:{name:'melee',characteristic:'athletics'},
|
|
ranged:{name:'ranged',characteristic:'aptitude'}
|
|
};
|
|
- varObjects.skills = {...basicSkills,...combatSkills};
|
|
|
|
mixin statContainer(divObj)
|
|
- divObj = divObj || {};
|
|
.stat-container&attributes(divObj)&attributes(attributes)
|
|
block
|
|
//- End Mixin
|
|
|
|
mixin skillSelect(selectObj = {name:'skill',class:'underlined'},defaultValue)
|
|
+select-label({
|
|
inputObj:selectObj,
|
|
spanObj:{'data-i18n':'skill'},
|
|
divObj:attributes
|
|
})
|
|
if !defaultValue
|
|
+option({value:'','data-i18n':'select one',selected:''})
|
|
each skill in [...Object.keys(basicSkills),...Object.keys(combatSkills)]
|
|
- const optObj = {value:replaceSpaces(skill),'data-i18n':skill}
|
|
if skill === defaultValue || optObj.value === defaultValue
|
|
- optObj.selected = '';
|
|
+option(optObj)
|
|
//- End Mixin
|
|
|
|
mixin characteristicOptions(defaultValue)
|
|
if !defaultValue
|
|
+option({value:'','data-i18n':'select one',selected:''})
|
|
each value in Object.keys(characteristics)
|
|
- const optObj = {value:replaceSpaces(value),'data-i18n':value}
|
|
if value === defaultValue || optObj.value === defaultValue
|
|
- optObj.selected = '';
|
|
+option(optObj)
|
|
//- End Mixin
|
|
|
|
mixin plusControl({name,defaultValue,classAdd,trigger})
|
|
div(class=`plus-container${classAdd ? classAdd : ''}`)
|
|
//- +hidden({name:`${name} modded`,class:'mod-control',value:'',trigger:{affects:[replaceSpaces(name)]}})
|
|
-
|
|
const trueDefault = defaultValue === undefined ?
|
|
0 :
|
|
defaultValue;
|
|
+hidden({name,class:'plus-control',value:trueDefault,trigger})
|
|
+span({class:`plus-display${classAdd ? ` ${classAdd}` : ''}`,name})
|
|
|#{trueDefault}
|
|
//- End mixin
|
|
|
|
mixin skillRows(skills)
|
|
each obj,name in skills
|
|
div(class=`skill-${name}`).skill-row
|
|
+roller({name,role:'heading','aria-level':3,'data-i18n':name,trigger:{
|
|
triggeredFuncs:['rollSkill']
|
|
}})
|
|
+fillLeft({
|
|
radioObj:{name:`${name} proficiency`,value:-1},
|
|
divObj:{class:'proficiency'},
|
|
valueArray:[-1,0,1,2,3,4],
|
|
noClear:true,
|
|
displayValues:['-1','+0','+1','+2','+3','+4']
|
|
})
|
|
.parens-holder
|
|
span.parentheses (
|
|
+input-label({
|
|
inputObj:{name:obj.characteristic,type:'number',readonly:true},
|
|
spanObj:{'data-i18n':`+${obj.characteristic} abbreviation`},
|
|
divObj:{class:'stacked'}
|
|
})
|
|
span.parentheses )
|
|
+checkbox({name:`${name} mastery`,value:1,class:'mastery'})
|
|
//- End Mixin
|
|
|
|
mixin sectionControl(inputObj)
|
|
- inputObj.hidden = '';
|
|
-
|
|
inputObj.class = inputObj.class ?
|
|
`${inputObj.class} section-control` :
|
|
'section-control';
|
|
+checkbox(inputObj)
|
|
.section-display&attributes(attributes)
|
|
block
|
|
//- End Mixin
|
|
mixin sizeAndSlot
|
|
.flex-box.justify-center.span-all.half-gap.expanded
|
|
+input-label({
|
|
inputObj:{name:'uses_slot',type:'checkbox',value:1,checked:'',class:'underlined',trigger:{affects:['item_slots']}},
|
|
spanObj:{'data-i18n':'uses slot'}
|
|
})
|
|
+select-label({
|
|
inputObj:{name:'item size',class:'underlined'},
|
|
spanObj:{'data-i18n':'size'}
|
|
})
|
|
+option({value:'','data-i18n':'select size',selected:''})
|
|
each size in ['small','medium','large']
|
|
+option({value:size,'data-i18n':size})
|
|
//- End Mixin
|
|
mixin weaponDetails(equipped)
|
|
+collapse
|
|
- const equippedCheckObj = {name:'equipped',class:'equipped',value:1,trigger:{triggeredFuncs:['equipItem'],affects:['item_slots']}};
|
|
if equipped
|
|
- equippedCheckObj.checked = '';
|
|
.flex-box.span-all.half-gap
|
|
+checkbox(equippedCheckObj)
|
|
+text({name:'name',class:'underlined flex-min-content'})
|
|
if !equipped
|
|
+select({name:'type',class:'underlined'})
|
|
+option({value:'','data-i18n':'select'})
|
|
each value in ['gear','armor','weapon']
|
|
+option({value,'data-i18n':value})
|
|
+checkbox({name:'type',value:'weapon',hidden:'',class:'section-control'})
|
|
+input-label({
|
|
inputObj:{name:'wear',type:'number',class:'underlined'},
|
|
spanObj:{'data-i18n':'wear',role:'heading','aria-level':4},
|
|
divObj:{class:'wear section-display'}
|
|
})
|
|
else
|
|
+input-label({
|
|
inputObj:{name:'wear',type:'number',class:'underlined'},
|
|
spanObj:{'data-i18n':'wear',role:'heading','aria-level':4},
|
|
divObj:{clas:'wear'}
|
|
})
|
|
+roller({name:'roll',trigger:{
|
|
triggeredFuncs:['rollRepeating']
|
|
}})
|
|
+checkbox({name:'type',value:'weapon',hidden:'',class:'section-control',trigger:{defaultValue:''}})
|
|
.section-display.expanded.weapon-section
|
|
+skillSelect
|
|
+input-label({
|
|
inputObj:{name:'properties',type:'text',class:'underlined'},
|
|
spanObj:{'data-i18n':'properties',role:'heading','aria-level':4},
|
|
divObj:{class:'blitz'}
|
|
})
|
|
.input-label.input-label--dual.damage
|
|
span(data-i18n='damage' role='heading' aria-level=4)
|
|
+text({name:'damage',class:'underlined'})
|
|
span.slash +
|
|
+select({name:'damage characteristic',class:'underlined'})
|
|
+characteristicOptions
|
|
+input-label({
|
|
inputObj:{name:'range',type:'text',class:'underlined'},
|
|
spanObj:{'data-i18n':'range',role:'heading','aria-level':4},
|
|
divObj:{class:'range'}
|
|
})
|
|
mixin attributeHolder(name)
|
|
- const trigger = {calculation:'calcAttribute',affects:[`${name}`]};
|
|
+statContainer({class:name})&attributes(attributes)
|
|
+roller-label({
|
|
inputObj:{name:`${name} goal`,value:11,class:'underlined',type:'number',trigger},
|
|
buttonObj:{name,'data-i18n':name,role:'heading','aria-level':3,trigger:{
|
|
triggeredFuncs:['rollAttribute']
|
|
}},
|
|
divObj:{class:'stacked center no-gap'}
|
|
})
|
|
.parens-holder
|
|
span.parentheses (
|
|
+plusControl({name:`${name}`,value:0,trigger:{calculation:'calcAttributeMod'}})
|
|
span.parentheses )
|
|
mixin conditionCheck(condition)
|
|
.condition-holder
|
|
label.text-check.tooltip--control
|
|
+checkbox({name:condition,value:1,hidden:''})
|
|
span(data-i18n=condition).basic-border
|
|
span(data-i18n=`${condition}-description`).tooltip-display
|
|
//- End Mixin
|
|
|
|
mixin bestWorstToggle
|
|
ul.best-worst-toggle.flex-box.half-gap.flex-wrap
|
|
each value,state in {'best-of-two':'2d20kh1','normal':'1d20','worst-of-two':'2d20kl1','take time':'1D20'}
|
|
li.no-list
|
|
label(title='@{roll_state}').text-check
|
|
- const checkObj = {name:'roll state',value,hidden:''};
|
|
if state === 'normal'
|
|
- checkObj.checked = '';
|
|
+radio(checkObj)
|
|
span(data-i18n=state).basic-border
|
|
//- End Mixin
|
|
|
|
mixin inputWithControls(inputObj)
|
|
- const nameBase = inputObj.name;
|
|
.input-controls
|
|
+action({name:`decrement ${nameBase}`,class:'input-control--button',trigger:{
|
|
triggeredFuncs:['decrementInput']
|
|
}})
|
|
|-
|
|
+input(inputObj)
|
|
+action({name:`increment ${nameBase}`,class:'input-control--button',trigger:{
|
|
triggeredFuncs:['incrementInput']
|
|
}})
|
|
|+ |