- 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'] }}) |+