Hi, I'm very new to HTML, however I've set out to create a character sheet for my game of OSR Knave. The issue I'm having is that the total number of usable inventory slots should be equal to the character's Constitution score. Ideally I'd like to have the remaining slots greyed out (disabled). I think I need to use a sheetworker for this, since I think I need some if/else loops. The rest of the sheet is fairly simple and works fine. However the script at the bottom, along with the item slots just above it isn't working as planned. If anyone has any pointers for me I would be eternally grateful! Thanks in advance! The HTML half of my sheet: <div class="sheet-wrapper"> <div class="sheet-heading"> <span>Name:&nbsp;<input type="text" name="attr_character_name" value="A Knave"/></span> </div> <div class="sheet-exp"> <span><span>Level:</span> <input class="sheet-wide" type="number" name="attr_Level" value="1" /> </span> <span><span>Experience:</span> <input class="sheet-wide" type="number" name="attr_Exp" value="0" /> </span> <span><span>Alignment:</span> <input class="sheet-wide" type="text" name="attr_align" value="" /> </span> <span><span>Gold in Stash:</span> <input class="sheet-wide" type="number" name="attr_Gold" value="0" /> </span> </div> <div class="sheet-str"> <span class="sheet-att-name">Str:&nbsp;<input type="number" name="attr_Strength" value="10"/></span> <span class="sheet-att-bon"><button type='roll' value='&{template:default} {{name=@{character_name} rolled an Ability Check!}} {{Strength:=[[1d20 + @{StrengthMod}]]}}' name='roll_StrCheck' />&nbsp;+&nbsp;<input type="number" name="attr_StrengthMod" value="@{Strength}-10" disabled="true"/></span> </div> <div class="sheet-dex"> <span class="sheet-att-name">Dex:&nbsp;<input type="number" name="attr_Dexterity" value="10"/></span> <span class="sheet-att-bon"><button type='roll' value='&{template:default} {{name=@{character_name} rolled an Ability Check!}} {{Dexterity:=[[1d20 + @{DexterityMod}]]}}' name='roll_DexCheck' />&nbsp;+&nbsp;<input type="number" name="attr_DexterityMod" value="@{Dexterity}-10" disabled="true"/></span> </div> <div class="sheet-int"> <span class="sheet-att-name">Int:&nbsp;<input type="number" name="attr_Intelligence" value="10"/></span> <span class="sheet-att-bon"><button type='roll' value='&{template:default} {{name=@{character_name} rolled an Ability Check!}} {{Intelligence:=[[1d20 + @{IntelligenceMod}]]}}' name='roll_IntCheck' />&nbsp;+&nbsp;<input type="number" name="attr_IntelligenceMod" value="@{Intelligence}-10" disabled="true"/></span> </div> <div class="sheet-wis"> <span class="sheet-att-name">Wis:&nbsp;<input type="number" name="attr_Wisdom" value="10"/></span> <span class="sheet-att-bon"><button type='roll' value='&{template:default} {{name=@{character_name} rolled an Ability Check!}} {{Wisdom:=[[1d20 + @{WisdomMod}]]}}' name='roll_WisCheck' />&nbsp;+&nbsp;<input type="number" name="attr_WisdomMod" value="@{Wisdom}-10" disabled="true"/></span> </div> <div class="sheet-con"> <span class="sheet-att-name">Con:&nbsp;<input type="number" name="attr_constitution" value="10"/></span> <span class="sheet-att-bon"><button type='roll' value='&{template:default} {{name=@{character_name} rolled an Ability Check!}} {{Constitution:=[[1d20 + @{ConstitutionMod}]]}}' name='roll_ConCheck' />&nbsp;+&nbsp;<input type="number" name="attr_ConstitutionMod" value="@{constitution}-10" disabled="true"/></span> </div> <div class="sheet-cha"> <span class="sheet-att-name">Cha:&nbsp;<input type="number" name="attr_Charisma" value="10"/></span> <span class="sheet-att-bon"><button type='roll' value='&{template:default} {{name=@{character_name} rolled an Ability Check!}} {{Charisma:=[[1d20 + @{CharismaMod}]]}}' name='roll_ChaCheck' />&nbsp;+&nbsp;<input type="number" name="attr_CharismaMod" value="@{Charisma}-10" disabled="true"/></span> </div> <div class="sheet-hps"> <span>Hit Points</span> <span>Current:&nbsp;<input type="number" name="attr_HP" value="1"/></span> <span>Max HP:&nbsp;<input type="number" name="attr_HP_max" value="1"/></span> </div> <div class="sheet-morale"> <span>NPC Morale</span> <span>Break:&nbsp;<input type="number" name="attr_Morale" value="7"/> Check:<button class="sheet-morale-check" type='roll' value='&{template:default} {{name= @{character_name} Morale Break Check}} {{If Greater than @{Morale}:=[[2d6]]}}' name='roll_morale'></button></span> </div> <div class="sheet-armor"> Armor <span class="sheet-armor1">Worn: &nbsp;<input type="number" name="attr_ArmorBase" value="10"/></span> <span class="">Speed: &nbsp;<input type="number" name="attr_Speed" value="40"/></span> <span><input type='checkbox' name='attr_HasHelm' value='1' />&nbsp;Helm</span> <span><input type='checkbox' name='attr_HasShield' value='1' />&nbsp;Shield</span> <span>Total AC: &nbsp;<input type="number" name="attr_Armor" value="@{ArmorBase}+@{HasShield}+@{HasHelm}" disabled="true"/></span> </div> <div class="sheet-attacks"> &nbsp;Melee Weapon&nbsp;&nbsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;+Attack&emsp;&emsp;&emsp;&emsp;&emsp;Damage <span class="sheet-attack-slot"> <input class="sheet-attack-roll1" type="number" name="attr_Melee_Bonus1" value="+0"/> <button class="sheet-att-bon" type='roll' value='&{template:default} {{name= @{character_name} attacks with a @{attack_1_desc}!}} {{Combat=Melee (Strength)}}{{to hit=[[1d20+@{StrengthMod}+@{Melee_Bonus1}]]}}' name='roll_MeleeAttack1'></button> <button type='roll' value='&{template:default} {{name= @{character_name} hits with the @{attack_1_desc}!}} {{Dealing=[[@{attack_1_damage}]] Damage}}' name='roll_Attack_1'></button> <input class="sheet-attack-descr" type="text" name="attr_attack_1_desc" value="[Melee Weapon Name]"/> <input class="sheet-attack-damage" type="text" name="attr_attack_1_damage" value="1d8"/> </span> <span class="sheet-attack-slot"> <input class="sheet-attack-roll2" type="number" name="attr_Melee_Bonus2" value="+0"/> <button class="sheet-att-bon" type='roll' value='&{template:default} {{name= @{character_name} attacks with a @{attack_2_desc}!}} {{Combat=Melee (Strength)}}{{to hit=[[1d20+@{StrengthMod}+@{Melee_Bonus2}]]}}' name='roll_MeleeAttack2'></button> <button type='roll' value='&{template:default} {{name= @{character_name} hits with the @{attack_2_desc}!}} {{Dealing=[[@{attack_2_damage}]] Damage}}' name='roll_Attack_2'></button> <input class="sheet-attack-descr" type="text" name="attr_attack_2_desc" value="Improvised Melee Weapon"/> <input class="sheet-attack-damage" type="text" name="attr_attack_2_damage" value="1d6"/> </span> <span class="sheet-attack-slot"> <input class="sheet-attack-roll3" type="number" name="attr_Melee_Bonus3" value="+0"/> <button class="sheet-att-bon" type='roll' value='&{template:default} {{name= @{character_name} attacks with a @{attack_3_desc}!}} {{Combat=Melee (Strength)}}{{to hit=[[1d20+@{StrengthMod}+@{Melee_Bonus3}]]}}' name='roll_MeleeAttack3'></button> <button type='roll' value='&{template:default} {{name= @{character_name} hits with the @{attack_3_desc}!}} {{Dealing=[[@{attack_3_damage}]] Damage}}' name='roll_Attack_3'></button> <input class="sheet-attack-descr" type="text" name="attr_attack_3_desc" value="Punch/Kick"/> <input class="sheet-attack-damage" type="text" name="attr_attack_3_damage" value="1d2"/> </span> <span class="sheet-top-break">&nbsp;Ranged Weapon&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;+Attack&emsp;&emsp;&emsp;&emsp;&emsp;Damage </span> <span class="sheet-attack-slot"> <input class="sheet-attack-roll4" type="number" name="attr_Ranged_Bonus4" value="+0"/> <button class="sheet-att-bon2" type='roll' value='&{template:default} {{name= @{character_name} attacks with a @{attack_4_desc}!}} {{Combat=Ranged (Wisdom)}}{{to hit=[[1d20+@{WisdomMod}+@{Ranged_Bonus4}]]}}' name='roll_RangedAttack4'></button> <button type='roll' value='&{template:default} {{name= @{character_name} hits with the @{attack_4_desc}!}} {{Dealing=[[@{attack_4_damage}]] Damage}}' name='roll_Attack_4'></button> <input class="sheet-attack-descr" type="text" name="attr_attack_4_desc" value="[Ranged Weapon Name]"/> <input class="sheet-attack-damage" type="text" name="attr_attack_4_damage" value="1d6"/> </span> <span class="sheet-attack-slot"> <input class="sheet-attack-roll5" type="number" name="attr_Ranged_Bonus5" value="+0"/> <button class="sheet-att-bon2" type='roll' value='&{template:default} {{name= @{character_name} attacks with a @{attack_5_desc}!}} {{Combat=Ranged (Wisdom)}}{{to hit=[[1d20+@{WisdomMod}+@{Ranged_Bonus5}]]}}' name='roll_RangedAttack5'></button> <button type='roll' value='&{template:default} {{name= @{character_name} hits with the @{attack_5_desc}!}} {{Dealing=[[@{attack_5_damage}]] Damage}}' name='roll_Attack_5'></button> <input class="sheet-attack-descr" type="text" name="attr_attack_5_desc" value="Improvised Ranged Weapon"/> <input class="sheet-attack-damage" type="text" name="attr_attack_5_damage" value="1d4"/> </span> </div> <div class="sheet-notes"> Notes / Background <textarea name="attr_notes"></textarea> </div> <div class="sheet-slots"> <span class="sheet-slots-title">Equipment Slots ( Character Max Slots = <input type="number" name="attr_Slots" value="@{constitution}" disabled="true"/>) </span> <span class="sheet-slot"> &nbsp;1:&nbsp;<input class="sheet-contents" type="text" name="attr_item_1_desc" value=""/> <input class="sheet-quality" type="text" name="attr_item_1_qual" value=""/> </span> <span class="sheet-slot"> 11:<input class="sheet-contents" type="text" name="attr_item_11_desc" value=""/> <input class="sheet-quality" type="text" name="attr_item_11_qual" value=""/> </span> <span class="sheet-slot"> &nbsp;2:&nbsp;<input class="sheet-contents" type="text" name="attr_item_2_desc" value=""/> <input class="sheet-quality" type="text" name="attr_item_2_qual" value=""/> </span> <span class="sheet-slot"> 12:<input class="sheet-contents" type="text" name="attr_item_12_desc" value="" disable12/> <input class="sheet-quality" type="text" name="attr_item_12_qual" value="" disable12/> </span> <span class="sheet-slot"> &nbsp;3:&nbsp;<input class="sheet-contents" type="text" name="attr_item_3_desc" value=""/> <input class="sheet-quality" type="text" name="attr_item_3_qual" value=""/> </span> <span class="sheet-slot"> 13:<input class="sheet-contents" type="text" name="attr_item_13_desc" value="" disable13/> <input class="sheet-quality" type="text" name="attr_item_13_qual" value="" disable13/> </span> <span class="sheet-slot"> &nbsp;4:&nbsp;<input class="sheet-contents" type="text" name="attr_item_4_desc" value=""/> <input class="sheet-quality" type="text" name="attr_item_4_qual" value=""/> </span> <span class="sheet-slot"> 14:<input class="sheet-contents" type="text" name="attr_item_14_desc" value="" disable14/> <input class="sheet-quality" type="text" name="attr_item_14_qual" value="" disable14/> </span> <span class="sheet-slot"> &nbsp;5:&nbsp;<input class="sheet-contents" type="text" name="attr_item_5_desc" value=""/> <input class="sheet-quality" type="text" name="attr_item_5_qual" value=""/> </span> <span class="sheet-slot"> 15:<input class="sheet-contents" type="text" name="attr_item_15_desc" value="" disable15/> <input class="sheet-quality" type="text" name="attr_item_15_qual" value="" disable15/> </span> <span class="sheet-slot"> &nbsp;6:&nbsp;<input class="sheet-contents" type="text" name="attr_item_6_desc" value=""/> <input class="sheet-quality" type="text" name="attr_item_6_qual" value=""/> </span> <span class="sheet-slot"> 16:<input class="sheet-contents" type="text" name="attr_item_16_desc" value="" disable16/> <input class="sheet-quality" type="text" name="attr_item_16_qual" value="" disable16/> </span> <span class="sheet-slot"> &nbsp;7:&nbsp;<input class="sheet-contents" type="text" name="attr_item_7_desc" value=""/> <input class="sheet-quality" type="text" name="attr_item_7_qual" value=""/> </span> <span class="sheet-slot"> 17:<input class="sheet-contents" type="text" name="attr_item_17_desc" value="" disable17/> <input class="sheet-quality" type="text" name="attr_item_17_qual" value="" disable17/> </span> <span class="sheet-slot"> &nbsp;8:&nbsp;<input class="sheet-contents" type="text" name="attr_item_8_desc" value=""/> <input class="sheet-quality" type="text" name="attr_item_8_qual" value=""/> </span> <span class="sheet-slot"> 18:<input class="sheet-contents" type="text" name="attr_item_18_desc" value="" disable18/> <input class="sheet-quality" type="text" name="attr_item_18_qual" value="" disable18/> </span> <span class="sheet-slot"> &nbsp;9:&nbsp;<input class="sheet-contents" type="text" name="attr_item_9_desc" value=""/> <input class="sheet-quality" type="text" name="attr_item_9_qual" value=""/> </span> <span class="sheet-slot"> 19:<input class="sheet-contents" type="text" name="attr_item_19_desc" value="" disable19/> <input class="sheet-quality" type="text" name="attr_item_19_qual" value="" disable19/> </span> <span class="sheet-slot"> 10:<input class="sheet-contents" type="text" name="attr_item_10_desc" value=""/> <input class="sheet-quality" type="text" name="attr_item_10_qual" value=""/> </span> <span class="sheet-slot"> 20:<input class="sheet-contents" type="text" name="attr_item_20_desc" value="" disable20/> <input class="sheet-quality" type="text" name="attr_item_20_qual" value="" disable20/> </span> </div> </div> <!-- ---------------------------SHEET WORKERS----------------- --> <script type="text/worker"> // On changing Constitution stat, recalculate number of open (non-disabled) item slots // number of open slots should coincide with constitution score! on("change:con", function() { getAttrs(["constitution"], function(value) { let con = parseInt(value.constitution)||11; if (con < 12) disable12 = "disabled"; else disable12 = ""; if (con < 13) disable13 = "disabled"; else disable13 = ""; if (con < 14) disable14 = "disabled"; else disable 14 = ""; if (con < 15) disable15 = "disabled"; else disable15 = ""; if (con < 16) disable16 = "disabled"; else disable16 = ""; if (con < 17) disable17 = "disabled"; else disable17 = ""; if (con < 18) disable18 = "disabled"; else disable18 = ""; if (con < 19) disable19 = "disabled"; else disable19 = ""; if (con < 20) disable20 = "disabled"; else disable20 = ""; setAttrs({ disable12 : disable12, disable13 : disable13, disable14 : disable14, disable15 : disable15, disable16 : disable16, disable17 : disable17, disable18 : disable18, disable19 : disable19, disable20 : disable20 }); }); }); </script> And the CSS part, in case that's needed too: div { border: thin solid black; border-bottom: medium solid black; border-right: medium solid black; background: #F0EEDC; } input:disabled { background: #ddd; } .sheet-wrapper { display: grid; border: none; grid-template-columns: repeat(6, 1fr); grid-gap: 1px; grid-auto-rows: minmax(30px, auto); background: #F0EEDC; } .sheet-exp span input.sheet-wide { width: 80px; } .sheet-heading { grid-column: 1 / span 3; grid-row: 1; font-weight: bold; text-align: left; } .sheet-heading input { width:300px; } .sheet-exp { grid-column: 4 / span 3; grid-row: 1; display: grid; grid-gap: 3px; grid-template-columns: 1fr 1fr; font-weight: bold; text-align: right; } .sheet-exp-1 { grid-column: 1 / span 2 } .sheet-str { grid-column: 1; grid-row: 2 ; display: grid; grid-gap: 3px; grid-template-columns: 1fr 1fr; text-align: center; background: #E59866; } .sheet-att-name{ font-weight: bold; grid-column: 1 / 3; grid-row: 1; } .sheet-att-bon{ grid-column: 1 / 3; grid-row: span 1; } .sheet-dex { grid-column: 2; grid-row: 2 ; display: grid; grid-gap: 3px; grid-template-columns: 1fr 1fr; text-align: center; background: #F7DC6F; } .sheet-int { grid-column: 3; grid-row: 2 ; display: grid; grid-gap: 3px; grid-template-columns: 1fr 1fr; text-align: center; background: #85C1E9; } .sheet-wis { grid-column: 4; grid-row: 2 ; display: grid; grid-gap: 3px; grid-template-columns: 1fr 1fr; text-align: center; background: #82E0AA; } .sheet-con { grid-column: 5; grid-row: 2 ; display: grid; grid-gap: 3px; grid-template-columns: 1fr 1fr; text-align: center; background: #EC7063; } .sheet-cha { grid-column: 6; grid-row: 2 ; display: grid; grid-gap: 3px; grid-template-columns: 1fr 1fr; text-align: center; background: #C39BD3; } .sheet-two { grid-column: 4 / 7; grid-row: 1 ; } .sheet-top-break { border-top: thin gray solid; } .sheet-hps { grid-column: 5; grid-row: 3 / span 1; display: grid; grid-gap: 3px; grid-template-columns: 1fr; text-align: center; font-weight: bold; background: #E6B0AA; } .sheet-morale { grid-column: 5; grid-row: 4 / span 1; display: grid; grid-gap: 3px; grid-template-columns: 1fr; text-align: center; font-weight: bold; background: #ddd; } .sheet-morale button.sheet-morale-check { width: 35px; background: #C39BD3; } .sheet-armor { grid-column: 6 ; grid-row: 3 / span 2; display: grid; grid-gap: 3px; grid-template-columns: 1fr; text-align: center; font-weight: bold; } .sheet-logo { grid-column: 6 ; grid-row: 3 / 5; } .sheet-attacks { grid-column: 1 / span 4; grid-row: 3 / span 2; display: grid; grid-gap: 3px; grid-template-columns: 1fr ; text-align: center; font-weight: bold; } .sheet-attack-slot { display: grid; grid-gap: 5px; grid-template-columns: 1fr 1fr 1fr 1fr 1fr; grid-template-rows: 1fr; text-align: center; font-weight: bold; } .sheet-attacks .sheet-attack-slot input.sheet-attack-damage { width: 60px; grid-column: 4 ; grid-row: 1; } .sheet-attacks .sheet-attack-slot input.sheet-attack-descr { width: 250px; grid-column: 1; grid-row: 1; } .sheet-attacks .sheet-attack-slot input.sheet-attack-roll1 { width: 50px; grid-column: 2; grid-row: 1; } .sheet-attacks .sheet-attack-slot input.sheet-attack-roll2 { width: 50px; grid-column: 2; grid-row: 1; } .sheet-attacks .sheet-attack-slot input.sheet-attack-roll3 { width: 50px; grid-column: 2; grid-row: 1; } .sheet-attacks .sheet-attack-slot input.sheet-attack-roll4 { width: 50px; grid-column: 2; grid-row: 1; } .sheet-attacks .sheet-attack-slot input.sheet-attack-roll5 { width: 50px; grid-column: 2; grid-row: 1; } .sheet-attacks .sheet-attack-slot button { width: 20px; grid-column: 5; grid-row: 1; background: #E6B0AA; } .sheet-attacks .sheet-attack-slot button.sheet-att-bon { width: 20px; grid-column: 3; grid-row: 1; background: #E59866; } .sheet-attacks .sheet-attack-slot button.sheet-att-bon2 { width: 20px; grid-column: 3; grid-row: 1; background: #82E0AA; } .sheet-notes { grid-column: 1 / span 2; grid-row: 5 / 11; display: grid; grid-gap: 3px; grid-template-columns: 1fr; grid-template-rows: 1fr 19fr; text-align: center; font-weight: bold; } .sheet-notes textarea { height: 95%; width: 95%; } .sheet-slots { grid-column: 3 / span 4; grid-row: 5 / 11; display: grid; grid-gap: 3px; grid-template-columns: 1fr 1fr ; text-align: center; font-weight: bold; } .sheet-slot { display: grid; grid-gap: 1px; grid-template-columns: 2fr 1fr 1fr 1fr; grid-template-rows: 1; text-align: center; font-weight: bold; height: 10px; } .sheet-slots-title { grid-column: span 2; font-weight: bold; text-align: center; height: 10px; } .sheet-contents { width: 165px; height: 20px; } .sheet-quality { width: 40px; }