mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 11:42:29 +00:00
1702 lines
203 KiB
HTML
1702 lines
203 KiB
HTML
<input name="attr_version" type="hidden" value="1.7"/><!-- This need an even handler as well to update damage roll when effect is added but damage is empty--><!--include charactermancer/charactermancer.pug--><input type="hidden" name="attr_action_points_base" value="3"/><input type="hidden" name="attr_action_points_per_round" value="3"/><input type="hidden" name="attr_hit_points_base" value="10"/><input type="hidden" name="attr_hit_die_formula" value="10+0+0"/><input type="hidden" name="attr_set_hit_points" value="2"/><input type="hidden" name="attr_hit_point_die" value="1d4"/><input type="hidden" name="attr_luck_negative_modifier" value="0"/><input type="hidden" name="attr_luck_critical_modifier" value="0"/><input type="hidden" name="attr_critical_fail_base" value="1"/><input type="hidden" name="attr_critical_fail" value="1"/><input type="hidden" name="attr_critical_fail_modifier" value="0"/><input type="hidden" name="attr_critical_hit_base" value="20"/><input type="hidden" name="attr_critical_hit" value="20"/><input type="hidden" name="attr_critical_hit_modifier" value="0"/><input type="hidden" name="attr_rerolls_max" value="3"/><input type="hidden" name="attr_initiative" value="0"/><input type="hidden" name="attr_initiative_modifier" value="0"/><input type="hidden" name="attr_initiative_base" value="0"/><input type="hidden" name="attr_initiative_bonus" value="0"/><input type="hidden" name="attr_armor_rating_base" value="10"/><input type="hidden" name="attr_armor_rating_modifier" value="0"/><input type="hidden" name="attr_reflexes" value="10"/><input type="hidden" name="attr_reflexes_base" value="10"/><input type="hidden" name="attr_reflexes_modifier" value="0"/><input type="hidden" name="attr_fortitude" value="10"/><input type="hidden" name="attr_fortitude_base" value="10"/><input type="hidden" name="attr_fortitude_modifier" value="0"/><input type="hidden" name="attr_anticipation" value="10"/><input type="hidden" name="attr_anticipation_base" value="10"/><input type="hidden" name="attr_anticipation_modifier" value="0"/><input type="hidden" name="attr_logic" value="10"/><input type="hidden" name="attr_logic_base" value="10"/><input type="hidden" name="attr_logic_modifier" value="0"/><input type="hidden" name="attr_willpower" value="10"/><input type="hidden" name="attr_willpower_base" value="10"/><input type="hidden" name="attr_willpower_modifier" value="0"/><div class="dropzone compendium-drop-target creatures vehicles sheet"><input name="attr_drop_name" type="hidden" value="" accept="Name"/><input name="attr_drop_data" type="hidden" value="" accept="data"/><input name="attr_drop_content" type="hidden" value="" accept="Content"/><input name="attr_drop_category" type="hidden" value="" accept="Category"/><input class="type" name="attr_sheet_type" type="hidden" value="pc"/><input class="display_string" name="attr_character_settings" type="hidden" value=""/><div class="pc grid gap-6 p-2 auto-rows-max"><input type="hidden" name="attr_tab" value="main"/><div class="grid gap-4"><div class="flex flex-wrap flex-row gap-4"><div class="logo grow-0"><img src="https://raw.githubusercontent.com/quasireal-publishing/roll20-mythcraft/refs/heads/main/Mythcraft/src/imgs/Mythcraft-Logo-Badge-Textured-Black.png" alt="Mythcraft Logo" title="Mythcraft Logo"/></div><div class="grid gap-1 grow bio"><div class="grid grid-flow-col gap-2 name-row"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="character name"></h3><label data-i18n-title="enter character name" title="enter character name"><input data-i18n-placeholder="character name" name="attr_character_name" placeholder="character name" title="@{character_name}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="lineage"></h3><label data-i18n-title="enter lineage" title="enter lineage"><input data-i18n-placeholder="lineage" name="attr_lineage" placeholder="lineage" title="@{lineage}" type="text" value=""/></label></div></div><div class="grid grid-flow-col gap-2 name-row"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="level"></h3><label data-i18n-title="enter level" title="enter level"><input data-i18n-placeholder="level" name="attr_level" placeholder="level" title="@{level}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="size"></h3><label data-i18n-title="enter size" title="enter size"><input data-i18n-placeholder="size" name="attr_size" placeholder="size" title="@{size}" type="text" value=""/></label></div></div><div class="grid grid-flow-col gap-2"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="height"></h3><label data-i18n-title="enter height" title="enter height"><input data-i18n-placeholder="height" name="attr_height" placeholder="height" title="@{height}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="weight"></h3><label data-i18n-title="enter weight" title="enter weight"><input data-i18n-placeholder="weight" name="attr_weight" placeholder="weight" title="@{weight}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="age"></h3><label data-i18n-title="enter age" title="enter age"><input data-i18n-placeholder="age" name="attr_age" placeholder="age" title="@{age}" type="text" value=""/></label></div></div><div class="grid grid-flow-col gap-2"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="appearance"></h3><label data-i18n-title="enter appearance" title="enter appearance"><input data-i18n-placeholder="appearance" name="attr_appearance" placeholder="appearance" title="@{appearance}" type="text" value=""/></label></div></div></div></div><div class="grid gap-2 grid-flow-col auto-cols-min"><div class="grid tab relative"><input type="radio" name="attr_tab" value="main"/><span class="capitalize" data-i18n="main"></span></div><div class="grid tab relative"><input type="radio" name="attr_tab" value="combat"/><span class="capitalize" data-i18n="combat"></span></div><div class="grid tab relative"><input type="radio" name="attr_tab" value="magic"/><span class="capitalize" data-i18n="magic"></span></div><div class="grid tab relative"><input type="radio" name="attr_tab" value="talents"/><span class="capitalize" data-i18n="talents"></span></div><div class="grid tab relative"><input type="radio" name="attr_tab" value="journal"/><span class="capitalize" data-i18n="journal"></span></div><div class="grid tab relative"><input type="radio" name="attr_tab" value="settings"/><span class="pictos lowercase">y</span></div></div></div><div class="grid gap-6 main"><div class="grid gap-2 solid-border-2 rounded-md p-2 relative"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="personality / background"></h2></div><div class="grid grid-flow-col gap-2 personality"><div class="grid col-auto-fr gap-1 grid-flow-col items-center values"><h3 class="ellipse text-center capitalize" data-i18n="values"></h3><label data-i18n-title="enter values" title="enter values"><input data-i18n-placeholder="values" name="attr_values" placeholder="values" title="@{values}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center drive"><h3 class="ellipse text-center capitalize" data-i18n="drive"></h3><label data-i18n-title="enter drive" title="enter drive"><input data-i18n-placeholder="drive" name="attr_drive" placeholder="drive" title="@{drive}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center quirk"><h3 class="ellipse text-center capitalize" data-i18n="quirk"></h3><label data-i18n-title="enter quirk" title="enter quirk"><input data-i18n-placeholder="quirk" name="attr_quirk" placeholder="quirk" title="@{quirk}" type="text" value=""/></label></div></div><div class="grid grid-flow-col gap-2 background"><div class="grid col-auto-fr gap-1 grid-flow-col items-center background"><h3 class="ellipse text-center capitalize" data-i18n="background"></h3><label data-i18n-title="enter background" title="enter background"><input data-i18n-placeholder="background" name="attr_background" placeholder="background" title="@{background}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center profession"><h3 class="ellipse text-center capitalize" data-i18n="profession"></h3><label data-i18n-title="enter profession" title="enter profession"><input data-i18n-placeholder="profession" name="attr_profession" placeholder="profession" title="@{profession}" type="text" value=""/></label></div></div></div><div class="grid gap-2 grid-flow-col items-center content-start attrs relative"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined strength" data-i18n="str" name="roll_strength" type="roll" value="&{template:rolls} {{header=^{strength}}} {{dice=[[1d20+@{strength}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter strength" title="enter strength"><input name="attr_strength" title="@{strength}" type="number" value="0"/></label></div><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined dexterity" data-i18n="dex" name="roll_dexterity" type="roll" value="&{template:rolls} {{header=^{dexterity}}} {{dice=[[1d20+@{dexterity}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter dexterity" title="enter dexterity"><input name="attr_dexterity" title="@{dexterity}" type="number" value="0"/></label></div><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined endurance" data-i18n="end" name="roll_endurance" type="roll" value="&{template:rolls} {{header=^{endurance}}} {{dice=[[1d20+@{endurance}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter endurance" title="enter endurance"><input name="attr_endurance" title="@{endurance}" type="number" value="0"/></label></div><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined awareness" data-i18n="awr" name="roll_awareness" type="roll" value="&{template:rolls} {{header=^{awareness}}} {{dice=[[1d20+@{awareness}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter awareness" title="enter awareness"><input name="attr_awareness" title="@{awareness}" type="number" value="0"/></label></div><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined intellect" data-i18n="int" name="roll_intellect" type="roll" value="&{template:rolls} {{header=^{intellect}}} {{dice=[[1d20+@{intellect}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter intellect" title="enter intellect"><input name="attr_intellect" title="@{intellect}" type="number" value="0"/></label></div><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined charisma" data-i18n="cha" name="roll_charisma" type="roll" value="&{template:rolls} {{header=^{charisma}}} {{dice=[[1d20+@{charisma}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter charisma" title="enter charisma"><input name="attr_charisma" title="@{charisma}" type="number" value="0"/></label></div><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined luck" data-i18n="luck" name="roll_luck" type="roll" value="&{template:rolls} {{header=^{luck}}} {{dice=[[1d20+@{luck}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter luck" title="enter luck"><input name="attr_luck" title="@{luck}" type="number" value="0"/></label></div><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined coordination" data-i18n="cor" name="roll_coordination" type="roll" value="&{template:rolls} {{header=^{coordination}}} {{dice=[[1d20+@{coordination}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter coordination" title="enter coordination"><input name="attr_coordination" title="@{coordination}" type="number" value="0"/></label></div></div><div class="grid grid-flow-cols gap-4 content-start p-2 relative grid-cols-2"><div class="grid gap-6 content-start"><div class="grid solid-border-2 rounded-md p-2 relative inventory content-start"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="inventory"></h2></div><div class="grid grid-flow-col gap-2 mb-2 border-bottom subheaders"><div class="grid grid-flow-col gap-2 custom-grid"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><h3 class="ellipse text-center capitalize" data-i18n="qty"></h3></div></div><fieldset class="repeating_inventory"><input type="hidden" name="attr_link" value=""/><div class="grid gap-2 relative repeating-grid"><div class="grid grid-flow-col gap-2 displayed custom-grid"><button class="text-left ellipsis chat" name="roll_inventory" type="roll" value="&{template:rolls} {{header=@{name}}} {{description=@{description}}}"><span name="attr_name"></span></button><span class="display ellipse" name="attr_qty" title="@{qty}"></span></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="tags"></h4><span class="capitalize" name="attr_tags" title="@{tags}"></span></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="cost"></h4><span class="capitalize" name="attr_cost" title="@{cost}"></span></div><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 edit-grid"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="qty"></h4><label data-i18n-title="enter qty" title="enter qty"><input data-i18n-placeholder="qty" name="attr_qty" placeholder="qty" title="@{qty}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="tags"></h4><label data-i18n-title="enter tags" title="enter tags"><input data-i18n-placeholder="tags" name="attr_tags" placeholder="tags" title="@{tags}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="cost"></h4><label data-i18n-title="enter cost" title="enter cost"><input data-i18n-placeholder="cost" name="attr_cost" placeholder="cost" title="@{cost}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div><div class="grid solid-border-2 rounded-md p-2 relative"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="currency"></h2></div><div class="grid gap-2 items-center grid-flow-col mb-2"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="a"></h3><label data-i18n-title="enter a" title="enter a"><input class="text-center" name="attr_a" title="@{a}" type="number" value="0"/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="sc"></h3><label data-i18n-title="enter sc" title="enter sc"><input class="text-center" name="attr_sc" title="@{sc}" type="number" value="0"/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="q"></h3><label data-i18n-title="enter q" title="enter q"><input class="text-center" name="attr_q" title="@{q}" type="number" value="0"/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="dc"></h3><label data-i18n-title="enter dc" title="enter dc"><input class="text-center" name="attr_dc" title="@{dc}" type="number" value="0"/></label></div></div><div class="grid mt-1"><textarea name="attr_currency" placeholder="currency"></textarea></div></div></div><div class="grid gap-6 content-start"><div class="grid solid-border-2 rounded-md p-2 relative skills"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="skills"></h2></div><div class="grid grid-flow-col gap-2 mb-2 border-bottom subheaders"><div class="grid grid-flow-col gap-2 custom-grid"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><h3 class="ellipse text-center capitalize" data-i18n="attribute"></h3><h3 class="ellipse text-center capitalize" data-i18n="bonus"></h3></div></div><fieldset class="repeating_skills"><input type="hidden" name="attr_attribute_abbreviation" value="STR"/><input type="hidden" name="attr_bonus" value="0"/><div class="grid gap-2 relative repeating-grid"><div class="grid grid-flow-col gap-2 displayed custom-grid"><button class="text-left ellipsis font-weight-bold" name="roll_skill" type="roll" value="&{template:rolls} {{header=@{name}}} {{dice=[[1d20+@{attribute}[attribute]+(@{modifier}[modifier])+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} {}}"><span name="attr_name"></span></button><span class="uppercase" name="attr_attribute_abbreviation"></span><span class="text-center" name="attr_bonus" title="@{bonus}"></span></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="category"></h4><span class="capitalize" name="attr_category" title="@{category}"></span></div><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid col-auto-fr gap-1 grid-flow-col items-center name"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center category"><h4 class="ellipse capitalize" data-i18n="category"></h4><label data-i18n-title="enter category" title="enter category"><input data-i18n-placeholder="category" name="attr_category" placeholder="category" title="@{category}" type="text" value=""/></label></div><div class="grid gap-2 grid-flow-col items-center attribute"><div class="grid gap-2 col-auto-fr items-center attribute-select"><h4 class="ellipse capitalize" data-i18n="attribute"></h4><select name="attr_attribute"><option value="@{strength}" data-i18n="strength"><val></val></option><option value="@{dexterity}" data-i18n="dexterity"><val></val></option><option value="@{endurance}" data-i18n="endurance"><val></val></option><option value="@{awareness}" data-i18n="awareness"><val></val></option><option value="@{intellect}" data-i18n="intellect"><val></val></option><option value="@{charisma}" data-i18n="charisma"><val></val></option><option value="@{luck}" data-i18n="luck"><val></val></option></select></div><span class="text-center plus">+</span><div class="grid col-auto-fr gap-1 grid-flow-col items-center modifier"><h4 class="ellipse capitalize" data-i18n="modifier"></h4><label data-i18n-title="enter modifier" title="enter modifier"><input data-i18n-placeholder="modifier" name="attr_modifier" placeholder="modifier" title="@{modifier}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div><div class="grid solid-border-2 rounded-md p-2 relative favorites content-start"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="favorites"></h2></div><div class="grid grid-flow-col gap-2 mb-2 border-bottom subheaders"><div class="grid grid-flow-col gap-2 custom-grid"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><h3 class="ellipse text-center capitalize" data-i18n="tags"></h3></div></div><fieldset class="repeating_favorites"><input type="hidden" name="attr_link" value=""/><div class="grid gap-2 relative repeating-grid"><div class="grid grid-flow-col gap-2 displayed custom-grid"><button class="text-left ellipsis chat" name="roll_favorites" type="roll" value="&{template:rolls} {{header=@{name}}} {{description=@{description}}}"><span name="attr_name"></span></button><span class="display ellipse" name="attr_tags" title="@{tags}"></span></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 edit-grid"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="tags"></h4><label data-i18n-title="enter tags" title="enter tags"><input data-i18n-placeholder="tags" name="attr_tags" placeholder="tags" title="@{tags}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div></div></div></div><div class="grid gap-6 combat"><div class="grid grid-flow-col gap-2 hp-row"><div class="grid solid-border-2 rounded-md p-2 relative"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="hp & shield"></h2></div><div class="grid grid-flow-col gap-2 hp mt-1"><div class="grid grid-flow-col gap-2"><div class="grid justify-center items-center"><label data-i18n-title="enter hp" title="enter hp"><input class="text-center" name="attr_hp" title="@{hp}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="current"></h3></div><div class="grid justify-center items-center"><label data-i18n-title="enter hp max" title="enter hp max"><input class="text-center" name="attr_hp_max" title="@{hp_max}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="max"></h3></div></div><div class="grid justify-center items-center"><label data-i18n-title="enter shield" title="enter shield"><input class="text-center" name="attr_shield" title="@{shield}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="shield"></h3></div></div></div><div class="grid solid-border-2 rounded-md p-2 relative"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="death points"></h2></div><div class="grid mt-1"><div class="grid grid-flow-col gap-2"><div class="grid justify-center items-center"><label data-i18n-title="enter death points" title="enter death points"><input class="text-center" name="attr_death_points" title="@{death_points}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="current"></h3></div><div class="grid justify-center items-center"><label data-i18n-title="enter death points max" title="enter death points max"><input class="text-center" name="attr_death_points_max" title="@{death_points_max}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="max"></h3></div></div></div></div><div class="grid solid-border-2 rounded-md p-2 relative"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="AR"></h2></div><div class="grid mt-1"><label data-i18n-title="enter armor rating" title="enter armor rating"><input class="text-center" data-i18n-placeholder="armor rating" name="attr_armor_rating" placeholder="armor rating" title="@{armor_rating}" type="text" value="10"/></label><h3 class="ellipse text-center capitalize" data-i18n="armor rating"></h3></div></div><div class="grid solid-border-2 rounded-md p-2 relative"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="speed"></h2></div><div class="grid mt-1"><label data-i18n-title="enter speed" title="enter speed"><input class="text-center" data-i18n-placeholder="speed" name="attr_speed" placeholder="speed" title="@{speed}" type="text" value="20"/></label><h3 class="ellipse text-center capitalize lowercase" data-i18n="ft"></h3></div></div></div><div class="grid grid grid-flow-col gap-2 items-center"><div class="grid solid-border-2 rounded-md p-2 relative"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="action points"></h2></div><div class="grid grid-flow-col gap-2 mt-1"><div class="grid justify-center items-center"><label data-i18n-title="enter action points" title="enter action points"><input name="attr_action_points" title="@{action_points}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="current"></h3></div><div class="grid justify-center items-center"><span class="text-center" name="attr_action_points_per_round" title="@{action_points_per_round}"></span><h3 class="ellipse text-center capitalize" data-i18n="ap/round"></h3></div></div></div><div class="grid solid-border-2 rounded-md p-2 relative"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="special AP"></h2></div><div class="grid mt-1"><div class="grid grid-flow-col gap-2"><div class="grid justify-center items-center"><label data-i18n-title="enter special action points" title="enter special action points"><input class="text-center" name="attr_special_action_points" title="@{special_action_points}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="current"></h3></div><div class="grid justify-center items-center"><label data-i18n-title="enter special action points max" title="enter special action points max"><input class="text-center" name="attr_special_action_points_max" title="@{special_action_points_max}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="max"></h3></div></div></div></div><div class="grid solid-border-2 rounded-md p-2 relative"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="luck points"></h2></div><div class="grid mt-1"><div class="grid grid-flow-col gap-2"><div class="grid justify-center items-center"><label data-i18n-title="enter luck points" title="enter luck points"><input class="text-center" name="attr_luck_points" title="@{luck_points}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="current"></h3></div><div class="grid justify-center items-center"><label data-i18n-title="enter luck points max" title="enter luck points max"><input class="text-center" name="attr_luck_points_max" title="@{luck_points_max}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="max"></h3></div></div></div></div><div class="grid solid-border-2 rounded-md p-2 relative h-full"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="initiative"></h2></div><div class="grid justify-center items-center"><span class="text-center" name="attr_initiative" title="@{initiative}"></span><button class="text-capitalize" data-i18n="initiative" name="roll_initiative" type="roll" value="&{template:rolls} {{header=^{initiative}}} {{dice=[[1d20+@{awareness}[awareness]+@{initiative_bonus}[modifier] &{tracker}]]}}"></button></div></div></div><div class="grid gap-1 justify-between items-center attrs"><div class="grid relative justify-center items-center strength"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined strength" data-i18n="str" name="roll_strength" type="roll" value="&{template:rolls} {{header=^{strength}}} {{dice=[[1d20+@{strength}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter strength" title="enter strength"><input class="text-center" name="attr_strength" title="@{strength}" type="number" value="0"/></label></div></div><div class="grid relative justify-center items-center dexterity"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined dexterity" data-i18n="dex" name="roll_dexterity" type="roll" value="&{template:rolls} {{header=^{dexterity}}} {{dice=[[1d20+@{dexterity}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter dexterity" title="enter dexterity"><input class="text-center" name="attr_dexterity" title="@{dexterity}" type="number" value="0"/></label></div></div><div class="grid relative justify-center items-center endurance"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined endurance" data-i18n="end" name="roll_endurance" type="roll" value="&{template:rolls} {{header=^{endurance}}} {{dice=[[1d20+@{endurance}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter endurance" title="enter endurance"><input class="text-center" name="attr_endurance" title="@{endurance}" type="number" value="0"/></label></div></div><div class="grid relative justify-center items-center awareness"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined awareness" data-i18n="awr" name="roll_awareness" type="roll" value="&{template:rolls} {{header=^{awareness}}} {{dice=[[1d20+@{awareness}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter awareness" title="enter awareness"><input class="text-center" name="attr_awareness" title="@{awareness}" type="number" value="0"/></label></div></div><div class="grid relative justify-center items-center intellect"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined intellect" data-i18n="int" name="roll_intellect" type="roll" value="&{template:rolls} {{header=^{intellect}}} {{dice=[[1d20+@{intellect}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter intellect" title="enter intellect"><input class="text-center" name="attr_intellect" title="@{intellect}" type="number" value="0"/></label></div></div><div class="grid relative justify-center items-center charisma"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined charisma" data-i18n="cha" name="roll_charisma" type="roll" value="&{template:rolls} {{header=^{charisma}}} {{dice=[[1d20+@{charisma}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter charisma" title="enter charisma"><input class="text-center" name="attr_charisma" title="@{charisma}" type="number" value="0"/></label></div></div><div class="grid relative justify-center items-center luck"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined luck" data-i18n="luck" name="roll_luck" type="roll" value="&{template:rolls} {{header=^{luck}}} {{dice=[[1d20+@{luck}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter luck" title="enter luck"><input class="text-center" name="attr_luck" title="@{luck}" type="number" value="0"/></label></div></div><div class="grid relative justify-center items-center coordination"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined coordination" data-i18n="cor" name="roll_coordination" type="roll" value="&{template:rolls} {{header=^{coordination}}} {{dice=[[1d20+@{coordination}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter coordination" title="enter coordination"><input class="text-center" name="attr_coordination" title="@{coordination}" type="number" value="0"/></label></div></div><div></div><div class="grid relative justify-center items-center reflexes"><div class="circle rounded-full border grid justify-center items-center font-bold"><h3 class="ellipse text-center capitalize" data-i18n="ref"></h3><span class="text-center" name="attr_reflexes" title="@{reflexes}"></span></div></div><div class="grid relative justify-center items-center fortitude"><div class="circle rounded-full border grid justify-center items-center font-bold"><h3 class="ellipse text-center capitalize" data-i18n="fort"></h3><span class="text-center" name="attr_fortitude" title="@{fortitude}"></span></div></div><div class="grid relative justify-center items-center anticipation"><div class="circle rounded-full border grid justify-center items-center font-bold"><h3 class="ellipse text-center capitalize" data-i18n="ant"></h3><span class="text-center" name="attr_anticipation" title="@{anticipation}"></span></div></div><div class="grid relative justify-center items-center logic"><div class="circle rounded-full border grid justify-center items-center font-bold"><h3 class="ellipse text-center capitalize" data-i18n="log"></h3><span class="text-center" name="attr_logic" title="@{logic}"></span></div></div><div class="grid relative justify-center items-center willpower"><div class="circle rounded-full border grid justify-center items-center font-bold"><h3 class="ellipse text-center capitalize" data-i18n="wil"></h3><span class="text-center" name="attr_willpower" title="@{willpower}"></span></div></div></div><div class="grid solid-border-2 rounded-md p-2 relative attacks"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="attacks & spellcasting"></h2></div><div class="grid grid-flow-col gap-2 mb-2 border-bottom subheaders"><div class="grid grid-flow-col gap-2 custom-grid"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><h3 class="ellipse text-center capitalize" data-i18n="apc"></h3><h3 class="ellipse text-center capitalize" data-i18n="attribute"></h3><h3 class="ellipse text-center capitalize" data-i18n="bonus"></h3><h3 class="ellipse text-center capitalize" data-i18n="damage"></h3><h3 class="ellipse text-center capitalize" data-i18n="type"></h3><h3 class="ellipse text-center capitalize" data-i18n="range"></h3></div></div><div class="grid gap-4"><fieldset class="repeating_attacks"><input type="hidden" name="attr_link" value=""/><input type="hidden" name="attr_attribute_abbreviation" value="STR"/><input type="hidden" name="attr_attack_critical_hit" value="@{critical_hit}"/><input type="hidden" name="attr_roll_formula" value="{{dice=[[1d20+@{attribute}[attribute]+(@{modifier}[modifier])+(?{TA/TD|0}[tactical bonus])+(@{luck_negative_modifier}[negative luck modifier])cs@{attack_critical_hit}cf@{critical_fail}]]}} {{damage=[Damage](~repeating_attacks-roll_damage)}}"/><div class="grid gap-2 relative repeating-grid"> <div class="grid grid-flow-col gap-2 displayed custom-grid"><div class="grid gap-2 grid-flow-col"><button class="text-left ellipsis font-weight-bold" name="roll_name" type="roll" value="&{template:rolls} {{header=@{name}}} @{roll_formula}"><span name="attr_name"></span></button></div><span class="text-center" name="attr_apc" title="@{apc}"></span><span class="text-center" name="attr_attribute_abbreviation" title="@{attribute_abbreviation}"></span><span class="text-center" name="attr_bonus" title="@{bonus}"></span><button class="ellipsis font-weight-bold text-center" name="roll_damage" type="roll" value="&{template:rolls} {{header=@{name} Damage}} {{dice=[[@{damage}[damage]+(@{damage_attribute}[damage attribute])]]}} {{type=@{damage_type}}}"><span name="attr_damage"></span></button><span class="text-center" name="attr_damage_type" title="@{damage_type}"></span><span class="text-center" name="attr_range" title="@{range}"></span></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="tags"></h4><span class="capitalize" name="attr_tags" title="@{tags}"></span></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="type"></h4><span class="capitalize" name="attr_type" title="@{type}"></span></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="size"></h4><span class="capitalize" name="attr_size" title="@{size}"></span></div><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="tags"></h4><label data-i18n-title="enter tags" title="enter tags"><input data-i18n-placeholder="tags" name="attr_tags" placeholder="tags" title="@{tags}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="apc"></h4><label data-i18n-title="enter apc" title="enter apc"><input data-i18n-placeholder="apc" name="attr_apc" placeholder="apc" title="@{apc}" type="text" value=""/></label></div><div class="grid gap-2 grid-flow-col col-auto-fr items-center"><h4 class="ellipse capitalize" data-i18n="attribute"></h4><select name="attr_attribute"><option value="0" data-i18n="none"></option><option value="@{strength}" data-i18n="strength"><val></val></option><option value="@{dexterity}" data-i18n="dexterity"><val></val></option><option value="@{endurance}" data-i18n="endurance"><val></val></option><option value="@{awareness}" data-i18n="awareness"><val></val></option><option value="@{intellect}" data-i18n="intellect"><val></val></option><option value="@{charisma}" data-i18n="charisma"><val></val></option><option value="@{luck}" data-i18n="luck"><val></val></option><option value="@{coordination}" data-i18n="coordination"><val></val></option></select></div><span class="text-center">+</span><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="modifier"></h4><label data-i18n-title="enter modifier" title="enter modifier"><input name="attr_modifier" title="@{modifier}" type="number" value="0"/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="crit range"></h4><label data-i18n-title="enter crit range" title="enter crit range"><input name="attr_crit_range" title="@{crit_range}" type="number" value="0"/></label></div></div><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="damage"></h4><label data-i18n-title="enter damage" title="enter damage"><input data-i18n-placeholder="damage" name="attr_damage" placeholder="damage" title="@{damage}" type="text" value=""/></label></div><div class="grid gap-2 grid-flow-col col-auto-fr items-center"><h4 class="ellipse capitalize" data-i18n="damage attribute"></h4><select name="attr_damage_attribute"><option value="0" data-i18n="none"></option><option value="@{strength}" data-i18n="strength"><val></val></option><option value="@{dexterity}" data-i18n="dexterity"><val></val></option><option value="@{endurance}" data-i18n="endurance"><val></val></option><option value="@{awareness}" data-i18n="awareness"><val></val></option><option value="@{intellect}" data-i18n="intellect"><val></val></option><option value="@{charisma}" data-i18n="charisma"><val></val></option><option value="@{luck}" data-i18n="luck"><val></val></option><option value="@{coordination}" data-i18n="coordination"><val></val></option></select></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="damage type"></h4><label data-i18n-title="enter damage type" title="enter damage type"><input data-i18n-placeholder="damage type" name="attr_damage_type" placeholder="damage type" title="@{damage_type}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="range"></h4><label data-i18n-title="enter range" title="enter range"><input data-i18n-placeholder="range" name="attr_range" placeholder="range" title="@{range}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="reload"></h4><label data-i18n-title="enter reload" title="enter reload"><input data-i18n-placeholder="reload" name="attr_reload" placeholder="reload" title="@{reload}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="size"></h4><label data-i18n-title="enter size" title="enter size"><input data-i18n-placeholder="size" name="attr_size" placeholder="size" title="@{size}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="category"></h4><label data-i18n-title="enter category" title="enter category"><input data-i18n-placeholder="category" name="attr_category" placeholder="category" title="@{category}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="subcategory"></h4><label data-i18n-title="enter subcategory" title="enter subcategory"><input data-i18n-placeholder="subcategory" name="attr_subcategory" placeholder="subcategory" title="@{subcategory}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="type"></h4><label data-i18n-title="enter type" title="enter type"><input data-i18n-placeholder="type" name="attr_type" placeholder="type" title="@{type}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div></div><div class="grid gap-4 grid-flow-col auto-cols-fr"><div class="grid gap-6 content-start"><div class="grid solid-border-2 rounded-md p-2 relative reactive-actions content-start"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="reactive actions"></h2></div><div class="grid grid-flow-col gap-2 mb-2 border-bottom subheaders"><div class="grid grid-flow-col gap-2 custom-grid"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><h3 class="ellipse text-center capitalize" data-i18n="ap"></h3></div></div><fieldset class="repeating_reactive-actions"><input type="hidden" name="attr_link" value=""/><div class="grid gap-2 relative repeating-grid"><div class="grid grid-flow-col gap-2 displayed custom-grid"><button class="text-left ellipsis chat" name="roll_reactive_actions" type="roll" value="&{template:rolls} {{header=@{name}}} {{description=@{description}}}"><span name="attr_name"></span></button><span class="display ellipse" name="attr_ap" title="@{ap}"></span></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 edit-grid"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="ap"></h4><label data-i18n-title="enter ap" title="enter ap"><input data-i18n-placeholder="ap" name="attr_ap" placeholder="ap" title="@{ap}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div><div class="grid solid-border-2 rounded-md p-2 relative conditions content-start"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="conditions"></h2></div><div class="grid grid-flow-col gap-2 mb-2 border-bottom subheaders"><div class="grid grid-flow-col gap-2 custom-grid"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3></div></div><fieldset class="repeating_conditions"><input type="hidden" name="attr_link" value=""/><div class="grid gap-2 relative repeating-grid"><div class="grid grid-flow-col gap-2 displayed custom-grid"><button class="text-left ellipsis chat" name="roll_conditions" type="roll" value="&{template:rolls} {{header=@{name}}} {{description=@{description}}}"><span name="attr_name"></span></button></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 edit-grid"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div></div><div class="grid gap-6 content-start auto-cols-fr"><div class="grid solid-border-2 rounded-md p-2 relative favorites content-start"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="favorites"></h2></div><div class="grid grid-flow-col gap-2 mb-2 border-bottom subheaders"><div class="grid grid-flow-col gap-2 custom-grid"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><h3 class="ellipse text-center capitalize" data-i18n="tags"></h3></div></div><fieldset class="repeating_favorites"><input type="hidden" name="attr_link" value=""/><div class="grid gap-2 relative repeating-grid"><div class="grid grid-flow-col gap-2 displayed custom-grid"><button class="text-left ellipsis chat" name="roll_favorites" type="roll" value="&{template:rolls} {{header=@{name}}} {{description=@{description}}}"><span name="attr_name"></span></button><span class="display ellipse" name="attr_tags" title="@{tags}"></span></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 edit-grid"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="tags"></h4><label data-i18n-title="enter tags" title="enter tags"><input data-i18n-placeholder="tags" name="attr_tags" placeholder="tags" title="@{tags}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div><div class="grid solid-border-2 rounded-md p-2 relative content-start w-full"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="trackables"></h2></div><fieldset class="repeating_trackables"><div class="grid gap-2 grid-flow-col"><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label><div class="grid grid-flow-col gap-2"><div class="grid justify-center items-center"><label data-i18n-title="enter value" title="enter value"><input class="text-center" name="attr_value" title="@{value}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="current"></h3></div><div class="grid justify-center items-center"><label data-i18n-title="enter value max" title="enter value max"><input class="text-center" name="attr_value_max" title="@{value_max}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="max"></h3></div></div></div></fieldset></div></div></div></div><div class="grid gap-6 magic"><div class="grid grid-flow-col gap-2 points-source"><div class="grid gap-6 content-start"><div class="grid solid-border-2 rounded-md p-2 relative"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="spell points"></h2></div><div class="grid mt-1"><div class="grid grid-flow-col gap-2"><div class="grid justify-center items-center"><label data-i18n-title="enter spell points" title="enter spell points"><input class="text-center" name="attr_spell_points" title="@{spell_points}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="current"></h3></div><div class="grid justify-center items-center"><label data-i18n-title="enter spell points max" title="enter spell points max"><input class="text-center" name="attr_spell_points_max" title="@{spell_points_max}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="max"></h3></div></div></div></div><div class="grid grid-flow-col gap-4"><div class="grid solid-border-2 rounded-md p-2 relative"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="spellcasting ability"></h2></div><div class="grid justify-center items-center mt-1"><select name="attr_spellcasting_ability"><option value="@{strength}" data-i18n="strength"><val></val></option><option value="@{dexterity}" data-i18n="dexterity"><val></val></option><option value="@{endurance}" data-i18n="endurance"><val></val></option><option value="@{awareness}" data-i18n="awareness"><val></val></option><option value="@{intellect}" data-i18n="intellect"><val></val></option><option value="@{charisma}" data-i18n="charisma"><val></val></option><option value="@{luck}" data-i18n="luck"><val></val></option></select></div></div><input type="hidden" name="attr_primary_source" value="arcane"/><div class="grid solid-border-2 rounded-md p-2 relative"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="primary source"></h2></div><div class="grid justify-center items-center mt-1"><select name="attr_primary_source"><option value="arcane" data-i18n="arcane"></option><val></val><option value="divine" data-i18n="divine"></option><val></val><option value="primal" data-i18n="primal"></option><val></val><option value="psionic" data-i18n="psionic"></option><val></val><option value="occult" data-i18n="occult"></option><val></val></select></div></div></div></div><div class="grid solid-border-2 rounded-md content-start p-2 source-magic relative"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="source"></h2></div><div class="grid grid-flow-col gap-2 mb-2 border-bottom subheaders"><div class="grid grid-flow-col gap-2 custom-grid"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><h3 class="ellipse text-center capitalize" data-i18n="power level"></h3></div></div><fieldset class="repeating_sources"><input type="hidden" name="attr_link" value=""/><div class="grid gap-2 relative repeating-grid"><div class="grid grid-flow-col gap-2 displayed custom-grid"><button class="text-left ellipsis chat capitalize" name="roll_source" type="roll" value="&{template:rolls} {{header=@{name}}} {{description=@{description}}}"><span name="attr_name"></span></button><span class="display ellipse text-center" name="attr_power_level" title="@{power_level}"></span></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 edit-grid"><div class="grid items-center gap-2 grid-flow-col col-auto-fr"><h4 class="ellipse capitalize" data-i18n="name"></h4><select name="attr_name"><option class="capitalize" value="arcane" data-i18n="arcane"><val></val></option><option class="capitalize" value="divine" data-i18n="divine"><val></val></option><option class="capitalize" value="primal" data-i18n="primal"><val></val></option><option class="capitalize" value="psionic" data-i18n="psionic"><val></val></option><option class="capitalize" value="occult" data-i18n="occult"><val></val></option></select></div><div class="grid justify-center items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="power level"></h4><label data-i18n-title="enter power level" title="enter power level"><input data-i18n-placeholder="power level" name="attr_power_level" placeholder="power level" title="@{power_level}" type="text" value=""/></label></div></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div></div><div class="grid gap-6 items-center spell-list"><div class="grid solid-border-2 rounded-md p-2 relative content-start spells spell-cards"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="spells"></h2></div><fieldset class="repeating_spells"><input type="hidden" name="attr_link" value=""/><input type="hidden" name="attr_roll_formula" value="{{description=@{description}}}"/><input type="hidden" name="attr_modifier" value="0"/><input type="hidden" name="attr_source" value="arcane"/><div class="grid gap-2 relative repeating-grid h-full content-start card"><div class="grid grid-flow-col gap-2 displayed custom-grid col-span-full"><button class="text-left ellipsis font-weight-bold" name="roll_name" type="roll" value="&{template:rolls} {{header=@{name}}} @{roll_formula}"><span name="attr_name"></span></button></div><div class="grid gap-2 items-center col-span-full"><span class="capitalize" name="attr_tags" title="@{tags}"></span></div><div class="grid gap-2 grid-flow-col col-span-full"><div class="grid gap-2 grid-flow-col display-span col-auto-fr"><h4 class="uppercase" data-i18n="apc"></h4><span class="capitalize" name="attr_apc" title="@{apc}"></span></div><div class="grid gap-2 grid-flow-col display-span col-auto-fr"><h4 class="uppercase" data-i18n="spc"></h4><span class="capitalize" name="attr_spc" title="@{spc}"></span></div></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="range"></h4><span class="capitalize" name="attr_range" title="@{range}"></span></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="requires"></h4><span class="capitalize" name="attr_requires" title="@{requires}"></span></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="duration"></h4><span class="capitalize" name="attr_duration" title="@{duration}"></span></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="ellipse capitalize" data-i18n="damage"></h4><button class="ellipsis font-weight-bold capitalize" name="roll_damage" type="roll" value="&{template:rolls} {{header=@{name} Damage}} {{dice=[[@{damage}[damage]+(@{damage_attribute}[damage attribute])]]}} {{type=@{damage_type}}}"><span name="attr_damage"></span></button></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="ellipse capitalize" data-i18n="damage type"></h4><span class="capitalize" name="attr_damage_type" title="@{damage_type}"></span></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="casting time"></h4><span class="capitalize" name="attr_casting_time" title="@{casting_time}"></span></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="recharge"></h4><span class="capitalize" name="attr_recharge" title="@{recharge}"></span></div><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 edit-grid"><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col grid-cols-2 items-center"><div class="grid gap-2 grid-flow-col col-auto-fr items-center"><h4 class="ellipse capitalize" data-i18n="source"></h4><select name="attr_source"><option value="arcane" data-i18n="arcane"><val></val></option><option value="divine" data-i18n="divine"><val></val></option><option value="primal" data-i18n="primal"><val></val></option><option value="psionic" data-i18n="psionic"><val></val></option><option value="occult" data-i18n="occult"><val></val></option></select></div><div class="grid gap-2 grid-flow-col items-center attack-toggle col-auto-fr"><h4 class="ellipse capitalize" data-i18n="attack"></h4><label class="switch" data-i18n-title="toggle attack"><input type="checkbox" name="attr_toggle_spell_attack"/><span class="slider"></span></label></div></div><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="tags"></h4><label data-i18n-title="enter tags" title="enter tags"><input data-i18n-placeholder="tags" name="attr_tags" placeholder="tags" title="@{tags}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col pc-grid-cols"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="apc"></h4><label data-i18n-title="enter apc" title="enter apc"><input data-i18n-placeholder="apc" name="attr_apc" placeholder="apc" title="@{apc}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="spc"></h4><label data-i18n-title="enter spc" title="enter spc"><input data-i18n-placeholder="spc" name="attr_spc" placeholder="spc" title="@{spc}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="range"></h4><label data-i18n-title="enter range" title="enter range"><input data-i18n-placeholder="range" name="attr_range" placeholder="range" title="@{range}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="requires"></h4><label data-i18n-title="enter requires" title="enter requires"><input data-i18n-placeholder="requires" name="attr_requires" placeholder="requires" title="@{requires}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="duration"></h4><label data-i18n-title="enter duration" title="enter duration"><input data-i18n-placeholder="duration" name="attr_duration" placeholder="duration" title="@{duration}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col grid-cols-2"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="damage"></h4><label data-i18n-title="enter damage" title="enter damage"><input data-i18n-placeholder="damage" name="attr_damage" placeholder="damage" title="@{damage}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="damage type"></h4><label data-i18n-title="enter damage type" title="enter damage type"><input data-i18n-placeholder="damage type" name="attr_damage_type" placeholder="damage type" title="@{damage_type}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="casting time"></h4><label data-i18n-title="enter casting time" title="enter casting time"><input data-i18n-placeholder="casting time" name="attr_casting_time" placeholder="casting time" title="@{casting_time}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="recharge"></h4><label data-i18n-title="enter recharge" title="enter recharge"><input data-i18n-placeholder="recharge" name="attr_recharge" placeholder="recharge" title="@{recharge}" type="text" value=""/></label></div></div><div class="grid gap-2 col-auto-fr items-center"><h4 class="ellipse capitalize" data-i18n="prerequisites"></h4><label data-i18n-title="enter prerequisites" title="enter prerequisites"><input data-i18n-placeholder="prerequisites" name="attr_prerequisites" placeholder="prerequisites" title="@{prerequisites}" type="text" value=""/></label></div><div class="grid gap-2 col-auto-fr items-center"><h4 class="ellipse capitalize" data-i18n="upcharge"></h4><label data-i18n-title="enter upcharge" title="enter upcharge"><input data-i18n-placeholder="upcharge" name="attr_upcharge" placeholder="upcharge" title="@{upcharge}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div></div></div><div class="grid gap-6 journal"><div class="grid rounded-md relative"><div class="grid solid-border-2 rounded-md p-2 relative additional-info content-start"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="additional info"></h2></div><div class="grid grid-flow-col gap-2 mb-2 border-bottom subheaders"><div class="grid grid-flow-col gap-2 custom-grid"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><h3 class="ellipse text-center capitalize" data-i18n="category"></h3></div></div><fieldset class="repeating_additional-info"><input type="hidden" name="attr_link" value=""/><div class="grid gap-2 relative repeating-grid"><div class="grid grid-flow-col gap-2 displayed custom-grid"><button class="text-left ellipsis chat" name="roll_additional_info" type="roll" value="&{template:rolls} {{header=@{name}}} {{description=@{description}}}"><span name="attr_name"></span></button><span class="display ellipse" name="attr_category" title="@{category}"></span></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 edit-grid"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="category"></h4><label data-i18n-title="enter category" title="enter category"><input data-i18n-placeholder="category" name="attr_category" placeholder="category" title="@{category}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div></div><div class="grid gap-2 grid-flow-col auto-cols-fr"><div class="grid solid-border-2 rounded-md p-2 relative location-request-contacts content-start"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="location request contacts"></h2></div><div class="grid grid-flow-col gap-2 mb-2 border-bottom subheaders"><div class="grid grid-flow-col gap-2 custom-grid"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3></div></div><fieldset class="repeating_location-request-contacts"><input type="hidden" name="attr_link" value=""/><div class="grid gap-2 relative repeating-grid"><div class="grid grid-flow-col gap-2 displayed custom-grid"><button class="text-left ellipsis chat" name="roll_location_request_contacts" type="roll" value="&{template:rolls} {{header=@{name}}} {{description=@{description}}}"><span name="attr_name"></span></button></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 edit-grid"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div><div class="grid solid-border-2 rounded-md p-2 relative content-start w-full"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="resources"></h2></div><fieldset class="repeating_resources"><div class="grid gap-2 grid-flow-col"><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label><div class="grid grid-flow-col gap-2"><div class="grid justify-center items-center"><label data-i18n-title="enter value" title="enter value"><input class="text-center" name="attr_value" title="@{value}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="current"></h3></div><div class="grid justify-center items-center"><label data-i18n-title="enter value max" title="enter value max"><input class="text-center" name="attr_value_max" title="@{value_max}" type="number" value="0"/></label><h3 class="ellipse text-center capitalize" data-i18n="max"></h3></div></div></div></fieldset></div></div><div class="grid solid-border-2 rounded-md p-2 relative journal content-start"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="journal"></h2></div><div class="grid grid-flow-col gap-2 mb-2 border-bottom subheaders"><div class="grid grid-flow-col gap-2 custom-grid"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><h3 class="ellipse text-center capitalize" data-i18n="date"></h3></div></div><fieldset class="repeating_journal"><input type="hidden" name="attr_link" value=""/><div class="grid gap-2 relative repeating-grid"><div class="grid grid-flow-col gap-2 displayed custom-grid"><button class="text-left ellipsis chat" name="roll_journal" type="roll" value="&{template:rolls} {{header=@{name}}} {{description=@{description}}}"><span name="attr_name"></span></button><span class="display ellipse" name="attr_date" title="@{date}"></span></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 edit-grid"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="date"></h4><label data-i18n-title="enter date" title="enter date"><input data-i18n-placeholder="date" name="attr_date" placeholder="date" title="@{date}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div></div><div class="grid gap-4 talents grid-flow-col talent-grid auto-cols-fr"><div class="grid solid-border-2 rounded-md p-2 relative talents content-start"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="talents"></h2></div><div class="grid grid-flow-col gap-2 mb-2 border-bottom subheaders"><div class="grid grid-flow-col gap-2 custom-grid"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><h3 class="ellipse text-center capitalize" data-i18n="tags"></h3></div></div><fieldset class="repeating_talents"><input type="hidden" name="attr_link" value=""/><div class="grid gap-2 relative repeating-grid"><div class="grid grid-flow-col gap-2 displayed custom-grid"><button class="text-left ellipsis chat" name="roll_talents" type="roll" value="&{template:rolls} {{header=@{name}}} {{description=@{description}}}"><span name="attr_name"></span></button><span class="display ellipse" name="attr_tags" title="@{tags}"></span></div><input class="toggle toggle-favorite" name="attr_toggle_favorite" title="favorite toggle" type="checkbox" value="true"/><span class="pictos uppercase">S</span><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="prerequisites"></h4><span class="capitalize" name="attr_prerequisites" title="@{prerequisites}"></span></div><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 edit-grid"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="tags"></h4><label data-i18n-title="enter tags" title="enter tags"><input data-i18n-placeholder="tags" name="attr_tags" placeholder="tags" title="@{tags}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="prerequisites"></h4><label data-i18n-title="enter prerequisites" title="enter prerequisites"><input data-i18n-placeholder="prerequisites" name="attr_prerequisites" placeholder="prerequisites" title="@{prerequisites}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div><div class="grid solid-border-2 rounded-md p-2 relative abilities content-start"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="abilities"></h2></div><div class="grid grid-flow-col gap-2 mb-2 border-bottom subheaders"><div class="grid grid-flow-col gap-2 custom-grid"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><h3 class="ellipse text-center capitalize" data-i18n="tags"></h3></div></div><fieldset class="repeating_abilities"><input type="hidden" name="attr_link" value=""/><div class="grid gap-2 relative repeating-grid"><div class="grid grid-flow-col gap-2 displayed custom-grid"><button class="text-left ellipsis chat" name="roll_abilities" type="roll" value="&{template:rolls} {{header=@{name}}} {{description=@{description}}}"><span name="attr_name"></span></button><span class="display ellipse" name="attr_tags" title="@{tags}"></span></div><input class="toggle toggle-favorite" name="attr_toggle_favorite" title="favorite toggle" type="checkbox" value="true"/><span class="pictos uppercase">S</span><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 edit-grid"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="tags"></h4><label data-i18n-title="enter tags" title="enter tags"><input data-i18n-placeholder="tags" name="attr_tags" placeholder="tags" title="@{tags}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div></div><div class="grid gap-6 settings"><div class="grid gap-4 grid-flow-col grid-cols-2"><div class="grid solid-border-2 rounded-md p-2 relative justify-center h-max"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="character type"></h2></div><div class="mt-2"><div class="grid gap-2 grid-flow-col"><select name="attr_sheet_type"><option value="pc" data-i18n="pc"><val></val></option><option value="creature" data-i18n="creature"><val></val></option><option value="siege" data-i18n="siege"><val></val></option></select></div></div></div><!-- .grid.solid-border-2.rounded-md.p-2.relative.justify-center.h-max--><!-- +title('charactermancer')--><!-- .mt-2--><!-- button(type="action" name="act_launch_charactermancer" data-i18n="charactermancer")--><div class="grid solid-border-2 rounded-md p-2 relative"><div class="grid gap-4 justify-center absolute title"><h2 class="px-2 text-center capitalize" data-i18n="modifiers"></h2></div><div class="grid grid-flow-col gap-2 mb-2 border-bottom subheaders"><div class="grid grid-flow-col gap-2 custom-grid"><h3 class="ellipse text-center capitalize" data-i18n="active"></h3><h3 class="ellipse text-center capitalize" data-i18n="attribute"></h3><h3 class="ellipse text-center capitalize" data-i18n="modifier"></h3><h3 class="ellipse text-center capitalize" data-i18n="source"></h3></div></div><fieldset class="repeating_modifiers"><input type="hidden" name="attr_link" value=""/><div class="grid gap-2 relative repeating-grid"><div class="grid grid-flow-col gap-2 displayed custom-grid custom-grid"><label class="switch" data-i18n-title="toggle active"><input type="checkbox" name="attr_toggle_active"/><span class="slider"></span></label><span class="display ellipse capitalize text-center" name="attr_attribute" title="@{attribute}"></span><span class="display ellipse capitalize text-center" name="attr_modifier" title="@{modifier}"></span><span class="display ellipse capitalize text-center" name="attr_source" title="@{source}"></span></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="source"></h4><span class="capitalize" name="attr_source" title="@{source}"></span></div><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 edit-grid"><select name="attr_attribute"><option value="anticipation" data-i18n="anticipation"><val></val></option><option value="critical_fail" data-i18n="critical fail"><val></val></option><option value="critical_hit" data-i18n="critical hit"><val></val></option><option value="fortitude" data-i18n="fortitude"><val></val></option><option value="initiative" data-i18n="initiative"><val></val></option><option value="logic" data-i18n="logic"><val></val></option><option value="reflexes" data-i18n="reflexes"><val></val></option><option value="willpower" data-i18n="willpower"><val></val></option></select><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="modifier"></h4><label data-i18n-title="enter modifier" title="enter modifier"><input data-i18n-placeholder="modifier" name="attr_modifier" placeholder="modifier" title="@{modifier}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="source"></h4><label data-i18n-title="enter source" title="enter source"><input data-i18n-placeholder="source" name="attr_source" placeholder="source" title="@{source}" type="text" value=""/></label></div></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div></div></div></div><div class="creature p-2 relative auto-rows-max"><input class="settings-npc" type="hidden" name="attr_toggle_npc_settings"/><input class="edit-npc" type="hidden" name="attr_toggle_edit_npc_edit" value="true"/><input class="sections" type="hidden" name="attr_npc_sections" value=""/><div class="grid grid-flow-col auto-cols-min gap-2 settings-toggle absolute"><div class="grid relative grid-flow-col auto-cols-min gap-2"><input class="toggle toggle-edit" name="attr_toggle_edit_npc_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span></div><div class="grid relative grid-flow-col auto-cols-min gap-2"><input class="toggle toggle-settings" name="attr_toggle_npc_settings" title="favorite toggle" type="checkbox" value="true"/><span class="pictos lowercase">y</span></div></div><div class="grid gap-4 sheet"><div class="display-mode"><span class="display" name="attr_character_name"></span><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><span class="italic">Monster Level:</span><span class="italic" name="attr_level"></span></div><div class="grid gap-1 grid-flow-col items-center auto-cols-max"><span class="italic capitalize" name="attr_size" title="@{size}"></span><span class="italic capitalize" name="attr_tags" title="@{tags}"></span></div></div><div class="inputs grid gap-2"><div class="grid gap-2 grid-flow-col bio"><div class="grid grid-flow-col gap-2"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="character name"></h3><label data-i18n-title="enter character name" title="enter character name"><input data-i18n-placeholder="character name" name="attr_character_name" placeholder="character name" title="@{character_name}" type="text" value=""/></label></div></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="level"></h3><label data-i18n-title="enter level" title="enter level"><input class="text-center" name="attr_level" title="@{level}" type="number" value="0"/></label></div></div><div class="grid grid-flow-col gap-2 size-tags"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="size"></h3><label data-i18n-title="enter size" title="enter size"><input data-i18n-placeholder="size" name="attr_size" placeholder="size" title="@{size}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="tags"></h3><label data-i18n-title="enter tags" title="enter tags"><input data-i18n-placeholder="tags" name="attr_tags" placeholder="tags" title="@{tags}" type="text" value=""/></label></div></div></div><div class="grid gap-1 justify-between items-center attrs"><div class="grid relative justify-center items-center strength"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined strength" data-i18n="str" name="roll_strength" type="roll" value="&{template:rolls} {{header=^{strength}}} {{dice=[[1d20+@{strength}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter strength" title="enter strength"><input class="text-center" name="attr_strength" title="@{strength}" type="number" value="0"/></label></div></div><div class="grid relative justify-center items-center dexterity"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined dexterity" data-i18n="dex" name="roll_dexterity" type="roll" value="&{template:rolls} {{header=^{dexterity}}} {{dice=[[1d20+@{dexterity}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter dexterity" title="enter dexterity"><input class="text-center" name="attr_dexterity" title="@{dexterity}" type="number" value="0"/></label></div></div><div class="grid relative justify-center items-center endurance"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined endurance" data-i18n="end" name="roll_endurance" type="roll" value="&{template:rolls} {{header=^{endurance}}} {{dice=[[1d20+@{endurance}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter endurance" title="enter endurance"><input class="text-center" name="attr_endurance" title="@{endurance}" type="number" value="0"/></label></div></div><div class="grid relative justify-center items-center awareness"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined awareness" data-i18n="awr" name="roll_awareness" type="roll" value="&{template:rolls} {{header=^{awareness}}} {{dice=[[1d20+@{awareness}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter awareness" title="enter awareness"><input class="text-center" name="attr_awareness" title="@{awareness}" type="number" value="0"/></label></div></div><div class="grid relative justify-center items-center intellect"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined intellect" data-i18n="int" name="roll_intellect" type="roll" value="&{template:rolls} {{header=^{intellect}}} {{dice=[[1d20+@{intellect}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter intellect" title="enter intellect"><input class="text-center" name="attr_intellect" title="@{intellect}" type="number" value="0"/></label></div></div><div class="grid relative justify-center items-center charisma"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined charisma" data-i18n="cha" name="roll_charisma" type="roll" value="&{template:rolls} {{header=^{charisma}}} {{dice=[[1d20+@{charisma}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter charisma" title="enter charisma"><input class="text-center" name="attr_charisma" title="@{charisma}" type="number" value="0"/></label></div></div><div class="grid relative justify-center items-center luck"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined luck" data-i18n="luck" name="roll_luck" type="roll" value="&{template:rolls} {{header=^{luck}}} {{dice=[[1d20+@{luck}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter luck" title="enter luck"><input class="text-center" name="attr_luck" title="@{luck}" type="number" value="0"/></label></div></div><div class="grid relative justify-center items-center coordination"><div class="circle rounded-full border grid justify-center items-center font-bold"><button class="text-center uppercase undefined coordination" data-i18n="cor" name="roll_coordination" type="roll" value="&{template:rolls} {{header=^{coordination}}} {{dice=[[1d20+@{coordination}[attribute]+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} "></button><label data-i18n-title="enter coordination" title="enter coordination"><input class="text-center" name="attr_coordination" title="@{coordination}" type="number" value="0"/></label></div></div><div></div><div class="grid relative justify-center items-center reflexes"><div class="circle rounded-full border grid justify-center items-center font-bold"><h3 class="ellipse text-center capitalize" data-i18n="ref"></h3><span class="text-center" name="attr_reflexes" title="@{reflexes}"></span></div></div><div class="grid relative justify-center items-center fortitude"><div class="circle rounded-full border grid justify-center items-center font-bold"><h3 class="ellipse text-center capitalize" data-i18n="fort"></h3><span class="text-center" name="attr_fortitude" title="@{fortitude}"></span></div></div><div class="grid relative justify-center items-center anticipation"><div class="circle rounded-full border grid justify-center items-center font-bold"><h3 class="ellipse text-center capitalize" data-i18n="ant"></h3><span class="text-center" name="attr_anticipation" title="@{anticipation}"></span></div></div><div class="grid relative justify-center items-center logic"><div class="circle rounded-full border grid justify-center items-center font-bold"><h3 class="ellipse text-center capitalize" data-i18n="log"></h3><span class="text-center" name="attr_logic" title="@{logic}"></span></div></div><div class="grid relative justify-center items-center willpower"><div class="circle rounded-full border grid justify-center items-center font-bold"><h3 class="ellipse text-center capitalize" data-i18n="wil"></h3><span class="text-center" name="attr_willpower" title="@{willpower}"></span></div></div></div><div class="display-mode grid gap-4"><div class="grid gap-2 grid-flow-col auto-rows-min"><div class="grid"><div class="grid gap-2 grid-flow-col auto-cols-max items-center"><h3 class="ellipse text-center capitalize" data-i18n="hp"></h3><span class="font-base" name="attr_hp" title="@{hp}"></span></div><div class="grid gap-2 grid-flow-col auto-cols-max items-center"><h3 class="ellipse text-center capitalize" data-i18n="speed"></h3><span class="font-base" name="attr_speed" title="@{speed}"></span></div></div><div class="grid gap-1 grid-flow-col col-auto-fr display-span"><h3 class="ellipse text-center capitalize" data-i18n="armor rating"></h3><span class="font-base" name="attr_armor_rating" title="@{armor_rating}"></span></div></div><div class="grid auto-rows-min"><div class="grid gap-2 items-center auto-cols-max grid-flow-col"><div class="grid gap-2 grid-flow-col items-center auto-cols-max display-span display-span"><h3 class="ellipse text-center capitalize" data-i18n="resist"></h3><span class="font-base" name="attr_resist" title="@{resist}"></span></div><div class="grid gap-2 grid-flow-col items-center auto-cols-max display-span display-span"><h3 class="ellipse text-center capitalize" data-i18n="immune"></h3><span class="font-base" name="attr_immune" title="@{immune}"></span></div></div><div class="grid gap-2 items-center auto-cols-max grid-flow-col"><div class="grid gap-2 grid-flow-col items-center auto-cols-max display-span"><h3 class="ellipse text-center capitalize" data-i18n="vulnerable"></h3><span class="font-base" name="attr_vulnerable" title="@{vulnerable}"></span></div></div><div class="grid gap-2 items-center auto-cols-max grid-flow-col"><div class="grid gap-2 grid-flow-col items-center auto-cols-max display-span"><h3 class="ellipse text-center capitalize" data-i18n="damage reduction"></h3><span class="font-base" name="attr_damage_reduction" title="@{damage_reduction}"></span></div><div class="grid gap-2 grid-flow-col items-center auto-cols-max display-span"><h3 class="ellipse text-center capitalize" data-i18n="damage threshold"></h3><span class="font-base" name="attr_damage_threshold" title="@{damage_threshold}"></span></div></div><div class="grid gap-2 grid-flow-col items-center items-center auto-cols-max display-span"><h3 class="ellipse text-center capitalize" data-i18n="senses"></h3><span class="font-base" name="attr_senses" title="@{senses}"></span></div><div class="grid gap-2 grid-flow-col items-center items-center auto-cols-max display-span"><h3 class="ellipse text-center capitalize" data-i18n="traits"></h3><span class="font-base" name="attr_traits" title="@{traits}"></span></div></div></div><div class="inputs grid gap-4"><div class="grid gap-2 grid-flow-col items-center hp-armor-speed"><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="hp"></h3><label data-i18n-title="enter hp" title="enter hp"><input data-i18n-placeholder="hp" name="attr_hp" placeholder="hp" title="@{hp}" type="text" value=""/></label></div></div><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="armor rating"></h3><label data-i18n-title="enter armor rating" title="enter armor rating"><input data-i18n-placeholder="armor rating" name="attr_armor_rating" placeholder="armor rating" title="@{armor_rating}" type="text" value=""/></label></div></div><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="speed"></h3><label data-i18n-title="enter speed" title="enter speed"><input data-i18n-placeholder="speed" name="attr_speed" placeholder="speed" title="@{speed}" type="text" value=""/></label></div></div></div><div class="grid gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="resist"></h3><label data-i18n-title="enter resist" title="enter resist"><input data-i18n-placeholder="resist" name="attr_resist" placeholder="resist" title="@{resist}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="immune"></h3><label data-i18n-title="enter immune" title="enter immune"><input data-i18n-placeholder="immune" name="attr_immune" placeholder="immune" title="@{immune}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="vulnerable"></h3><label data-i18n-title="enter vulnerable" title="enter vulnerable"><input data-i18n-placeholder="vulnerable" name="attr_vulnerable" placeholder="vulnerable" title="@{vulnerable}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="damage reduction"></h3><label data-i18n-title="enter damage reduction" title="enter damage reduction"><input data-i18n-placeholder="damage reduction" name="attr_damage_reduction" placeholder="damage reduction" title="@{damage_reduction}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="damage threshold"></h3><label data-i18n-title="enter damage threshold" title="enter damage threshold"><input data-i18n-placeholder="damage threshold" name="attr_damage_threshold" placeholder="damage threshold" title="@{damage_threshold}" type="text" value=""/></label></div></div><div class="grid gap-2 items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="senses"></h3><label data-i18n-title="enter senses" title="enter senses"><input data-i18n-placeholder="senses" name="attr_senses" placeholder="senses" title="@{senses}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="traits"></h3><label data-i18n-title="enter traits" title="enter traits"><input data-i18n-placeholder="traits" name="attr_traits" placeholder="traits" title="@{traits}" type="text" value=""/></label></div></div></div><div class="grid gap-2 items-center section-skills"><div class="grid gap-2 header-toggle"><h2 class="ellipse uppercase text-primary" data-i18n="skills"></h2><label class="switch" data-i18n-title="toggle skills"><input type="checkbox" name="attr_section_skills" value="on"/><span class="slider"></span></label></div><div class="display-mode mb-2"><i><span name="attr_skill_description"></span></i></div><div class="inputs"><textarea name="attr_skill_description" title="@{skill_description}"></textarea></div><fieldset class="repeating_skills"><input type="hidden" name="attr_attribute_abbreviation" value="STR"/><input type="hidden" name="attr_bonus" value="0"/><div class="grid gap-2 relative repeating-grid repeating_skills"><div class="grid grid-flow-col gap-2 displayed custom-grid"><button class="text-left ellipsis font-weight-bold" name="roll_skill" type="roll" value="&{template:rolls} {{header=@{name}}} {{dice=[[1d20+@{attribute}[attribute]+(@{modifier}[modifier])+(@{luck_negative_modifier}[negative luck modifier])cs@{critical_hit}cf@{critical_fail}]]}} {}}"><span name="attr_name"></span></button><span class="uppercase" name="attr_attribute_abbreviation"></span><span class="text-center" name="attr_modifier" title="@{modifier}"></span></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="category"></h4><span class="capitalize" name="attr_category" title="@{category}"></span></div><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid col-auto-fr gap-1 grid-flow-col items-center name"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center category"><h4 class="ellipse capitalize" data-i18n="category"></h4><label data-i18n-title="enter category" title="enter category"><input data-i18n-placeholder="category" name="attr_category" placeholder="category" title="@{category}" type="text" value=""/></label></div><div class="grid gap-2 grid-flow-col items-center attribute"><div class="grid gap-2 col-auto-fr items-center attribute-select"><h4 class="ellipse capitalize" data-i18n="attribute"></h4><select name="attr_attribute"><option value="@{strength}" data-i18n="strength"><val></val></option><option value="@{dexterity}" data-i18n="dexterity"><val></val></option><option value="@{endurance}" data-i18n="endurance"><val></val></option><option value="@{awareness}" data-i18n="awareness"><val></val></option><option value="@{intellect}" data-i18n="intellect"><val></val></option><option value="@{charisma}" data-i18n="charisma"><val></val></option><option value="@{luck}" data-i18n="luck"><val></val></option></select></div><span class="text-center plus">+</span><div class="grid col-auto-fr gap-1 grid-flow-col items-center modifier"><h4 class="ellipse capitalize" data-i18n="modifier"></h4><label data-i18n-title="enter modifier" title="enter modifier"><input data-i18n-placeholder="modifier" name="attr_modifier" placeholder="modifier" title="@{modifier}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div><div class="grid items-center section-features"><div class="grid gap-2 header-toggle"><h2 class="ellipse uppercase text-primary" data-i18n="features"></h2><label class="switch" data-i18n-title="toggle features"><input type="checkbox" name="attr_section_features" value="on"/><span class="slider"></span></label></div><fieldset class="repeating_features"><input type="hidden" name="attr_link" value=""/><div class="grid gap-2 relative repeating-grid features"><div class="grid grid-flow-col gap-2 displayed custom-grid"><p><button class="text-left ellipsis chat" name="roll_features" type="roll" value="&{template:rolls} {{header=@{name}}} {{description=@{description}}}"><span name="attr_name"></span></button><input type="hidden" name="attr_damage" value=""/><span class="hit font-bold capitalize" data-i18n="Hit:"></span><button class="ellipsis font-weight-bold text-center" name="roll_damage" type="roll" value="&{template:rolls} {{header=@{name} Damage}} {{dice=[[@{damage}[damage]+(@{damage_attribute}[damage attribute])]]}} {{type=@{damage_type}}}"><span name="attr_damage"></span></button><span name="attr_damage_type" title="@{damage_type}"></span><span name="attr_description"></span></p></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><div class="edit grid gap-2"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="grid gap-2 grid-flow-col damage"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="damage"></h3><label data-i18n-title="enter damage" title="enter damage"><input data-i18n-placeholder="damage" name="attr_damage" placeholder="damage" title="@{damage}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="damage type"></h3><label data-i18n-title="enter damage type" title="enter damage type"><input data-i18n-placeholder="damage type" name="attr_damage_type" placeholder="damage type" title="@{damage_type}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div><div class="grid gap-2 items-center actions section-actions"><div class="grid gap-2 header-toggle"><h2 class="ellipse uppercase text-primary" data-i18n="actions"></h2><label class="switch" data-i18n-title="toggle actions"><input type="checkbox" name="attr_section_actions" value="on"/><span class="slider"></span></label></div><div class="display-mode mb-2"><i><span name="attr_action_description"></span></i></div><div class="inputs"><textarea name="attr_action_description" title="@{action_description}"></textarea></div><fieldset class="repeating_actions"><input type="hidden" name="attr_roll_formula" value="{{description=@{effect} @{description}}}"/><button class="ellipsis font-weight-bold hidden" name="roll_effect" type="roll" value="&{template:rolls} {{header=@{name}}} {{type=@{damage_type}}} {{effect=@{effect}}} {{description=@{description}}}"><span data-i18n="effect"></span></button><div class="grid gap-2 relative repeating-grid"><input type="hidden" name="attr_name"/><div class="grid grid-flow-col gap-2 displayed custom-grid"><span class="or font-bold" name="attr_name"></span><span class="or" name="attr_description"></span><input type="hidden" name="attr_toggle_action_attack"/><p><button class="text-left ellipsis font-weight-bold" name="roll_name" type="roll" value="&{template:rolls} {{header=@{name}}} @{roll_formula}"><span name="attr_name"></span></button><span name="attr_description"> </span><span class="italic" name="attr_range" title="@{range}"></span><span class="italic" name="attr_type" title="@{type}"></span><span name="attr_modifier" title="@{modifier}"></span><span class="vs">vs</span><span name="attr_defense" title="@{defense}"></span><span class="hit font-bold capitalize" data-i18n="Hit:"></span><span class="text-center mr-1" name="attr_damage_average" title="@{damage_average}"></span><button class="ellipsis font-weight-bold" name="roll_damage" type="roll" value="&{template:rolls} {{header=@{name} Damage}} {{type=@{damage_type}}} {{dice=[[@{damage}[damage]+0]]}} {{effect=@{effect}}} {{description=@{description}}}"><span name="attr_damage"></span></button><span class="ml-1" name="attr_damage_type" title="@{damage_type}"></span><span name="attr_effect" title="@{effect}"></span></p></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><div class="edit grid gap-2"><div class="grid gap-2 grid-flow-col col-fr-auto"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="grid gap-2 grid-flow-col items-center attack-toggle auto-cols-min"><h3 class="ellipse text-center capitalize" data-i18n="attack"></h3><label class="switch" data-i18n-title="toggle attack"><input type="checkbox" name="attr_toggle_action_attack"/><span class="slider"></span></label></div></div><div class="grid gap-2 grid-flow-col range"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="range"></h3><label data-i18n-title="enter range" title="enter range"><input data-i18n-placeholder="range" name="attr_range" placeholder="range" title="@{range}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="type"></h3><label data-i18n-title="enter type" title="enter type"><input data-i18n-placeholder="type" name="attr_type" placeholder="type" title="@{type}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col items-center modifier"><div class="grid col-auto-fr gap-1 grid-flow-col items-center text-center"><h3 class="ellipse text-center capitalize" data-i18n="modifier"></h3><label data-i18n-title="enter modifier" title="enter modifier"><input data-i18n-placeholder="modifier" name="attr_modifier" placeholder="modifier" title="@{modifier}" type="text" value=""/></label></div><span>vs</span><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="defense"></h3><label data-i18n-title="enter defense" title="enter defense"><input data-i18n-placeholder="defense" name="attr_defense" placeholder="defense" title="@{defense}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col damage"><h3 class="ellipse text-center capitalize" data-i18n="Hit"></h3><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="damage"></h3><div class="grid grid-flow-col items-center dmg"><label data-i18n-title="enter damage average" title="enter damage average"><input class="text-center" data-i18n-placeholder="damage average" name="attr_damage_average" placeholder="damage average" title="@{damage_average}" type="text" value=""/></label><div class="grid grid-flow-col items-center"><span>(</span><label data-i18n-title="enter damage" title="enter damage"><input data-i18n-placeholder="damage" name="attr_damage" placeholder="damage" title="@{damage}" type="text" value=""/></label><span>)</span></div></div></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="type"></h3><label data-i18n-title="enter damage type" title="enter damage type"><input data-i18n-placeholder="damage type" name="attr_damage_type" placeholder="damage type" title="@{damage_type}" type="text" value=""/></label></div></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="effect"></h3><label data-i18n-title="enter effect" title="enter effect"><input data-i18n-placeholder="effect" name="attr_effect" placeholder="effect" title="@{effect}" type="text" value=""/></label></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div><div class="grid items-center section-reactions"><div class="grid gap-2 header-toggle"><h2 class="ellipse capitalize text-primary" data-i18n="reactions"></h2><label class="switch" data-i18n-title="toggle reactions"><input type="checkbox" name="attr_section_reactions" value="on"/><span class="slider"></span></label></div><fieldset class="repeating_reactions"><input type="hidden" name="attr_link" value=""/><div class="grid gap-2 relative repeating-grid"><div class="grid grid-flow-col gap-2 displayed custom-grid"><p><button class="text-left ellipsis chat" name="roll_reactions" type="roll" value="&{template:rolls} {{header=@{name}}} {{description=@{description}}}"><span name="attr_name"></span></button><span name="attr_description"></span></p></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><div class="edit grid gap-2"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="description"></div><textarea name="attr_description" placeholder="description"></textarea></div></div></fieldset></div><div class="grid items-center section-spells"><div class="grid gap-2 header-toggle"><h2 class="ellipse capitalize text-primary" data-i18n="spells"></h2><label class="switch" data-i18n-title="toggle spells"><input type="checkbox" name="attr_section_spells" value="on"/><span class="slider"></span></label></div><fieldset class="repeating_spells"><input type="hidden" name="attr_link" value=""/><input type="hidden" name="attr_roll_formula" value="{{description=@{description}}}"/><input type="hidden" name="attr_modifier" value="0"/><input type="hidden" name="attr_source" value="arcane"/><div class="grid gap-2 relative repeating-grid h-full content-start card"><div class="grid grid-flow-col gap-2 displayed custom-grid col-span-full"><button class="text-left ellipsis font-weight-bold" name="roll_name" type="roll" value="&{template:rolls} {{header=@{name}}} @{roll_formula}"><span name="attr_name"></span></button></div><div class="grid gap-2 items-center col-span-full"><span class="capitalize" name="attr_tags" title="@{tags}"></span></div><div class="grid gap-2 grid-flow-col col-span-full"><div class="grid gap-2 grid-flow-col display-span col-auto-fr"><h4 class="uppercase" data-i18n="apc"></h4><span class="capitalize" name="attr_apc" title="@{apc}"></span></div><div class="grid gap-2 grid-flow-col display-span col-auto-fr"><h4 class="uppercase" data-i18n="spc"></h4><span class="capitalize" name="attr_spc" title="@{spc}"></span></div></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><input class="toggle toggle-collapse" name="attr_toggle_collapse" title="collapse toggle" type="checkbox" value="true"/><span class="pictos lowercase">i</span><div class="collapsible grid gap-2"><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="range"></h4><span class="capitalize" name="attr_range" title="@{range}"></span></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="requires"></h4><span class="capitalize" name="attr_requires" title="@{requires}"></span></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="duration"></h4><span class="capitalize" name="attr_duration" title="@{duration}"></span></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="ellipse capitalize" data-i18n="damage"></h4><button class="ellipsis font-weight-bold capitalize" name="roll_damage" type="roll" value="&{template:rolls} {{header=@{name} Damage}} {{dice=[[@{damage}[damage]+(@{damage_attribute}[damage attribute])]]}} {{type=@{damage_type}}}"><span name="attr_damage"></span></button></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="ellipse capitalize" data-i18n="damage type"></h4><span class="capitalize" name="attr_damage_type" title="@{damage_type}"></span></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="casting time"></h4><span class="capitalize" name="attr_casting_time" title="@{casting_time}"></span></div><div class="grid gap-2 col-auto-fr items-center display-span"><h4 class="capitalize" data-i18n="recharge"></h4><span class="capitalize" name="attr_recharge" title="@{recharge}"></span></div><div class="description"><span class="display" name="attr_description"></span></div></div><div class="edit grid gap-2"><div class="grid gap-2 edit-grid"><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="name"></h4><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col grid-cols-2 items-center"><div class="grid gap-2 grid-flow-col col-auto-fr items-center"><h4 class="ellipse capitalize" data-i18n="source"></h4><select name="attr_source"><option value="arcane" data-i18n="arcane"><val></val></option><option value="divine" data-i18n="divine"><val></val></option><option value="primal" data-i18n="primal"><val></val></option><option value="psionic" data-i18n="psionic"><val></val></option><option value="occult" data-i18n="occult"><val></val></option></select></div><div class="grid gap-2 grid-flow-col items-center attack-toggle col-auto-fr"><h4 class="ellipse capitalize" data-i18n="attack"></h4><label class="switch" data-i18n-title="toggle attack"><input type="checkbox" name="attr_toggle_spell_attack"/><span class="slider"></span></label></div></div><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="tags"></h4><label data-i18n-title="enter tags" title="enter tags"><input data-i18n-placeholder="tags" name="attr_tags" placeholder="tags" title="@{tags}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col pc-grid-cols"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="apc"></h4><label data-i18n-title="enter apc" title="enter apc"><input data-i18n-placeholder="apc" name="attr_apc" placeholder="apc" title="@{apc}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="spc"></h4><label data-i18n-title="enter spc" title="enter spc"><input data-i18n-placeholder="spc" name="attr_spc" placeholder="spc" title="@{spc}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="range"></h4><label data-i18n-title="enter range" title="enter range"><input data-i18n-placeholder="range" name="attr_range" placeholder="range" title="@{range}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="requires"></h4><label data-i18n-title="enter requires" title="enter requires"><input data-i18n-placeholder="requires" name="attr_requires" placeholder="requires" title="@{requires}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="duration"></h4><label data-i18n-title="enter duration" title="enter duration"><input data-i18n-placeholder="duration" name="attr_duration" placeholder="duration" title="@{duration}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col grid-cols-2"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="damage"></h4><label data-i18n-title="enter damage" title="enter damage"><input data-i18n-placeholder="damage" name="attr_damage" placeholder="damage" title="@{damage}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="damage type"></h4><label data-i18n-title="enter damage type" title="enter damage type"><input data-i18n-placeholder="damage type" name="attr_damage_type" placeholder="damage type" title="@{damage_type}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="casting time"></h4><label data-i18n-title="enter casting time" title="enter casting time"><input data-i18n-placeholder="casting time" name="attr_casting_time" placeholder="casting time" title="@{casting_time}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h4 class="ellipse capitalize" data-i18n="recharge"></h4><label data-i18n-title="enter recharge" title="enter recharge"><input data-i18n-placeholder="recharge" name="attr_recharge" placeholder="recharge" title="@{recharge}" type="text" value=""/></label></div></div><div class="grid gap-2 col-auto-fr items-center"><h4 class="ellipse capitalize" data-i18n="prerequisites"></h4><label data-i18n-title="enter prerequisites" title="enter prerequisites"><input data-i18n-placeholder="prerequisites" name="attr_prerequisites" placeholder="prerequisites" title="@{prerequisites}" type="text" value=""/></label></div><div class="grid gap-2 col-auto-fr items-center"><h4 class="ellipse capitalize" data-i18n="upcharge"></h4><label data-i18n-title="enter upcharge" title="enter upcharge"><input data-i18n-placeholder="upcharge" name="attr_upcharge" placeholder="upcharge" title="@{upcharge}" type="text" value=""/></label></div></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div></div><div class="grid gap-4 settings"> <div class="grid gap-2"><h2 class="ellipse capitalize" data-i18n="character type"></h2><div class="grid gap-2 grid-flow-col"><select name="attr_sheet_type"><option value="pc" data-i18n="pc"><val></val></option><option value="creature" data-i18n="creature"><val></val></option><option value="siege" data-i18n="siege"><val></val></option></select></div></div></div></div><div class="siege p-2 relative auto-rows-max"><input class="settings-npc" type="hidden" name="attr_toggle_npc_settings"/><input class="edit-npc" type="hidden" name="attr_toggle_edit_npc_edit" value="true"/><input class="sections" type="hidden" name="attr_npc_sections" value=""/><div class="grid grid-flow-col auto-cols-min gap-2 settings-toggle absolute"><div class="grid relative grid-flow-col auto-cols-min gap-2"><input class="toggle toggle-edit" name="attr_toggle_edit_npc_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span></div><div class="grid relative grid-flow-col auto-cols-min gap-2"><input class="toggle toggle-settings" name="attr_toggle_npc_settings" title="favorite toggle" type="checkbox" value="true"/><span class="pictos lowercase">y</span></div></div><div class="grid gap-4 sheet"><div class="display-mode"><span class="display" name="attr_character_name"></span><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><span name="attr_description" title="@{description}"></span></div></div><div class="inputs grid gap-2"><div class="grid gap-2 grid-flow-col bio"><div class="grid grid-flow-col gap-2"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="character name"></h3><label data-i18n-title="enter character name" title="enter character name"><input data-i18n-placeholder="character name" name="attr_character_name" placeholder="character name" title="@{character_name}" type="text" value=""/></label></div></div></div><div class="grid gap-2"><h3 class="ellipse text-center capitalize" data-i18n="description"></h3><textarea name="attr_description" placeholder="description"></textarea></div></div><div class="display-mode grid gap-4"><div class="grid auto-rows-min"><div class="grid gap-2 grid-flow-col auto-cols-max items-center"><h3 class="ellipse text-center capitalize" data-i18n="range"></h3><span name="attr_range" title="@{range}"></span></div><div class="grid gap-2 grid-flow-col auto-cols-max items-center"><h3 class="ellipse text-center capitalize" data-i18n="ammunition"></h3><span name="attr_ammunition" title="@{ammunition}"></span></div><div class="grid gap-2 grid-flow-col auto-cols-max items-center"><h3 class="ellipse text-center capitalize" data-i18n="reload"></h3><span name="attr_reload" title="@{reload}"></span></div><div class="grid gap-1 grid-flow-col col-auto-fr display-span"><h3 class="ellipse text-center capitalize" data-i18n="AOE"></h3><span name="attr_area_of_effect" title="@{area_of_effect}"></span></div><div class="grid gap-2 grid-flow-col auto-cols-max items-center display-span"><h3 class="ellipse text-center capitalize" data-i18n="helf"></h3><span name="attr_helf" title="@{helf}"></span></div><div class="grid gap-2 grid-flow-col auto-cols-max items-center display-span"><h3 class="ellipse text-center capitalize" data-i18n="speed"></h3><span name="attr_speed" title="@{speed}"></span></div><div class="grid gap-2 grid-flow-col auto-cols-max items-center display-span"><h3 class="ellipse text-center capitalize" data-i18n="hp"></h3><span name="attr_hp" title="@{hp}"></span></div><div class="grid gap-4 grid-flow-col items-center auto-cols-max"><div class="grid gap-2 grid-flow-col auto-cols-min"><h3 class="ellipse text-center capitalize text-left" data-i18n="AR"></h3><span name="attr_armor_rating" title="@{armor_rating}"></span></div><div class="grid gap-2 grid-flow-col auto-cols-min"><h3 class="ellipse text-center capitalize text-left" data-i18n="REF"></h3><span name="attr_reflexes" title="@{reflexes}"></span></div><div class="grid gap-2 grid-flow-col auto-cols-min"><h3 class="ellipse text-center capitalize text-left" data-i18n="FORT"></h3><span name="attr_fortitude" title="@{fortitude}"></span></div></div><div class="resist grid gap-2 grid-flow-col items-center"><div class="grid gap-2 grid-flow-col auto-cols-max display-span"><h3 class="ellipse text-center capitalize text-left" data-i18n="resist"></h3><span name="attr_resist" title="@{resist}"></span></div><div class="grid gap-2 grid-flow-col auto-cols-max display-span"><h3 class="ellipse text-center capitalize text-left" data-i18n="immune"></h3><span name="attr_immune" title="@{immune}"></span></div></div><div class="grid gap-2 grid-flow-col items-center auto-cols-max display-span"><h3 class="ellipse text-center capitalize text-left" data-i18n="vulnerable"></h3><span name="attr_vulnerable" title="@{vulnerable}"></span></div><div class="grid gap-2 grid-flow-col items-center"><div class="grid gap-2 grid-flow-col auto-cols-max display-span"><h3 class="ellipse text-center capitalize" data-i18n="DR"></h3><span name="attr_damage_reduction" title="@{damage_reduction}"></span></div><div class="grid gap-2 grid-flow-col auto-cols-max display-span"><h3 class="ellipse text-center capitalize" data-i18n="DT"></h3><span name="attr_damage_threshold" title="@{damage_threshold}"></span></div></div></div></div><div class="inputs grid gap-4"><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="range"></h3><label data-i18n-title="enter range" title="enter range"><input data-i18n-placeholder="range" name="attr_range" placeholder="range" title="@{range}" type="text" value=""/></label></div></div><div class="grid gap-2 items-center grid-flow-col"><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="ammunition"></h3><label data-i18n-title="enter ammunition" title="enter ammunition"><input data-i18n-placeholder="ammunition" name="attr_ammunition" placeholder="ammunition" title="@{ammunition}" type="text" value=""/></label></div></div><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="reload"></h3><label data-i18n-title="enter reload" title="enter reload"><input data-i18n-placeholder="reload" name="attr_reload" placeholder="reload" title="@{reload}" type="text" value=""/></label></div></div></div><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="area of effect"></h3><label data-i18n-title="enter area of effect" title="enter area of effect"><input data-i18n-placeholder="area of effect" name="attr_area_of_effect" placeholder="area of effect" title="@{area_of_effect}" type="text" value=""/></label></div></div><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="helf"></h3><label data-i18n-title="enter helf" title="enter helf"><input data-i18n-placeholder="helf" name="attr_helf" placeholder="helf" title="@{helf}" type="text" value=""/></label></div></div><div class="grid gap-2 items-center grid-flow-col"><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="speed"></h3><label data-i18n-title="enter speed" title="enter speed"><input data-i18n-placeholder="speed" name="attr_speed" placeholder="speed" title="@{speed}" type="text" value=""/></label></div></div><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="hp"></h3><label data-i18n-title="enter hp" title="enter hp"><input data-i18n-placeholder="hp" name="attr_hp" placeholder="hp" title="@{hp}" type="text" value=""/></label></div></div></div><div class="grid gap-2 items-center grid-flow-col"><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="armor rating"></h3><label data-i18n-title="enter armor rating" title="enter armor rating"><input data-i18n-placeholder="armor rating" name="attr_armor_rating" placeholder="armor rating" title="@{armor_rating}" type="text" value=""/></label></div></div><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="reflexes"></h3><label data-i18n-title="enter reflexes" title="enter reflexes"><input data-i18n-placeholder="reflexes" name="attr_reflexes" placeholder="reflexes" title="@{reflexes}" type="text" value=""/></label></div></div><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="fortitude"></h3><label data-i18n-title="enter fortitude" title="enter fortitude"><input data-i18n-placeholder="fortitude" name="attr_fortitude" placeholder="fortitude" title="@{fortitude}" type="text" value=""/></label></div></div></div><div class="grid gap-2 items-center grid-flow-col"><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="resist"></h3><label data-i18n-title="enter resist" title="enter resist"><input data-i18n-placeholder="resist" name="attr_resist" placeholder="resist" title="@{resist}" type="text" value=""/></label></div></div><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="immune"></h3><label data-i18n-title="enter immune" title="enter immune"><input data-i18n-placeholder="immune" name="attr_immune" placeholder="immune" title="@{immune}" type="text" value=""/></label></div></div></div><div class="grid gap-2 items-center grid-flow-col"><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="vulnerable"></h3><label data-i18n-title="enter vulnerable" title="enter vulnerable"><input data-i18n-placeholder="vulnerable" name="attr_vulnerable" placeholder="vulnerable" title="@{vulnerable}" type="text" value=""/></label></div></div></div><div class="grid gap-2 items-center grid-flow-col"><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="damage reduction"></h3><label data-i18n-title="enter damage reduction" title="enter damage reduction"><input data-i18n-placeholder="damage reduction" name="attr_damage_reduction" placeholder="damage reduction" title="@{damage_reduction}" type="text" value=""/></label></div></div><div class="grid grid-gap-2 grid-flow-col items-center"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="damage threshold"></h3><label data-i18n-title="enter damage threshold" title="enter damage threshold"><input data-i18n-placeholder="damage threshold" name="attr_damage_threshold" placeholder="damage threshold" title="@{damage_threshold}" type="text" value=""/></label></div></div></div></div><div class="grid gap-2 items-center actions section-actions"><div class="grid gap-2 header-toggle"><h2 class="ellipse uppercase text-primary" data-i18n="actions"></h2><label class="switch" data-i18n-title="toggle actions"><input type="checkbox" name="attr_section_actions" value="on"/><span class="slider"></span></label></div><div class="display-mode mb-2"><i><span name="attr_action_description"></span></i></div><div class="inputs"><textarea name="attr_action_description" title="@{action_description}"></textarea></div><fieldset class="repeating_actions"><input type="hidden" name="attr_roll_formula" value="{{description=@{effect} @{description}}}"/><button class="ellipsis font-weight-bold hidden" name="roll_effect" type="roll" value="&{template:rolls} {{header=@{name}}} {{type=@{damage_type}}} {{effect=@{effect}}} {{description=@{description}}}"><span data-i18n="effect"></span></button><div class="grid gap-2 relative repeating-grid"><input type="hidden" name="attr_name"/><div class="grid grid-flow-col gap-2 displayed custom-grid"><span class="or font-bold" name="attr_name"></span><span class="or" name="attr_description"></span><input type="hidden" name="attr_toggle_action_attack"/><p class="font-base"><button class="text-left ellipsis font-weight-bold" name="roll_name" type="roll" value="&{template:rolls} {{header=@{name}}} @{roll_formula}"><span name="attr_name"></span></button><span name="attr_description"> </span><span class="italic" name="attr_range" title="@{range}"></span><span class="italic" name="attr_type" title="@{type}"></span><span name="attr_modifier" title="@{modifier}"></span><span class="vs">vs</span><span name="attr_defense" title="@{defense}"></span><span class="hit font-bold capitalize" data-i18n="Hit:"></span><span class="text-center mr-1" name="attr_damage_average" title="@{damage_average}"></span><button class="ellipsis font-weight-bold" name="roll_damage" type="roll" value="&{template:rolls} {{header=@{name} Damage}} {{type=@{damage_type}}} {{dice=[[@{damage}[damage]+0]]}} {{effect=@{effect}}} {{description=@{description}}}"><span name="attr_damage"></span></button><span class="ml-1" name="attr_damage_type" title="@{damage_type}"></span><span name="attr_effect" title="@{effect}"></span></p></div><input class="toggle toggle-edit" name="attr_toggle_edit" title="edit toggle" type="checkbox" value="true" checked="checked"/><span class="pictos lowercase">p</span><div class="edit grid gap-2"><div class="grid gap-2 grid-flow-col col-fr-auto"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="name"></h3><label data-i18n-title="enter name" title="enter name"><input data-i18n-placeholder="name" name="attr_name" placeholder="name" title="@{name}" type="text" value=""/></label></div><div class="grid gap-2 grid-flow-col items-center attack-toggle auto-cols-min"><h3 class="ellipse text-center capitalize" data-i18n="attack"></h3><label class="switch" data-i18n-title="toggle attack"><input type="checkbox" name="attr_toggle_action_attack"/><span class="slider"></span></label></div></div><div class="grid gap-2 grid-flow-col range"><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="range"></h3><label data-i18n-title="enter range" title="enter range"><input data-i18n-placeholder="range" name="attr_range" placeholder="range" title="@{range}" type="text" value=""/></label></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="type"></h3><label data-i18n-title="enter type" title="enter type"><input data-i18n-placeholder="type" name="attr_type" placeholder="type" title="@{type}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col items-center modifier"><div class="grid col-auto-fr gap-1 grid-flow-col items-center text-center"><h3 class="ellipse text-center capitalize" data-i18n="modifier"></h3><label data-i18n-title="enter modifier" title="enter modifier"><input data-i18n-placeholder="modifier" name="attr_modifier" placeholder="modifier" title="@{modifier}" type="text" value=""/></label></div><span>vs</span><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="defense"></h3><label data-i18n-title="enter defense" title="enter defense"><input data-i18n-placeholder="defense" name="attr_defense" placeholder="defense" title="@{defense}" type="text" value=""/></label></div></div><div class="grid gap-2 grid-flow-col damage"><h3 class="ellipse text-center capitalize" data-i18n="Hit"></h3><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="damage"></h3><div class="grid grid-flow-col items-center dmg"><label data-i18n-title="enter damage average" title="enter damage average"><input class="text-center" data-i18n-placeholder="damage average" name="attr_damage_average" placeholder="damage average" title="@{damage_average}" type="text" value=""/></label><div class="grid grid-flow-col items-center"><span>(</span><label data-i18n-title="enter damage" title="enter damage"><input data-i18n-placeholder="damage" name="attr_damage" placeholder="damage" title="@{damage}" type="text" value=""/></label><span>)</span></div></div></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="type"></h3><label data-i18n-title="enter damage type" title="enter damage type"><input data-i18n-placeholder="damage type" name="attr_damage_type" placeholder="damage type" title="@{damage_type}" type="text" value=""/></label></div></div><div class="grid col-auto-fr gap-1 grid-flow-col items-center"><h3 class="ellipse text-center capitalize" data-i18n="effect"></h3><label data-i18n-title="enter effect" title="enter effect"><input data-i18n-placeholder="effect" name="attr_effect" placeholder="effect" title="@{effect}" type="text" value=""/></label></div><div class="description"><textarea name="attr_description" placeholder="description"></textarea></div></div></div></fieldset></div></div><div class="grid gap-4 settings"> <div class="grid gap-2"><h2 class="ellipse capitalize" data-i18n="character type"></h2><div class="grid gap-2 grid-flow-col"><select name="attr_sheet_type"><option value="pc" data-i18n="pc"><val></val></option><option value="creature" data-i18n="creature"><val></val></option><option value="siege" data-i18n="siege"><val></val></option></select></div></div></div></div></div><div class="compendium_warning"><span class="uppercase" data-i18n="accepting drop">ACCEPTING DROP FROM COMPENDIUM</span></div><div class="footer mt-5 grid gap-2"><span class="mr-1">Version</span><span name="attr_version"></span><br/><span>This work is based on The MythCraft System by QuasiReal Publishing LLC and published using the Creative Commons Attribution 3.0 <a href="http://creativecommons.org/licenses/by/3.0/">Unported license (http://creativecommons.org/licenses/by/3.0/).</a></span><br/><span> Original template created by <a href="https://emeraldproductions.vercel.app/">Emerald Productions, LLC</a></span><img src="https://raw.githubusercontent.com/clevett/roll20-SheetTemplate/master/src/imgs/EProd_Emerald_Gloss.png" alt="Emerald Productions logo of an E"/></div><rolltemplate class="sheet-rolltemplate-rolls"><div class="sheet-template-container"><!-- - Display a header on the template ---><div class="sheet-template-header"> <h1>{{#header}}{{header}}{{/header}}</h1></div><!-- - Display the dice roll in the template ---><div class="sheet-template-body">{{#dice}}<div class="sheet-template-roll"><span>{{dice}}</span></div>{{/dice}}
|
|
{{#tags}}<div class="sheet-template-tags"><span>{{tags}}</span></div>{{/tags}}
|
|
{{#action}}<div class="sheet-template-action"><span>{{action}}</span></div>{{/action}}
|
|
{{#type}}<div class="sheet-template-type"><span>{{type}}</span></div>{{/type}}
|
|
{{#damage}}<div class="sheet-template-damage">{{damage}}</div>{{/damage}}
|
|
{{#effect}}<div class="sheet-template-damage">{{effect}}</div>{{/effect}}
|
|
{{#description}}<div class="sheet-template-desc"><span>{{description}}</span></div>{{/description}}</div></div></rolltemplate><script type="text/worker">var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
if (ar || !(i in from)) {
|
|
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
ar[i] = from[i];
|
|
}
|
|
}
|
|
return to.concat(ar || Array.prototype.slice.call(from));
|
|
};
|
|
var __assign = (this && this.__assign) || function () {
|
|
__assign = Object.assign || function(t) {
|
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
s = arguments[i];
|
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
t[p] = s[p];
|
|
}
|
|
return t;
|
|
};
|
|
return __assign.apply(this, arguments);
|
|
};
|
|
var __rest = (this && this.__rest) || function (s, e) {
|
|
var t = {};
|
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
t[p] = s[p];
|
|
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
t[p[i]] = s[p[i]];
|
|
}
|
|
return t;
|
|
};
|
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
function step(op) {
|
|
if (f) throw new TypeError("Generator is already executing.");
|
|
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
switch (op[0]) {
|
|
case 0: case 1: t = op; break;
|
|
case 4: _.label++; return { value: op[1], done: false };
|
|
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
default:
|
|
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
if (t[2]) _.ops.pop();
|
|
_.trys.pop(); continue;
|
|
}
|
|
op = body.call(thisArg, _);
|
|
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
}
|
|
};
|
|
var attackFieldsetAttributes = [
|
|
"name",
|
|
"damage",
|
|
"damage_type",
|
|
"range",
|
|
"tags",
|
|
"apc",
|
|
"description",
|
|
];
|
|
var addSpellAttack = function (row, page) {
|
|
var attackRow = getRow("attacks");
|
|
var update = getUpdate(attackFieldsetAttributes, page, attackRow);
|
|
update["".concat(attackRow, "_link")] = row;
|
|
getAttrs(["spellcasting_ability", "primary_source"], function (_a) {
|
|
var spellcasting_ability = _a.spellcasting_ability, primary_source = _a.primary_source;
|
|
update["".concat(attackRow, "_attribute")] = spellcasting_ability;
|
|
update["".concat(attackRow, "_attribute_abbreviation")] =
|
|
getAttributeAbbreviation(spellcasting_ability);
|
|
var isPrimarySource = primary_source === page.data.source.toString().toLowerCase();
|
|
var rollFormula = getRollFormula(isPrimarySource);
|
|
update["".concat(attackRow, "_roll_formula")] = rollFormula;
|
|
update["".concat(row, "_roll_formula")] = rollFormula;
|
|
update["".concat(row, "_link")] = attackRow;
|
|
var attribute = spellcasting_ability.slice(2, -1);
|
|
getAttrs([attribute], function (attrs) {
|
|
var int = parseInteger(attrs[attribute]);
|
|
var bonus = isPrimarySource ? int : Math.ceil(int / 2);
|
|
update["".concat(attackRow, "_bonus")] = bonus > 0 ? "+".concat(bonus) : "".concat(bonus);
|
|
setDropAttrs(update);
|
|
});
|
|
});
|
|
return attackRow;
|
|
};
|
|
var mentalAttributes = ["awareness", "intellect", "charisma"];
|
|
var metaphysicAttributes = ["luck", "coordination"];
|
|
var physicalAttributes = [
|
|
"strength",
|
|
"dexterity",
|
|
"endurance",
|
|
];
|
|
var attributes = __spreadArray(__spreadArray(__spreadArray([], mentalAttributes, true), metaphysicAttributes, true), physicalAttributes, true);
|
|
var action_points = [
|
|
"coordination",
|
|
"action_points_base",
|
|
"action_points_modifier",
|
|
];
|
|
var hit_points = ["endurance", "hit_points_base", "level"];
|
|
var critical_attributes = [
|
|
"critical_hit",
|
|
"luck",
|
|
"critical_hit_base",
|
|
"critical_hit_modifier",
|
|
];
|
|
var critical_fail_attributes = [
|
|
"critical_fail",
|
|
"critical_fail_base",
|
|
"critical_fail_modifier",
|
|
];
|
|
var armor_rating = ["armor_rating_base", "armor_rating_modifier"];
|
|
var anticipation = [
|
|
"anticipation_base",
|
|
"anticipation_modifier",
|
|
"awareness",
|
|
];
|
|
var fortitude = ["fortitude_base", "fortitude_modifier", "endurance"];
|
|
var logic = ["logic_base", "logic_modifier", "intellect"];
|
|
var reflexes = ["reflexes_base", "reflexes_modifier", "dexterity"];
|
|
var willpower = ["willpower_base", "willpower_modifier", "charisma"];
|
|
var defenses = [
|
|
"anticipation",
|
|
"fortitude",
|
|
"logic",
|
|
"reflexes",
|
|
"willpower",
|
|
];
|
|
var initiative = ["initiative_base", "initiative_bonus", "awareness"];
|
|
var modifiers = __spreadArray(__spreadArray([], defenses, true), ["action_points", "initiative", "armor_rating"], false);
|
|
[anticipation, fortitude, logic, reflexes, willpower].forEach(function (attrs) {
|
|
attrs.forEach(function (attr) {
|
|
on("change:".concat(attr), function () {
|
|
updateDerivedAttribute(attrs);
|
|
});
|
|
});
|
|
});
|
|
initiative.forEach(function (attr) {
|
|
on("change:".concat(attr), function () {
|
|
updateModifiedAttribute(initiative);
|
|
});
|
|
});
|
|
["modifier", "toggle_active", "attribute"].forEach(function (attribute) {
|
|
on("change:repeating_modifiers:".concat(attribute), function (event) {
|
|
updateAttributeModifier(event);
|
|
});
|
|
});
|
|
on("remove:repeating_modifiers", function (event) {
|
|
var sourceAttribute = event.sourceAttribute, removedInfo = event.removedInfo;
|
|
if (removedInfo["".concat(sourceAttribute, "_modifier")] !== "" &&
|
|
removedInfo["".concat(sourceAttribute, "_modifier")] !== "0" &&
|
|
removedInfo["".concat(sourceAttribute, "_modifier")] !== undefined &&
|
|
removedInfo["".concat(sourceAttribute, "_toggle_active")] === "on") {
|
|
updateAttributeModifier(event);
|
|
}
|
|
});
|
|
["attacks", "spells", "reactive-actions"].forEach(function (fieldset) {
|
|
on("change:repeating_".concat(fieldset), function (event) {
|
|
updateLinkedAttribute(event);
|
|
});
|
|
});
|
|
["attacks", "skills"].forEach(function (fieldset) {
|
|
on("change:repeating_".concat(fieldset, ":attribute"), function (event) {
|
|
var _a;
|
|
var sourceAttribute = event.sourceAttribute, newValue = event.newValue;
|
|
if (!newValue)
|
|
return;
|
|
var repeatingRow = getFieldsetRow(sourceAttribute);
|
|
var abbreviation = getAttributeAbbreviation(newValue);
|
|
setAttrs((_a = {}, _a["".concat(repeatingRow, "_attribute_abbreviation")] = abbreviation, _a));
|
|
});
|
|
["attribute", "modifier"].forEach(function (attr) {
|
|
on("change:repeating_".concat(fieldset, ":").concat(attr), function (event) {
|
|
var sourceAttribute = event.sourceAttribute;
|
|
var repeatingRow = getFieldsetRow(sourceAttribute);
|
|
getAttrs(["".concat(repeatingRow, "_attribute"), "".concat(repeatingRow, "_modifier")], function (values) {
|
|
var attribute = sliceAttribute(values["".concat(repeatingRow, "_attribute")]);
|
|
getAttrs([attribute], function (v) {
|
|
var _a;
|
|
var attrs = {
|
|
attribute: v[attribute],
|
|
modifier: values["".concat(repeatingRow, "_modifier")],
|
|
};
|
|
var integers = parseIntegers(attrs);
|
|
var sum = sumIntegers(Object.values(integers));
|
|
setAttrs((_a = {},
|
|
_a["".concat(repeatingRow, "_bonus")] = sum > 0 ? "+".concat(sum) : "".concat(sum),
|
|
_a));
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
["attacks", "inventory"].forEach(function (fieldset) {
|
|
on("change:repeating_".concat(fieldset, ":name"), function (event) {
|
|
updateLinkedAttribute(event);
|
|
});
|
|
});
|
|
["abilities", "favorites", "talents"].forEach(function (fieldset) {
|
|
["name", "tags", "description", "ap"].forEach(function (attr) {
|
|
on("change:repeating_".concat(fieldset, ":").concat(attr), function (event) {
|
|
updateLinkedAttribute(event);
|
|
});
|
|
});
|
|
on("change:repeating_".concat(fieldset, ":toggle_favorite"), function (event) {
|
|
var sourceAttribute = event.sourceAttribute, newValue = event.newValue;
|
|
var abilitiesRow = getFieldsetRow(sourceAttribute);
|
|
var isFavorite = newValue === "true";
|
|
if (isFavorite) {
|
|
getAttrs([
|
|
"".concat(abilitiesRow, "_description"),
|
|
"".concat(abilitiesRow, "_link"),
|
|
"".concat(abilitiesRow, "_name"),
|
|
"".concat(abilitiesRow, "_tags"),
|
|
], function (values) {
|
|
var _a;
|
|
var favoriteRow = getRow("favorites");
|
|
var update = (_a = {},
|
|
_a["".concat(favoriteRow, "_description")] = values["".concat(abilitiesRow, "_description")],
|
|
_a["".concat(favoriteRow, "_link")] = abilitiesRow,
|
|
_a["".concat(favoriteRow, "_name")] = values["".concat(abilitiesRow, "_name")],
|
|
_a["".concat(favoriteRow, "_tags")] = values["".concat(abilitiesRow, "_tags")],
|
|
_a["".concat(favoriteRow, "_toggle_edit")] = false,
|
|
_a["".concat(abilitiesRow, "_link")] = favoriteRow,
|
|
_a);
|
|
setAttrs(update, { silent: true });
|
|
});
|
|
}
|
|
else {
|
|
getAttrs(["".concat(abilitiesRow, "_link")], function (values) {
|
|
var favoriteRow = values["".concat(abilitiesRow, "_link")];
|
|
removeRepeatingRow(favoriteRow);
|
|
});
|
|
}
|
|
});
|
|
});
|
|
action_points.forEach(function (attr) {
|
|
on("change:".concat(attr), function () {
|
|
updateActionPointsPerRound(action_points);
|
|
});
|
|
});
|
|
critical_attributes.forEach(function (attr) {
|
|
on("change:".concat(attr), function () {
|
|
updateCriticalRange(critical_attributes);
|
|
});
|
|
});
|
|
critical_fail_attributes.forEach(function (attr) {
|
|
on("change:".concat(attr), function () {
|
|
updateCriticalFailRange(critical_fail_attributes);
|
|
});
|
|
});
|
|
on("change:luck", function () {
|
|
updateLuck(["luck"]);
|
|
});
|
|
hit_points.forEach(function (attr) {
|
|
on("change:".concat(attr), function () {
|
|
updateHitPoints(hit_points);
|
|
});
|
|
});
|
|
on("change:primary_source", function (event) {
|
|
var newValue = event.newValue, previousValue = event.previousValue;
|
|
var section = "repeating_spells";
|
|
getSectionIDs(section, function (ids) {
|
|
var sourceMap = ids.map(function (id) { return "".concat(section, "_").concat(id, "_source"); });
|
|
var linksMap = ids.map(function (id) { return "".concat(section, "_").concat(id, "_link"); });
|
|
var formulasMap = ids.map(function (id) { return "".concat(section, "_").concat(id, "_roll_formula"); });
|
|
getAttrs(__spreadArray(__spreadArray(__spreadArray([], sourceMap, true), linksMap, true), formulasMap, true), function (v) {
|
|
var update = {};
|
|
formulasMap.forEach(function (e) {
|
|
if (v[e] === "{{description=@{description}}}") {
|
|
return;
|
|
}
|
|
var rowId = getFieldsetRow(e);
|
|
var link = v["".concat(rowId, "_link")];
|
|
var source = v["".concat(rowId, "_source")];
|
|
var isPrimarySource = source === newValue;
|
|
var wasPrimarySource = source === previousValue;
|
|
if (wasPrimarySource || isPrimarySource) {
|
|
var formula = getRollFormula(isPrimarySource);
|
|
update["".concat(rowId, "_roll_formula")] = formula;
|
|
if (link) {
|
|
update["".concat(link, "_roll_formula")] = formula;
|
|
}
|
|
setAttrs(update, { silent: true });
|
|
}
|
|
});
|
|
});
|
|
});
|
|
});
|
|
on("change:repeating_spells:source", function (event) {
|
|
var sourceAttribute = event.sourceAttribute, newValue = event.newValue;
|
|
var repeatingRow = getFieldsetRow(sourceAttribute);
|
|
getAttrs(["primary_source"], function (values) {
|
|
var _a;
|
|
var isPrimarySource = values.primary_source === newValue;
|
|
setAttrs((_a = {},
|
|
_a["".concat(repeatingRow, "_roll_formula")] = getRollFormula(isPrimarySource),
|
|
_a));
|
|
});
|
|
});
|
|
on("change:repeating_spells:toggle_attack", function (event) {
|
|
updateSpellRollFormula(event);
|
|
});
|
|
[
|
|
"attacks",
|
|
"spells",
|
|
"abilities",
|
|
"favorites",
|
|
"talents",
|
|
"reactive-actions",
|
|
].forEach(function (fieldset) {
|
|
on("remove:repeating_".concat(fieldset), function (event) {
|
|
updateLinks(event);
|
|
});
|
|
});
|
|
on("change:repeating_actions:toggle_action_attack", function (event) {
|
|
updateCreatureAttackRollFormula(event);
|
|
});
|
|
["damage", "effect", "toggle_action_attack"].forEach(function (attr) {
|
|
on("change:repeating_actions:".concat(attr), function (event) {
|
|
var sourceAttribute = event.sourceAttribute;
|
|
var row = getFieldsetRow(sourceAttribute);
|
|
getAttrs(["".concat(row, "_damage"), "".concat(row, "_effect"), "".concat(row, "_toggle_action_attack")], function (values) {
|
|
var _a;
|
|
var isAttack = values["".concat(row, "_toggle_action_attack")] === "on";
|
|
setAttrs((_a = {},
|
|
_a["".concat(row, "_roll_formula")] = getCreatureAttackRollFormula(isAttack, {
|
|
includeDice: true,
|
|
includeDefense: !!values["".concat(row, "_defense")],
|
|
includeDamage: !!values["".concat(row, "_damage")],
|
|
includeEffect: !!values["".concat(row, "_effect")],
|
|
}),
|
|
_a));
|
|
});
|
|
});
|
|
});
|
|
["skills", "features", "actions", "reactions", "spells"].forEach(function (section) {
|
|
on("change:section_".concat(section), function (event) {
|
|
var newValue = event.newValue;
|
|
getAttrs(["npc_sections"], function (values) {
|
|
var sections = values.npc_sections
|
|
? values.npc_sections.split(",")
|
|
: [];
|
|
if (newValue === "on" && !sections.includes(section)) {
|
|
sections.push(section);
|
|
}
|
|
else if (newValue !== "on" && sections.includes(section)) {
|
|
var index = sections.indexOf(section);
|
|
if (index > -1) {
|
|
sections.splice(index, 1);
|
|
}
|
|
}
|
|
setAttrs({ npc_sections: sections.join(",") });
|
|
});
|
|
});
|
|
});
|
|
["crit_range"].forEach(function (attr) {
|
|
on("change:repeating_attacks:".concat(attr), function (event) {
|
|
updateAttacksCriticalHit(event);
|
|
});
|
|
});
|
|
on("change:critical_hit", function (event) {
|
|
updateAllAttacksCriticalHits(event);
|
|
});
|
|
var getAttacksCriticalHit = function (critical_hit, crit_range) {
|
|
var globalCriticalHit = critical_hit.includes(">")
|
|
? parseInt(critical_hit.split(">")[1])
|
|
: parseInt(critical_hit);
|
|
var attackCriticalHit = parseInt(crit_range);
|
|
if (globalCriticalHit === 0 || globalCriticalHit === 16) {
|
|
return "@{critical_hit}";
|
|
}
|
|
var sum = Math.max(16, globalCriticalHit - attackCriticalHit);
|
|
return ">".concat(sum);
|
|
};
|
|
var getCreatureAttackRollFormula = function (isAttack, options) {
|
|
if (isAttack === void 0) { isAttack = false; }
|
|
if (options === void 0) { options = {
|
|
includeDamage: true,
|
|
includeDefense: true,
|
|
includeDice: true,
|
|
includeEffect: true,
|
|
}; }
|
|
var dice = "{{dice=[[1d20+(@{modifier})+(?{TA/TD|0}[tactical bonus])]]}}";
|
|
var defense = "{{action=@{range} @{type}. @{modifier} vs @{defense} }}";
|
|
var damage = "{{damage=[Damage](~repeating_actions-roll_damage)}}";
|
|
var effect = "{{effect=[Effect](~repeating_actions-roll_effect)}}";
|
|
var description = "{{description=@{description}}}";
|
|
if (isAttack) {
|
|
var formula = "";
|
|
if (options.includeDice) {
|
|
formula += "".concat(dice);
|
|
}
|
|
if (options.includeDefense) {
|
|
formula += " ".concat(defense);
|
|
}
|
|
if (options.includeDamage) {
|
|
formula += " ".concat(damage);
|
|
}
|
|
if (options.includeEffect) {
|
|
formula += " ".concat(effect);
|
|
}
|
|
return formula.trim();
|
|
}
|
|
return description;
|
|
};
|
|
var getRollFormula = function (isPrimarySource, isSpellCard) {
|
|
if (isSpellCard) {
|
|
return "{{description=@{description}}}";
|
|
}
|
|
var abilityModifier = "@{spellcasting_ability}";
|
|
if (!isPrimarySource) {
|
|
abilityModifier = "ceil(".concat(abilityModifier, "/2)");
|
|
}
|
|
return "{{dice=[[1d20+".concat(abilityModifier, "[ability]+(@{modifier}[modifier])+(?{TA/TD|0})[tactical bonus]+(@{luck_negative_modifier}[negative luck modifier])cs>@{attack_critical_hit}cf@{critical_fail}]]}} {{damage=[Damage](~repeating_spells-roll_damage)}} {{description=@{description}}}");
|
|
};
|
|
var updateActionPointsPerRound = function (attributes) {
|
|
getAttrs(attributes, function (values) {
|
|
var _a = parseIntegers(values), coordination = _a.coordination, action_points_base = _a.action_points_base, action_points_modifier = _a.action_points_modifier;
|
|
var action_points_per_round = action_points_base;
|
|
switch (coordination) {
|
|
case -1:
|
|
case -2:
|
|
action_points_per_round = action_points_base - 1 || 0;
|
|
break;
|
|
case -3:
|
|
action_points_per_round = action_points_base - 2 || 0;
|
|
break;
|
|
default:
|
|
action_points_per_round =
|
|
Math.floor(coordination / 2) + action_points_base;
|
|
break;
|
|
}
|
|
action_points_per_round += action_points_modifier || 0;
|
|
setAttrs({ action_points_per_round: action_points_per_round });
|
|
});
|
|
};
|
|
var updateAllAttacksCriticalHits = function (event) {
|
|
var newValue = event.newValue;
|
|
getSectionIDs("repeating_attacks", function (ids) {
|
|
var attrs = [];
|
|
ids.forEach(function (id) {
|
|
attrs.push("repeating_attacks_".concat(id, "_attack_critical_hit"));
|
|
attrs.push("repeating_attacks_".concat(id, "_crit_range"));
|
|
});
|
|
getAttrs(attrs, function (values) {
|
|
var update = {};
|
|
ids.forEach(function (id) {
|
|
var attackCriticalHit = values["repeating_attacks_".concat(id, "_attack_critical_hit")];
|
|
var critRange = values["repeating_attacks_".concat(id, "_crit_range")];
|
|
if (critRange === "0" && attackCriticalHit === "@{critical_hit}") {
|
|
return;
|
|
}
|
|
var ch = getAttacksCriticalHit(newValue, critRange);
|
|
if (ch !== attackCriticalHit) {
|
|
update["repeating_attacks_".concat(id, "_attack_critical_hit")] = ch;
|
|
}
|
|
});
|
|
if (Object.keys(update).length > 0) {
|
|
setAttrs(update, { silent: true });
|
|
}
|
|
});
|
|
});
|
|
};
|
|
var updateAttacksCriticalHit = function (event) {
|
|
getAttrs(["critical_hit"], function (values) {
|
|
var _a;
|
|
var sourceAttribute = event.sourceAttribute, newValue = event.newValue;
|
|
var row = getFieldsetRow(sourceAttribute);
|
|
var critical_hit = values.critical_hit;
|
|
var ch = getAttacksCriticalHit(critical_hit, newValue);
|
|
setAttrs((_a = {},
|
|
_a["".concat(row, "_attack_critical_hit")] = ch,
|
|
_a));
|
|
});
|
|
};
|
|
var updateAttributeModifier = function (_a) {
|
|
var sourceAttribute = _a.sourceAttribute, previousValue = _a.previousValue, removedInfo = _a.removedInfo;
|
|
var rowId = getFieldsetRow(sourceAttribute);
|
|
getSectionIDs("repeating_modifiers", function (ids) {
|
|
var attrs = [];
|
|
ids.forEach(function (id) {
|
|
attrs.push("repeating_modifiers_".concat(id, "_attribute"));
|
|
attrs.push("repeating_modifiers_".concat(id, "_modifier"));
|
|
attrs.push("repeating_modifiers_".concat(id, "_toggle_active"));
|
|
});
|
|
getAttrs(attrs, function (v) {
|
|
var update = {};
|
|
var activeIds = ids.filter(function (id) {
|
|
return (v["repeating_modifiers_".concat(id, "_toggle_active")] === "on" &&
|
|
v["repeating_modifiers_".concat(id, "_modifier")] !== "0" &&
|
|
v["repeating_modifiers_".concat(id, "_modifier")] !== "" &&
|
|
v["repeating_modifiers_".concat(id, "_modifier")] !== undefined);
|
|
});
|
|
var getAttributeSum = function (attribute) {
|
|
var attributeModifiers = activeIds.filter(function (id) {
|
|
return v["repeating_modifiers_".concat(id, "_attribute")] === attribute;
|
|
});
|
|
var integers = attributeModifiers.map(function (id) {
|
|
return parseInt(v["repeating_modifiers_".concat(id, "_modifier")] || "0", 10);
|
|
});
|
|
return sumIntegers(integers);
|
|
};
|
|
var attribute = removedInfo && removedInfo["".concat(sourceAttribute, "_attribute")]
|
|
? removedInfo["".concat(sourceAttribute, "_attribute")]
|
|
: v["".concat(rowId, "_attribute")];
|
|
if (attribute === "initiative") {
|
|
update["initiative_bonus"] = getAttributeSum("initiative");
|
|
}
|
|
else {
|
|
update["".concat(attribute, "_modifier")] = getAttributeSum(attribute.toString());
|
|
}
|
|
if (previousValue && modifiers.includes(previousValue)) {
|
|
update["".concat(previousValue, "_modifier")] = getAttributeSum(previousValue);
|
|
}
|
|
setAttrs(update);
|
|
});
|
|
});
|
|
};
|
|
var updateCreatureAttackRollFormula = function (event) {
|
|
var _a;
|
|
var sourceAttribute = event.sourceAttribute, newValue = event.newValue, sourceType = event.sourceType;
|
|
if (sourceType !== "player") {
|
|
return;
|
|
}
|
|
var row = getFieldsetRow(sourceAttribute);
|
|
var isAttack = newValue === "on";
|
|
if (!isAttack) {
|
|
setAttrs((_a = {},
|
|
_a["".concat(row, "_roll_formula")] = getCreatureAttackRollFormula(false),
|
|
_a));
|
|
return;
|
|
}
|
|
getAttrs(["".concat(row, "_damage")], function (values) {
|
|
var _a;
|
|
var hasDamage = values["".concat(row, "_damage")];
|
|
var attackRollFormula = getCreatureAttackRollFormula(true, {
|
|
includeDice: true,
|
|
includeDefense: true,
|
|
includeDamage: !!hasDamage,
|
|
});
|
|
setAttrs((_a = {},
|
|
_a["".concat(row, "_roll_formula")] = attackRollFormula,
|
|
_a));
|
|
});
|
|
};
|
|
var updateCriticalFailRange = function (attributes) {
|
|
getAttrs(attributes, function (values) {
|
|
var _a = parseIntegers(values), critical_fail_base = _a.critical_fail_base, critical_fail = _a.critical_fail, critical_fail_modifier = _a.critical_fail_modifier;
|
|
var range = critical_fail_base + critical_fail_modifier;
|
|
var cr = range < 1 ? 1 : range;
|
|
if (cr !== critical_fail) {
|
|
setAttrs({
|
|
critical_fail: "<".concat(cr),
|
|
});
|
|
}
|
|
});
|
|
};
|
|
var updateCriticalRange = function (attributes) {
|
|
getAttrs(attributes, function (values) {
|
|
var _a = parseIntegers(values), luck = _a.luck, critical_hit_base = _a.critical_hit_base, critical_hit = _a.critical_hit, critical_hit_modifier = _a.critical_hit_modifier;
|
|
if (luck < 0) {
|
|
setAttrs({
|
|
critical_hit: "0",
|
|
});
|
|
return;
|
|
}
|
|
var hit = critical_hit_base;
|
|
if (luck >= 12) {
|
|
hit = critical_hit_base - 2;
|
|
}
|
|
else if (luck >= 6 && luck <= 11) {
|
|
hit = critical_hit_base - 1;
|
|
}
|
|
hit = hit + critical_hit_modifier;
|
|
var cr = Math.max(16, Math.min(20, hit));
|
|
if (cr !== critical_hit) {
|
|
setAttrs({
|
|
critical_hit: ">".concat(cr),
|
|
});
|
|
}
|
|
});
|
|
};
|
|
var updateDerivedAttribute = function (attributes) {
|
|
getAttrs(attributes, function (values) {
|
|
var _a;
|
|
var sum = sumIntegers(Object.values(parseIntegers(values)));
|
|
var name = attributes
|
|
.find(function (e) { return e.includes("base"); })
|
|
.replace("_base", "");
|
|
setAttrs((_a = {}, _a[name] = sum, _a));
|
|
});
|
|
};
|
|
var updateDefaultToken = function (values, size) {
|
|
var update = __assign(__assign({}, values), { width: 70, height: 70 });
|
|
if (size) {
|
|
var sizeMap = {
|
|
fine: 20,
|
|
diminutive: 28,
|
|
tiny: 35,
|
|
small: 50,
|
|
medium: 70,
|
|
large: 140,
|
|
huge: 210,
|
|
gargantuan: 280,
|
|
colossal: 350,
|
|
titan: 420,
|
|
};
|
|
var sizeKey = Object.keys(sizeMap).find(function (key) {
|
|
return size.toLowerCase().includes(key);
|
|
});
|
|
var sizeValue = sizeKey ? sizeMap[sizeKey] : undefined;
|
|
if (sizeValue) {
|
|
update.width = sizeValue;
|
|
update.height = sizeValue;
|
|
}
|
|
}
|
|
Object.entries(update).forEach(function (_a) {
|
|
var key = _a[0], value = _a[1];
|
|
if (typeof value === "boolean") {
|
|
console.warn("Token default ".concat(key, " is a boolean. Setting to 0."), "color: orange; font-weight:bold");
|
|
}
|
|
});
|
|
setDefaultToken(update);
|
|
};
|
|
var updateHitPoints = function (attributes) {
|
|
getAttrs(attributes, function (values) {
|
|
var _a = parseIntegers(values), endurance = _a.endurance, hit_points_base = _a.hit_points_base, level = _a.level;
|
|
var die_pips = 0;
|
|
var set_hit_points = 0;
|
|
if (endurance >= -2 && endurance <= 12) {
|
|
if (endurance === -3) {
|
|
die_pips = 0;
|
|
set_hit_points = 0;
|
|
}
|
|
else if (endurance >= -2 && endurance <= -1) {
|
|
die_pips = 2;
|
|
set_hit_points = 1;
|
|
}
|
|
else if (endurance >= 0 && endurance <= 2) {
|
|
die_pips = 4;
|
|
set_hit_points = 2;
|
|
}
|
|
else if (endurance >= 3 && endurance <= 5) {
|
|
die_pips = 6;
|
|
set_hit_points = 3;
|
|
}
|
|
else if (endurance >= 6 && endurance <= 8) {
|
|
die_pips = 8;
|
|
set_hit_points = 4;
|
|
}
|
|
else if (endurance >= 9 && endurance <= 11) {
|
|
die_pips = 10;
|
|
set_hit_points = 5;
|
|
}
|
|
else if (endurance >= 12) {
|
|
die_pips = 12;
|
|
set_hit_points = 6;
|
|
}
|
|
}
|
|
var hit_point_die = die_pips ? "".concat(level, "d").concat(die_pips) : 0;
|
|
var hit_die_formula = "".concat(hit_points_base, "+").concat(hit_point_die, "+").concat(level);
|
|
setAttrs({ hit_point_die: hit_point_die, hit_die_formula: hit_die_formula, set_hit_points: set_hit_points });
|
|
});
|
|
};
|
|
var updateLinkedAttribute = function (event) {
|
|
var sourceAttribute = event.sourceAttribute, newValue = event.newValue;
|
|
if (sourceAttribute.includes("link")) {
|
|
return;
|
|
}
|
|
var attr = getFieldsetAttr(sourceAttribute);
|
|
var fieldset = getFieldsetGroupName(sourceAttribute);
|
|
getAttrs(["repeating_".concat(fieldset, "_link")], function (values) {
|
|
var _a;
|
|
var linkedRow = values["repeating_".concat(fieldset, "_link")];
|
|
if (linkedRow) {
|
|
var update = (_a = {},
|
|
_a["".concat(linkedRow, "_").concat(attr)] = newValue,
|
|
_a);
|
|
setAttrs(update, { silent: true });
|
|
}
|
|
});
|
|
};
|
|
var updateLinks = function (event) {
|
|
var sourceAttribute = event.sourceAttribute, removedInfo = event.removedInfo;
|
|
var update = {};
|
|
if (removedInfo) {
|
|
var effectedLink_1 = removedInfo["".concat(sourceAttribute, "_link")] + "_link";
|
|
getAttrs(["".concat(effectedLink_1)], function (values) {
|
|
var link = values["".concat(effectedLink_1)];
|
|
console.table({
|
|
trigger: sourceAttribute,
|
|
effectedLink: effectedLink_1,
|
|
updateThisLink: link,
|
|
});
|
|
if (link) {
|
|
update["".concat(effectedLink_1)] = "";
|
|
setAttrs(update, { silent: true });
|
|
}
|
|
});
|
|
}
|
|
};
|
|
var updateLuck = function (attributes) {
|
|
getAttrs(attributes, function (values) {
|
|
var luck = parseInt(values.luck);
|
|
var attrs = {};
|
|
attrs.rerolls_max = Math.ceil(luck / 2) || 0;
|
|
if (luck < 0) {
|
|
attrs.luck_negative_modifier = luck;
|
|
}
|
|
else {
|
|
attrs.luck_negative_modifier = 0;
|
|
}
|
|
setAttrs(attrs);
|
|
});
|
|
};
|
|
var updateModifiedAttribute = function (attributes) {
|
|
getAttrs(attributes, function (values) {
|
|
var _a;
|
|
var sum = sumIntegers(Object.values(parseIntegers(values)));
|
|
var name = attributes
|
|
.find(function (e) { return e.includes("base"); })
|
|
.replace("_base", "");
|
|
setAttrs((_a = {}, _a[name] = sum > 0 ? "+".concat(sum) : sum < 0 ? "-".concat(sum) : "0", _a));
|
|
});
|
|
};
|
|
var updateSpellRollFormula = function (event) {
|
|
var _a;
|
|
var sourceAttribute = event.sourceAttribute, newValue = event.newValue, sourceType = event.sourceType;
|
|
var row = getFieldsetRow(sourceAttribute);
|
|
var isSpellCard = newValue === "0";
|
|
if (sourceType !== "player") {
|
|
return;
|
|
}
|
|
if (isSpellCard) {
|
|
var formula = getRollFormula(undefined, isSpellCard);
|
|
setAttrs((_a = {},
|
|
_a["".concat(row, "_roll_formula")] = formula,
|
|
_a));
|
|
return;
|
|
}
|
|
if (!isSpellCard) {
|
|
getAttrs(["primary_source", "".concat(row, "_source")], function (_a) {
|
|
var _b;
|
|
var primary_source = _a.primary_source, values = __rest(_a, ["primary_source"]);
|
|
var isPrimarySource = primary_source === values["".concat(row, "_source")];
|
|
setAttrs((_b = {},
|
|
_b["".concat(row, "_roll_formula")] = getRollFormula(isPrimarySource, isSpellCard),
|
|
_b));
|
|
});
|
|
var attributes_1 = __spreadArray(__spreadArray([], attackFieldsetAttributes, true), ["source", "link"], false).map(function (attr) { return "".concat(row, "_").concat(attr); });
|
|
getAttrs(attributes_1, function (values) {
|
|
var data = {};
|
|
__spreadArray(__spreadArray([], attackFieldsetAttributes, true), ["source"], false).forEach(function (attr) {
|
|
data[attr] = values["".concat(row, "_").concat(attr)];
|
|
});
|
|
var link = values["".concat(row, "_link")];
|
|
if (!link) {
|
|
var data_1 = {};
|
|
__spreadArray(__spreadArray([], attackFieldsetAttributes, true), ["source"], false).forEach(function (attr) {
|
|
data_1[attr] = values["".concat(row, "_").concat(attr)];
|
|
});
|
|
addSpellAttack(row, {
|
|
name: values["".concat(row, "_name")],
|
|
data: data_1,
|
|
});
|
|
}
|
|
});
|
|
}
|
|
};
|
|
var _this = this;
|
|
on("sheet:opened", function () {
|
|
getAttrs(["version"], function (v) {
|
|
versioning(parseFloat(v.version) || 1);
|
|
});
|
|
});
|
|
var versioning = function (version) { return __awaiter(_this, void 0, void 0, function () {
|
|
var updateMessage;
|
|
return __generator(this, function (_a) {
|
|
updateMessage = function (v) {
|
|
return console.log("%c Sheet is updating to ".concat(v), "color: orange; font-weight:bold");
|
|
};
|
|
switch (true) {
|
|
case version < 1:
|
|
versioning(1);
|
|
updateMessage(1);
|
|
break;
|
|
case version < 1.1:
|
|
updateMessage(1.1);
|
|
versionOneOne();
|
|
versioning(1.1);
|
|
break;
|
|
case version < 1.2:
|
|
updateMessage(1.2);
|
|
versionOneTwo();
|
|
versioning(1.2);
|
|
break;
|
|
case version < 1.21:
|
|
updateMessage(1.21);
|
|
versionOneTwoOne();
|
|
versioning(1.21);
|
|
break;
|
|
case version < 1.3:
|
|
updateMessage(1.3);
|
|
versionOneThree();
|
|
versioning(1.3);
|
|
break;
|
|
case version < 1.7:
|
|
updateMessage(1.7);
|
|
versionOneSeven();
|
|
versioning(1.7);
|
|
break;
|
|
case version < 1.71:
|
|
updateMessage(1.71);
|
|
versionOneSevenOne();
|
|
versioning(1.71);
|
|
break;
|
|
default:
|
|
console.log("%c Sheet is update to date.", "color: green; font-weight:bold");
|
|
setAttrs({ version: version });
|
|
}
|
|
return [2];
|
|
});
|
|
}); };
|
|
var dropWarning = function (v) {
|
|
console.warn("%c Compendium Drop Error: ".concat(v), "color: orange; font-weight:bold");
|
|
};
|
|
var dropAttrs = ["drop_name", "drop_data", "drop_content"];
|
|
var handle_drop = function () {
|
|
getAttrs(dropAttrs, function (v) {
|
|
var _a;
|
|
if (!v.drop_name || !v.drop_data) {
|
|
return;
|
|
}
|
|
var page = {
|
|
name: v.drop_name,
|
|
data: (_a = parseJSON(v.drop_data)) !== null && _a !== void 0 ? _a : v.drop_data,
|
|
content: v.drop_content,
|
|
};
|
|
var Category = page.data.Category;
|
|
console.log("%c Drop for ".concat(page.name, ": ").concat(Category), "color: orange;");
|
|
switch (Category) {
|
|
case "Creatures":
|
|
handle_creature(page);
|
|
break;
|
|
case "Conditions":
|
|
handle_conditions(page);
|
|
break;
|
|
case "Backgrounds":
|
|
handle_bop(page);
|
|
break;
|
|
case "Professions":
|
|
handle_profession(page);
|
|
break;
|
|
case "Equipment":
|
|
handle_equipment(page);
|
|
break;
|
|
case "Features":
|
|
handle_feature(page);
|
|
break;
|
|
case "Lineages":
|
|
handle_lineage(page);
|
|
break;
|
|
case "Skills":
|
|
handle_skills(page);
|
|
break;
|
|
case "Spells":
|
|
handle_spell(page);
|
|
break;
|
|
case "Talents":
|
|
handle_talent(page);
|
|
break;
|
|
case "Vehicles":
|
|
handle_vehicles(page);
|
|
break;
|
|
default:
|
|
dropWarning("Unknown category: ".concat(Category));
|
|
}
|
|
setDropAttrs({
|
|
drop_name: "",
|
|
drop_data: "",
|
|
drop_content: "",
|
|
drop_category: "",
|
|
});
|
|
});
|
|
};
|
|
["data"].forEach(function (attr) {
|
|
on("change:drop_".concat(attr), function () {
|
|
handle_drop();
|
|
});
|
|
});
|
|
var getRow = function (section) { return "repeating_".concat(section, "_").concat(generateRowID()); };
|
|
var getUpdate = function (attrs, page, repeatingRow) {
|
|
var update = {};
|
|
attrs.forEach(function (attr) {
|
|
var _a, _b;
|
|
var sheetAttr = repeatingRow ? "".concat(repeatingRow, "_").concat(attr) : attr;
|
|
if ((_a = page[attr]) !== null && _a !== void 0 ? _a : page.data[attr]) {
|
|
update[sheetAttr] = (_b = page[attr]) !== null && _b !== void 0 ? _b : roll20Attribute(attr, page.data[attr]);
|
|
}
|
|
});
|
|
if (repeatingRow) {
|
|
update["".concat(repeatingRow, "_toggle_edit")] = false;
|
|
}
|
|
return update;
|
|
};
|
|
var parseJSON = function (jsonString) {
|
|
try {
|
|
if (typeof jsonString === "object") {
|
|
return jsonString;
|
|
}
|
|
return JSON.parse(jsonString);
|
|
}
|
|
catch (e) {
|
|
console.warn("Error parsing JSON: ".concat(jsonString));
|
|
return undefined;
|
|
}
|
|
};
|
|
var processDataArrays = function (array, callback) {
|
|
if (array === undefined) {
|
|
return;
|
|
}
|
|
var parsed = typeof array === "string" ? parseJSON(array) : array;
|
|
var map = parsed.map(function (e) { return callback(e); });
|
|
return map === null || map === void 0 ? void 0 : map.reduce(function (acc, val) { return (__assign(__assign({}, acc), val)); });
|
|
};
|
|
var roll20Attribute = function (attr, value) {
|
|
if (attr === "attribute" && typeof value === "string") {
|
|
return "@{".concat(createAttributeName(value), "}");
|
|
}
|
|
return value;
|
|
};
|
|
var setDropAttrs = function (update, silent) {
|
|
if (silent === void 0) { silent = { silent: true }; }
|
|
try {
|
|
setAttrs(update, silent);
|
|
}
|
|
catch (e) {
|
|
dropWarning("Error setting attributes: ".concat(e));
|
|
}
|
|
};
|
|
var handle_bop = function (page) {
|
|
var attrs = ["name", "occupation", "description"];
|
|
var row = getRow("additional-info");
|
|
var update = getUpdate(attrs, page, row);
|
|
update["".concat(row, "_category")] = page.data.Category;
|
|
if (page.data.Category === "Backgrounds") {
|
|
update["background"] = page.name;
|
|
update["occupation_tag"] = page.data.occupation;
|
|
}
|
|
if (page.data.Category === "Professions") {
|
|
update["profession"] = page.name;
|
|
}
|
|
setDropAttrs(update);
|
|
};
|
|
var handle_conditions = function (page) {
|
|
var attrs = ["name", "description"];
|
|
var row = getRow("conditions");
|
|
var update = getUpdate(attrs, page, row);
|
|
setDropAttrs(update);
|
|
};
|
|
var handle_creature = function (page) {
|
|
console.log("%c Creature Drop for ".concat(page.name), "color: orange;");
|
|
var attrs = [
|
|
"action_description",
|
|
"anticipation",
|
|
"armor_rating",
|
|
"awareness",
|
|
"charisma",
|
|
"description",
|
|
"dexterity",
|
|
"damage_reduction",
|
|
"damage_threshold",
|
|
"endurance",
|
|
"fortitude",
|
|
"hp",
|
|
"immune",
|
|
"intellect",
|
|
"level",
|
|
"logic",
|
|
"name",
|
|
"reflexes",
|
|
"resist",
|
|
"senses",
|
|
"size",
|
|
"speed",
|
|
"strength",
|
|
"tags",
|
|
"traits",
|
|
"vulnerable",
|
|
"willpower",
|
|
];
|
|
var update = getUpdate(attrs, page);
|
|
update.character_name = page.name;
|
|
update.sheet_type = "creature";
|
|
update.toggle_npc_setting = false;
|
|
update.toggle_edit_npc_edit = false;
|
|
var sections = processSection(page, [
|
|
"skills",
|
|
"features",
|
|
"actions",
|
|
"reactions",
|
|
"spells",
|
|
]);
|
|
Object.assign(update, sections);
|
|
var attackUpdate = processSkillsAndAttack(update);
|
|
Object.assign(update, attackUpdate);
|
|
update.hp_max = update.hp || 0;
|
|
var hasDefenses = defenses.some(function (attr) { return page.data[attr]; });
|
|
var silent = hasDefenses ? true : false;
|
|
console.table(update);
|
|
setDropAttrs(update, { silent: silent });
|
|
var hp = typeof update.hp === "boolean" ? 0 : update.hp;
|
|
var armorRating = typeof update.armor_rating === "boolean" ? 0 : update.armor_rating;
|
|
var tokenDefaults = {
|
|
bar1_value: hp,
|
|
bar1_max: hp,
|
|
bar2_value: armorRating,
|
|
};
|
|
updateDefaultToken(tokenDefaults, page.data["size"]);
|
|
};
|
|
var handle_equipment = function (page) {
|
|
var attrs = ["name", "description", "cost", "tags"];
|
|
var row = getRow("inventory");
|
|
var update = getUpdate(attrs, page, row);
|
|
update["".concat(row, "_qty")] = page.data.quantity ? page.data.quantity : 1;
|
|
var links = [];
|
|
if (page.data.subcategory === "weapon") {
|
|
var attackRow = getRow("attacks");
|
|
links.push(attackRow);
|
|
handle_weapon(page, attackRow, row);
|
|
}
|
|
if (page.data.modifiers) {
|
|
handle_modifiers(page, row);
|
|
}
|
|
if (page.data.trackables) {
|
|
handle_trackables(page, row);
|
|
}
|
|
var linksString = links.join(",");
|
|
update["".concat(row, "_link")] = linksString;
|
|
setDropAttrs(update);
|
|
};
|
|
var handle_feature = function (page) {
|
|
var attrs = ["name", "description"];
|
|
var row = getRow("abilities");
|
|
var update = getUpdate(attrs, page, row);
|
|
["lineage", "profession"].forEach(function (attr) {
|
|
if (page.data[attr]) {
|
|
update["".concat(row, "_tags")] = page.data[attr];
|
|
}
|
|
});
|
|
setDropAttrs(update);
|
|
};
|
|
var handle_lineage = function (page) {
|
|
var attrs = ["height", "weight", "speed", "size"];
|
|
var update = getUpdate(attrs, page);
|
|
update["lineage"] = page.name;
|
|
try {
|
|
setAttrs(update, { silent: true });
|
|
}
|
|
catch (e) {
|
|
dropWarning("Error setting attributes: ".concat(e));
|
|
}
|
|
};
|
|
var handle_modifiers = function (page, inventoryRow) {
|
|
var modifiers = parseJSON(page.data.modifiers);
|
|
var update = {};
|
|
modifiers.forEach(function (modifier) {
|
|
var _a;
|
|
if (modifier.modifier) {
|
|
var newRow = getRow("modifiers");
|
|
update["".concat(newRow, "_link")] = inventoryRow;
|
|
update["".concat(newRow, "_modifier")] = modifier.modifier;
|
|
update["".concat(newRow, "_source")] = page.name;
|
|
update["".concat(newRow, "_toggle_active")] = "on";
|
|
update["".concat(newRow, "_attribute")] = modifier.attribute;
|
|
update["".concat(newRow, "_description")] = (_a = modifier.description) !== null && _a !== void 0 ? _a : "";
|
|
update["".concat(newRow, "_toggle_edit")] = false;
|
|
}
|
|
else {
|
|
console.warn("Modifier ".concat(modifier.attribute, " has no modifier value"));
|
|
}
|
|
});
|
|
setDropAttrs(update, { silent: false });
|
|
};
|
|
var handle_profession = function (page) {
|
|
if (page.data.occupation) {
|
|
handle_bop(page);
|
|
return;
|
|
}
|
|
var attrs = ["name", "description"];
|
|
var row = getRow("abilities");
|
|
var update = getUpdate(attrs, page, row);
|
|
if (page.data.profession) {
|
|
update["".concat(row, "_tags")] = page.data.profession;
|
|
}
|
|
setDropAttrs(update);
|
|
};
|
|
var handle_skills = function (page) {
|
|
var attrs = ["name", "category", "description", "attribute"];
|
|
var row = getRow("skills");
|
|
var update = getUpdate(attrs, page, row);
|
|
update["".concat(row, "_bonus")] = 1;
|
|
if (typeof page.data.attribute === "string") {
|
|
update["".concat(row, "_attribute_abbreviation")] = getAttributeAbbreviation(page.data.attribute);
|
|
}
|
|
setDropAttrs(update);
|
|
};
|
|
var handle_spell = function (page) {
|
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
var attrs = [
|
|
"apc",
|
|
"description",
|
|
"focus",
|
|
"name",
|
|
"spc",
|
|
"type",
|
|
"damage",
|
|
"damage_type",
|
|
"upcharge",
|
|
"range",
|
|
"duration",
|
|
"cast_time",
|
|
"prerequisites",
|
|
"recharge",
|
|
];
|
|
var row = getRow("spells");
|
|
var update = getUpdate(attrs, page, row);
|
|
if (page.data.damage) {
|
|
update["".concat(row, "_toggle_spell_attack")] = "on";
|
|
addSpellAttack(row, page);
|
|
}
|
|
if ((_a = page.data) === null || _a === void 0 ? void 0 : _a.function_note) {
|
|
update["".concat(row, "_function")] = "".concat(page.data.function, " (").concat(page.data.function_note, ")");
|
|
}
|
|
if ((_b = page.data) === null || _b === void 0 ? void 0 : _b.liturgy_apc) {
|
|
update["".concat(row, "_apc")] = "".concat(page.data.liturgy_apc, " (liturgy apc)");
|
|
}
|
|
if ((_c = page.data) === null || _c === void 0 ? void 0 : _c.liturgy_spc) {
|
|
update["".concat(row, "_spc")] = "".concat(page.data.liturgy_spc, " (liturgy spc)");
|
|
}
|
|
if (((_d = page.data) === null || _d === void 0 ? void 0 : _d.requires) && ((_e = page.data) === null || _e === void 0 ? void 0 : _e.materials)) {
|
|
update["".concat(row, "_requires")] = "".concat((_f = page.data) === null || _f === void 0 ? void 0 : _f.requires, " (").concat(page.data.materials, ")");
|
|
}
|
|
else if ((_g = page.data) === null || _g === void 0 ? void 0 : _g.requires) {
|
|
update["".concat(row, "_requires")] = "".concat((_h = page.data) === null || _h === void 0 ? void 0 : _h.requires);
|
|
}
|
|
else if ((_j = page.data) === null || _j === void 0 ? void 0 : _j.materials) {
|
|
update["".concat(row, "_requires")] = "".concat((_k = page.data) === null || _k === void 0 ? void 0 : _k.materials);
|
|
}
|
|
var tags = "".concat(page.data.source, " ").concat(page.data.type, ", ").concat(page.data.function);
|
|
if ((_l = page.data) === null || _l === void 0 ? void 0 : _l.function_note) {
|
|
tags += ", ".concat(page.data.function_note);
|
|
}
|
|
if (page.data.source) {
|
|
update["".concat(row, "_source")] = page.data.source.toString().toLowerCase();
|
|
}
|
|
update["".concat(row, "_tags")] = tags;
|
|
setDropAttrs(update);
|
|
};
|
|
var handle_talent = function (page) {
|
|
var attrs = ["name", "description", "level", "prerequisites"];
|
|
var row = getRow("talents");
|
|
var update = getUpdate(attrs, page, row);
|
|
var tag = page.data.stack;
|
|
if (page.data.track) {
|
|
tag += ", ".concat(page.data.track);
|
|
}
|
|
update["".concat(row, "_tags")] = tag;
|
|
if (page.data.reactive) {
|
|
var reactiveRow = getRow("reactive-actions");
|
|
var reactiveAttrs = ["name", "description", "ap"];
|
|
var reactiveUpdate = getUpdate(reactiveAttrs, page, reactiveRow);
|
|
Object.assign(update, reactiveUpdate);
|
|
update["".concat(reactiveRow, "_toggle_edit")] = false;
|
|
update["".concat(reactiveRow, "_link")] = row;
|
|
update["".concat(row, "_link")] = reactiveRow;
|
|
}
|
|
setDropAttrs(update);
|
|
};
|
|
var handle_trackables = function (page, row) {
|
|
var attrs = ["name", "value"];
|
|
var JSON = parseJSON(page.data.trackables);
|
|
var update = {};
|
|
JSON.forEach(function (trackable) {
|
|
var newRow = getRow("trackables");
|
|
update["".concat(newRow, "_name")] = "".concat(page.name, " ").concat(trackable.name);
|
|
update["".concat(newRow, "_value")] = trackable.value;
|
|
update["".concat(newRow, "_value_max")] = trackable.value;
|
|
});
|
|
setDropAttrs(update);
|
|
};
|
|
var handle_vehicles = function (page) {
|
|
var attrs = [
|
|
"range",
|
|
"ammunition",
|
|
"reload",
|
|
"area_of_effect",
|
|
"helf",
|
|
"speed",
|
|
"hp",
|
|
"armor_rating",
|
|
"reflexes",
|
|
"fortitude",
|
|
"resist",
|
|
"immune",
|
|
"vulnerable",
|
|
"damage_reduction",
|
|
"damage_threshold",
|
|
"action_description",
|
|
];
|
|
var update = getUpdate(attrs, page);
|
|
update.sheet_type = "siege";
|
|
update.toggle_npc_setting = false;
|
|
update.toggle_edit_npc_edit = false;
|
|
update.npc_sections = "actions";
|
|
update.section_actions = "on";
|
|
var sections = processSection(page, ["actions"]);
|
|
Object.assign(update, sections);
|
|
var attackUpdate = processSkillsAndAttack(update);
|
|
Object.assign(update, attackUpdate);
|
|
if (update.action_description) {
|
|
update["section_actions"] = "on";
|
|
if (!update.npc_sections.includes("actions")) {
|
|
update.npc_sections = "".concat(update.npc_sections, ",actions");
|
|
}
|
|
}
|
|
setDropAttrs(update, { silent: true });
|
|
var hp = typeof update.hp === "boolean" ? 0 : update.hp;
|
|
var armorRating = typeof update.armor_rating === "boolean" ? 0 : update.armor_rating;
|
|
var tokenDefaults = {
|
|
bar1_value: hp,
|
|
bar1_max: hp,
|
|
bar2_value: armorRating,
|
|
};
|
|
updateDefaultToken(tokenDefaults, page.data["size"]);
|
|
};
|
|
var getAttributeInfo = function (attr) {
|
|
if (typeof attr === "string") {
|
|
return {
|
|
attribute: "@{".concat(attr, "}"),
|
|
abbreviation: getAttributeAbbreviation(attr),
|
|
};
|
|
}
|
|
console.warn("Attribute is not a string: ".concat(attr));
|
|
return { attribute: "", abbreviation: "" };
|
|
};
|
|
var handle_weapon = function (page, attackRow, inventoryRow) {
|
|
var _a;
|
|
var _b;
|
|
var attrs = [
|
|
"apc",
|
|
"cost",
|
|
"damage_type",
|
|
"damage",
|
|
"damage_attribute",
|
|
"name",
|
|
"range",
|
|
"reload",
|
|
"size",
|
|
"subcategory",
|
|
"tags",
|
|
"type",
|
|
"weight",
|
|
"description",
|
|
"effect",
|
|
"crit_range",
|
|
];
|
|
var row = attackRow ? attackRow : getRow("attacks");
|
|
var update = getUpdate(attrs, page, row);
|
|
update["".concat(row, "_category")] = page.data.Category;
|
|
update["".concat(row, "_link")] = inventoryRow;
|
|
var setAttributeField = function (key, value) {
|
|
if (!value)
|
|
return;
|
|
var _a = getAttributeInfo(value), attribute = _a.attribute, abbreviation = _a.abbreviation;
|
|
update["".concat(row, "_").concat(key)] = attribute;
|
|
update["".concat(row, "_").concat(key, "_abbreviation")] = abbreviation;
|
|
};
|
|
setAttributeField("attribute", page.data.attribute);
|
|
if (page.data.damage_attribute) {
|
|
setAttributeField("damage_attribute", page.data.damage_attribute);
|
|
}
|
|
else {
|
|
setAttributeField("damage_attribute", page.data.attribute);
|
|
}
|
|
if (!page.data.attribute) {
|
|
update["".concat(row, "_bonus")] = 0;
|
|
}
|
|
setDropAttrs(update);
|
|
setDropAttrs((_a = {},
|
|
_a["".concat(row, "_modifier")] = (_b = page.data.modifier) !== null && _b !== void 0 ? _b : 0,
|
|
_a), { silent: false });
|
|
};
|
|
var isDataArray = function (data) {
|
|
return Array.isArray(data) || (typeof data === "string" && data.startsWith("["));
|
|
};
|
|
var processSection = function (page, list) {
|
|
var update = {};
|
|
var sections = [];
|
|
list.forEach(function (section) {
|
|
var sectionData = page.data[section];
|
|
if (sectionData && isDataArray(sectionData)) {
|
|
sections.push(section);
|
|
var processed = processDataArrays(sectionData, function (data) {
|
|
return getUpdate(Object.keys(data), data, getRow(section));
|
|
});
|
|
Object.assign(update, processed);
|
|
}
|
|
});
|
|
update.npc_sections = sections.join(",");
|
|
sections.forEach(function (section) {
|
|
update["section_".concat(section)] = "on";
|
|
});
|
|
return update;
|
|
};
|
|
var processSkillsAndAttack = function (updateAttrs) {
|
|
var update = {};
|
|
Object.entries(__assign({}, updateAttrs)).forEach(function (_a) {
|
|
var key = _a[0], value = _a[1];
|
|
var row = getFieldsetRow(key);
|
|
if (key.endsWith("_defense")) {
|
|
update["".concat(row, "_toggle_action_attack")] = "on";
|
|
update["".concat(row, "_roll_formula")] = getCreatureAttackRollFormula(true, {
|
|
includeDice: true,
|
|
includeDefense: !!update["".concat(row, "_defense")],
|
|
includeDamage: !!update["".concat(row, "_damage")],
|
|
includeEffect: !!update["".concat(row, "_effect")],
|
|
});
|
|
return;
|
|
}
|
|
if (key.endsWith("_modifier")) {
|
|
var int = parseInteger("".concat(value));
|
|
update["".concat(row, "_modifier")] = int > 0 ? "+".concat(int) : "".concat(value);
|
|
}
|
|
if (key.endsWith("_attribute")) {
|
|
update["".concat(row, "_attribute")] = "@{".concat(value, "}");
|
|
var abbr = getAttributeAbbreviation("".concat(value));
|
|
update["".concat(row, "_attribute_abbreviation")] = "(".concat(abbr, ")");
|
|
return;
|
|
}
|
|
});
|
|
return update;
|
|
};
|
|
var convertIntegerNegative = function (number) {
|
|
return number > 0 ? -Math.abs(number) : number;
|
|
};
|
|
var convertIntegersNegatives = function (numbers) {
|
|
var negativeNumbers = {};
|
|
for (var _i = 0, _a = Object.entries(numbers); _i < _a.length; _i++) {
|
|
var _b = _a[_i], key = _b[0], value = _b[1];
|
|
negativeNumbers[key] = convertIntegerNegative(value);
|
|
}
|
|
return negativeNumbers;
|
|
};
|
|
var createAttributeName = function (name) {
|
|
return name === null || name === void 0 ? void 0 : name.replace(/ /g, "_").toLowerCase();
|
|
};
|
|
var getAttributeAbbreviation = function (attribute) {
|
|
if (attribute === "luck") {
|
|
return attribute;
|
|
}
|
|
if (attribute.charAt(0) === "@") {
|
|
attribute = attribute.substring(2, attribute.length - 1);
|
|
}
|
|
var abbreviation = attribute.substring(0, 3);
|
|
if (attribute === "awareness" || attribute === "coordination") {
|
|
var key = getTranslationByKey(abbreviation);
|
|
if (key) {
|
|
return key;
|
|
}
|
|
else {
|
|
console.warn("Key not found for ".concat(attribute, " abbreviation: ").concat(abbreviation));
|
|
}
|
|
}
|
|
return abbreviation;
|
|
};
|
|
var getFieldsetAttr = function (key) {
|
|
var reprowid = getFieldsetRow(key);
|
|
return key.split("".concat(reprowid, "_"))[1];
|
|
};
|
|
var getFieldsetGroupName = function (trigger) { return trigger.split("_")[1]; };
|
|
var getFieldsetRow = function (trigger) {
|
|
var split = trigger.split("_");
|
|
return "".concat(split[0], "_").concat(split[1], "_").concat(split[2]);
|
|
};
|
|
var getTranslations = function (translationKeys) {
|
|
var translations = {};
|
|
translationKeys.forEach(function (obj) {
|
|
Object.keys(obj).forEach(function (key) {
|
|
var translation = getTranslationByKey(key);
|
|
if (typeof translation === "string") {
|
|
translations["".concat(key)] = translation;
|
|
}
|
|
});
|
|
});
|
|
return translations;
|
|
};
|
|
var parseInteger = function (string) { return parseFloat(string) || 0; };
|
|
var parseIntegers = function (values) {
|
|
var parsedNumbers = {};
|
|
for (var _i = 0, _a = Object.entries(values); _i < _a.length; _i++) {
|
|
var _b = _a[_i], key = _b[0], value = _b[1];
|
|
if (typeof value === "string") {
|
|
parsedNumbers[key] = parseInteger(value);
|
|
}
|
|
else if (typeof value === "number") {
|
|
parsedNumbers[key] = value;
|
|
}
|
|
}
|
|
return parsedNumbers;
|
|
};
|
|
var sliceAttribute = function (attribute) { return attribute.slice(2, -1); };
|
|
var sumIntegers = function (numbers) { return numbers.reduce(function (a, b) { return a + b; }, 0); };
|
|
var versionOneOne = function () {
|
|
var fieldsToUpdate = ["repeating_attacks", "repeating_skills"];
|
|
fieldsToUpdate.forEach(function (fieldset) {
|
|
getSectionIDs(fieldset, function (ids) {
|
|
var bonuses = ids.map(function (id) { return "".concat(fieldset, "_").concat(id, "_bonus"); });
|
|
getAttrs(bonuses, function (values) {
|
|
var updates = {};
|
|
bonuses.forEach(function (bonus) {
|
|
var modifier = bonus.replace("bonus", "modifier");
|
|
updates[modifier] = values[bonus] || "0";
|
|
});
|
|
setAttrs(updates);
|
|
});
|
|
});
|
|
});
|
|
getAttrs(["awareness", "initiative_bonus"], function (v) {
|
|
setAttrs({ initiative: v.initiative_bonus + v.awareness });
|
|
});
|
|
};
|
|
var versionOneSeven = function () {
|
|
getAttrs(["creature_sections", "dr", "dt"], function (values) {
|
|
setAttrs({
|
|
npc_sections: values.creature_sections,
|
|
damage_reduction: values.dr,
|
|
damage_threshold: values.dt,
|
|
});
|
|
});
|
|
};
|
|
var versionOneSevenOne = function () {
|
|
setAttrs({
|
|
toggle_edit_npc_edit: "0",
|
|
});
|
|
};
|
|
var versionOneThree = function () {
|
|
var fieldsToUpdate = ["repeating_actions"];
|
|
fieldsToUpdate.forEach(function (fieldset) {
|
|
getSectionIDs(fieldset, function (ids) {
|
|
var bonuses = ids.map(function (id) { return "".concat(fieldset, "_").concat(id, "_bonus"); });
|
|
getAttrs(bonuses, function (values) {
|
|
var updates = {};
|
|
bonuses.forEach(function (bonus) {
|
|
var modifier = bonus.replace("bonus", "modifier");
|
|
updates[modifier] = values[bonus] || "0";
|
|
});
|
|
setAttrs(updates);
|
|
});
|
|
});
|
|
});
|
|
};
|
|
var versionOneTwo = function () {
|
|
getAttrs(["initiative_bonus"], function (v) {
|
|
var _a;
|
|
var parsedInt = parseInt(v.initiative_bonus || "0", 10);
|
|
if (parsedInt > 0) {
|
|
var newRowId = generateRowID();
|
|
var row = "repeating_modifiers_".concat(newRowId);
|
|
setAttrs((_a = {},
|
|
_a["".concat(row, "_attribute")] = "initiative",
|
|
_a["".concat(row, "_modifier")] = v.initiative_bonus || "0",
|
|
_a["".concat(row, "_toggle_active")] = "on",
|
|
_a["".concat(row, "_source")] = "version 1.2",
|
|
_a["".concat(row, "_toggle_edit")] = false,
|
|
_a["".concat(row, "_description")] = "Migrated from initiative bonus input in combat tab.",
|
|
_a));
|
|
}
|
|
});
|
|
};
|
|
var versionOneTwoOne = function () {
|
|
getAttrs(["critical_range", "critical_range_base"], function (v) {
|
|
setAttrs({
|
|
critical_hit: v.critical_range || "20",
|
|
critical_hit_base: v.critical_range_base || "20",
|
|
critical_fail_base: "1",
|
|
critical_fail: "1",
|
|
});
|
|
});
|
|
};
|
|
on("clicked:launch_charactermancer", function () {
|
|
startCharactermancer("start");
|
|
});
|
|
[
|
|
"start",
|
|
"lineage",
|
|
"attributes",
|
|
"stats",
|
|
"background",
|
|
"profession",
|
|
"talent",
|
|
"review",
|
|
].forEach(function (step) {
|
|
on("clicked:charactermancer_".concat(step), function () {
|
|
startCharactermancer(step);
|
|
});
|
|
});
|
|
on("mancer:cancel", function (event) {
|
|
console.log("Cancel charactermancer", event);
|
|
});
|
|
on("mancerfinish:name", function (event) {
|
|
console.log("Finished charactermancer with name:", event);
|
|
});
|
|
on("page:lineage", function () {
|
|
console.log("%c Lineage page opened", "color: cyan; font-weight: bold;");
|
|
});
|
|
on("page:attributes", function () {
|
|
console.log("%c Attributes page opened", "color: cyan; font-weight: bold;");
|
|
});
|
|
on("page:review", function () {
|
|
console.log("%c Review page opened", "color: cyan; font-weight: bold;");
|
|
var charmancerData = getCharmancerData();
|
|
console.log("Charmancer:", charmancerData);
|
|
});
|
|
on("page:final", function () {
|
|
finishCharactermancer();
|
|
});
|
|
var valueCheck = function (value) {
|
|
if (value > 2)
|
|
return 2;
|
|
if (value < -3)
|
|
return -3;
|
|
if (isNaN(value))
|
|
return 0;
|
|
return value;
|
|
};
|
|
var getAttributeCap = function (level) {
|
|
if (level < 1)
|
|
throw new Error("Level must be at least 1.");
|
|
return Math.ceil(level / 2) + 1;
|
|
};
|
|
var computeAttributePointUsage = function (attrs, basePool) {
|
|
if (basePool === void 0) { basePool = 5; }
|
|
var spent = 0;
|
|
var gainedFromNegatives = 0;
|
|
for (var _i = 0, _a = Object.keys(attrs); _i < _a.length; _i++) {
|
|
var key = _a[_i];
|
|
var value = attrs[key];
|
|
if (value > 0) {
|
|
spent += value;
|
|
}
|
|
else if (value < 0) {
|
|
gainedFromNegatives += -value;
|
|
}
|
|
}
|
|
var totalPool = basePool + gainedFromNegatives;
|
|
var remaining = totalPool - spent;
|
|
return { spent: spent, gainedFromNegatives: gainedFromNegatives, totalPool: totalPool, remaining: remaining };
|
|
};
|
|
var validateAttributes = function (level, attrs) {
|
|
var errors = [];
|
|
var cap = getAttributeCap(level);
|
|
var points = computeAttributePointUsage(attrs);
|
|
for (var _i = 0, _a = Object.keys(attrs); _i < _a.length; _i++) {
|
|
var key = _a[_i];
|
|
var value = attrs[key];
|
|
if (value > cap) {
|
|
errors.push("".concat(key, " (").concat(value, ") exceeds the cap of +").concat(cap, " for level ").concat(level, "."));
|
|
}
|
|
}
|
|
if (points.remaining < 0) {
|
|
errors.push("You have overspent Attribute Points: spent ".concat(points.spent, " with a pool of ").concat(points.totalPool, "."));
|
|
}
|
|
return {
|
|
ok: errors.length === 0,
|
|
errors: errors,
|
|
cap: cap,
|
|
points: points,
|
|
};
|
|
};
|
|
function getLuckStats(luck) {
|
|
var luckPoints = luck > 0 ? Math.floor(luck / 2) : 0;
|
|
var canCrit = luck >= 0;
|
|
var critDamageBonus = luck >= 1 ? luck : 0;
|
|
var d20ModifierFromLuck = luck < 0 ? luck : 0;
|
|
var critRangeStart = 20;
|
|
if (luck >= 12) {
|
|
critRangeStart = 18;
|
|
}
|
|
else if (luck >= 6) {
|
|
critRangeStart = 19;
|
|
}
|
|
return {
|
|
luckPoints: luckPoints,
|
|
canCrit: canCrit,
|
|
critDamageBonus: critDamageBonus,
|
|
critRangeStart: critRangeStart,
|
|
d20ModifierFromLuck: d20ModifierFromLuck,
|
|
};
|
|
}
|
|
function getActionPoints(cor) {
|
|
var baseAP = 3;
|
|
var bonusFromCor = 0;
|
|
if (cor >= 0) {
|
|
bonusFromCor = Math.floor(cor / 2);
|
|
}
|
|
else if (cor === -1 || cor === -2) {
|
|
bonusFromCor = -1;
|
|
}
|
|
else if (cor <= -3) {
|
|
bonusFromCor = -2;
|
|
}
|
|
var totalAP = baseAP + bonusFromCor;
|
|
return { baseAP: baseAP, bonusFromCor: bonusFromCor, totalAP: totalAP };
|
|
}
|
|
attributes.forEach(function (attr) {
|
|
on("mancerchange:".concat(attr), function (event) {
|
|
var charmancerData = getCharmancerData();
|
|
var values = charmancerData.attributes.values;
|
|
var attrs = {};
|
|
attributes.forEach(function (attribute) {
|
|
attrs[attribute] = values[attribute]
|
|
? parseInteger(values[attribute])
|
|
: 0;
|
|
});
|
|
var level = 1;
|
|
var validation = validateAttributes(level, attrs);
|
|
if (!validation.ok) {
|
|
console.error("Invalid attributes:", validation.errors);
|
|
}
|
|
var luckStats = getLuckStats(attrs["luck"]);
|
|
var apStats = getActionPoints(attrs["coordination"]);
|
|
console.log({ validation: validation, luckStats: luckStats, apStats: apStats });
|
|
console.log({ validation: validation });
|
|
});
|
|
});
|
|
var updateAttribute = function (attribute, change) {
|
|
var _a;
|
|
var charmancerData = getCharmancerData();
|
|
var value = charmancerData.attributes.values[attribute];
|
|
var int = valueCheck(parseInteger(value) + change);
|
|
setAttrs((_a = {}, _a[attribute] = int, _a));
|
|
};
|
|
on("clicked:decrease_attribute", function (event) {
|
|
var attribute = event.htmlAttributes.value;
|
|
updateAttribute(attribute, -1);
|
|
});
|
|
on("clicked:increase_attribute", function (event) {
|
|
var attribute = event.htmlAttributes.value;
|
|
updateAttribute(attribute, 1);
|
|
});
|
|
on("mancerchange:lineage", function (event) {
|
|
var pageName = event.newValue.includes("?expansion")
|
|
? event.newValue.split("?")[0]
|
|
: event.newValue;
|
|
changeCompendiumPage("sheet-iframe", pageName);
|
|
getCompendiumPage(pageName, function (page) {
|
|
var show = [];
|
|
var hide = [];
|
|
var LINEAGE_ATTRIBUTES = [
|
|
"appearance",
|
|
"height",
|
|
"lifespan",
|
|
"size",
|
|
"speed",
|
|
"weight",
|
|
];
|
|
LINEAGE_ATTRIBUTES.forEach(function (attr) {
|
|
if (page.data[attr]) {
|
|
show.push("sheet-choice-".concat(attr));
|
|
}
|
|
else {
|
|
hide.push("sheet-choice-".concat(attr));
|
|
}
|
|
});
|
|
show.length && showChoices(show);
|
|
hide.length && hideChoices(hide);
|
|
setAttrs({ name: page.name }, { silent: true });
|
|
});
|
|
});
|
|
</script> |