Files
roll20-character-sheets/OperaRPG/operarpg.html
T
2024-06-03 13:15:14 -04:00

2105 lines
85 KiB
HTML

<div class="main-container">
<!-- Header -->
<div class="header">
<div class="logo main-font">
<img
src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/OperaRPG/assets/logo_opera.png" />
</div>
<div class="flex-column grow">
<div class="header-row">
<span class="label secondary-font" data-i18n="name">Nome</span>
<input name="attr_character_name" type="text" title="@{character_name}" />
</div>
<div class="header-row">
<span class="label secondary-font" data-i18n="attribute_points">Pontos de Atributo</span>
<div class="header-grid row-item-margin">
<span class="column-header secondary-font" data-i18n="max">Max</span>
<span class="column-header secondary-font" data-i18n="used">Usado</span>
<input class="bigger-number-input" name="attr_max_attribute_points" type="number" title="@{max_attribute_points}" value="18" />
<input class="bigger-number-input" name="attr_used_attribute_points" type="number" disabled="true" title="@{used_attribute_points}"
value="@{charphysique} + @{chardexterity} + @{charintelligence}" />
</div>
<span class="label secondary-font" data-i18n="creation_points">Pontos de Criação</span>
<div class="header-grid">
<span class="column-header secondary-font" data-i18n="max">Max</span>
<span class="column-header secondary-font" data-i18n="used">Usado</span>
<input class="bigger-number-input" name="attr_max_creation_points" type="number" title="@{max_creation_points}" value="0" />
<input class="bigger-number-input" name="attr_used_creation_points" type="number" readonly title="@{used_creation_points}"
value="0" />
</div>
</div>
</div>
</div>
<div class="header-row2">
<div class="actions header-box">
<div class="actions-label">
<span class="label secondary-font actions-label" data-i18n="physical_actions">Ações Físicas</span>
</div>
<div class="actions-grid">
<span class="column-header secondary-font" data-i18n="base">Base</span>
<span class="column-header secondary-font" data-i18n="effect">Efeito</span>
<span class="column-header secondary-font" data-i18n="total">Total</span>
<input name="attr_physical_actionsbase" type="number" title="@{physical_actionsbase}" value="2" />
<input name="attr_physical_actionseffect" type="text" readonly="true" title="@{physical_actionseffect}" />
<input name="attr_physical_actionstotal" type="number" disabled="true" title="@{physical_actionstotal}"
value="@{physical_actionsbase} @{physical_actionseffect}" />
</div>
</div>
<div class="actions header-box">
<div class="actions-label">
<span class="label secondary-font actions-label" data-i18n="mind_actions">Ações Mentais</span>
</div>
<div class="actions-grid">
<span class="column-header secondary-font" data-i18n="base">Base</span>
<span class="column-header secondary-font" data-i18n="effect">Efeito</span>
<span class="column-header secondary-font" data-i18n="total">Total</span>
<input name="attr_mind_actionsbase" type="number" title="@{mind_actionsbase}" value="2" />
<input name="attr_mind_actionseffect" type="text" readonly="true" title="@{mind_actionseffect}" />
<input name="attr_mind_actionstotal" type="number" disabled="true" title="@{mind_actionstotal}"
value="@{mind_actionsbase} @{mind_actionseffect}" />
</div>
</div>
<div class="init header-box">
<div class="actions-label">
<button type="roll" class="roll-button" name="roll_initiative_check" title="@{initiative_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{initiative}}} {{value=[[@{initiativetotal}]]}} {{dispute=[[ [[2d6cs>2cf<5]] +@{initiativetotal}}]]}} {{roll=$[[1]]}}"></button>
<span class="label secondary-font" data-i18n="initiative">Iniciativa</span>
</div>
<div class="init-grid">
<span class="column-header secondary-font" data-i18n="base">Base</span>
<span class="column-header secondary-font" data-i18n="effect">Efeito</span>
<span class="column-header secondary-font" data-i18n="modifier">Mod</span>
<span class="column-header secondary-font" data-i18n="total">Total</span>
<input name="attr_initiativebase" type="number" disabled="true" title="@{initiativebase}"
value="@{chardexterity}" />
<input type="text" readonly="true" name="attr_initiativefeatureeffect" value="+0"
title="@{initiativefeatureeffect}">
<input name="attr_initiativemod" type="number" title="@{initiativemod}" value="0" />
<input name="attr_initiativetotal" type="number" disabled="true" title="@{initiativetotal}"
value="@{initiativebase} @{initiativefeatureeffect} + @{initiativemod}" />
</div>
</div>
<div class="dodge header-box">
<div class="actions-label">
<button type="roll" class="roll-button" name="roll_dodge_check" title="@{dodge_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{dodge}}} {{value=[[@{dodgetotal}]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{dodgetotal}}]]}} {{roll=$[[1]]}}"></button>
<span class="label secondary-font" data-i18n="dodge">Esquiva</span>
</div>
<div class="dodge-grid">
<span class="column-header secondary-font" data-i18n="base">Base</span>
<span class="column-header secondary-font" data-i18n="effect">Effect</span>
<span class="column-header secondary-font" data-i18n="fight">Briga</span>
<span class="column-header secondary-font" data-i18n="modifier">Mod</span>
<span class="column-header secondary-font" data-i18n="total">Total</span>
<input name="attr_dodgebase" type="number" disabled="true" title="@{dodgebase}" value="@{chardexterity}" />
<input type="text" readonly="true" name="attr_dodgefeatureeffect" value="+0" title="@{dodgefeatureeffect}">
<input name="attr_fightdodgebonus" type="number" readonly="true" title="@{fightdodgebonus}" value="0" />
<input name="attr_dodgemod" type="number" title="@{dodgemod}" value="0" />
<input name="attr_dodgetotal" type="number" disabled="true" title="@{dodgetotal}"
value="@{dodgebase} @{dodgefeatureeffect} + @{fightdodgebonus} + @{dodgemod}" />
</div>
</div>
<div class="header-box damage">
<span class="label secondary-font" data-i18n="physical_damage">Dano por Físico</span>
<input type="text" readonly="true" name="attr_physicaldamage" title="@{physicaldamage}" value="0" />
</div>
</div>
<!-- Tab navigation -->
<div class="tab-panel">
<button type="action" name="act_profile" data-i18n="profile">Perfil</button>
<button type="action" name="act_journal" data-i18n="journal">Diário</button>
<button type="action" name="act_configuration" data-i18n="configuration">Configuração</button>
</div>
<input type='hidden' class='tabcontrol' name='attr_tabcontrol' value='profile' />
<!-- Profile Tab -->
<div class="profiletab">
<!-- Middle -->
<div class="middle">
<!-- Middle column 1-->
<div class="middle-column">
<div class="box flex-column">
<span class="box-title main-font" data-i18n="attributes">Atributos</span>
<div class="attributes-grid">
<div></div>
<div></div>
<span class="column-header secondary-font" data-i18n="original">Orig</span>
<span class="column-header secondary-font special-mod" data-i18n="special_modifier">Mod Espec</span>
<!-- The Mod label actually references the effect field of the attributes -->
<span class="column-header secondary-font" data-i18n="modifier">Mod</span>
<span class="column-header secondary-font" data-i18n="damage">Dano</span>
<span class="column-header secondary-font" data-i18n="total">Total</span>
<button type="roll" class="roll-button" name="roll_physique_check" title="@{physique_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{physique}}} {{value=[[@{charphysique}]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{charphysique}]]}} {{roll=$[[1]]}}"></button>
<span class="label secondary-font" data-i18n="physique">Físico</span>
<input name="attr_charphysique" type="number" title="@{charphysique}" value="0" />
<select class="select" name="attr_charphysiquemodoperator" title="@{physiquemodoperator}">
<option value="*" selected="selected">x</option>
<option value="/">/</option>
</select>
<input name="attr_charphysiquemod" type="number" title="@{charphysiquemod}" value="0" />
<input name="attr_charphysicalfeatureeffect" type="text" readonly="true"
title="@{charphysicalfeatureeffect}" />
<input name="attr_charphysiquedamage" type="number" title="@{charphysiquedamage}" value="0" />
<input name="attr_charphysiquetotal" type="number" disabled="true" title="@{charphysiquetotal}"
value="floor(@{charphysique} @{charphysicalfeatureeffect}) - @{charphysiquedamage}" />
<button type="roll" class="roll-button" name="roll_dexterity_check" title="@{dexterity_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{dexterity}}} {{value=[[@{chardexterity}]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{chardexterity}]]}} {{roll=$[[1]]}}"></button>
<span class="label secondary-font" data-i18n="dexterity">Destreza</span>
<input name="attr_chardexterity" type="number" title="@{chardexterity}" value="0" />
<select class="select" name="attr_chardexteritymodoperator" title="@{dexteritymodoperator}">
<option value="*" selected="selected">x</option>
<option value="/">/</option>
</select>
<input name="attr_chardexteritymod" type="number" title="@{chardexteritymod}" value="0" />
<input name="attr_chardexterityfeatureeffect" type="text" readonly="true"
title="@{chardexterityfeatureeffect}" />
<input name="attr_chardexteritydamage" type="number" title="@{chardexteritydamage}" value="0" />
<input name="attr_chardexteritytotal" type="number" disabled="true" title="@{chardexteritytotal}"
value="floor(@{chardexterity} @{chardexterityfeatureeffect}) - @{chardexteritydamage}" />
<button type="roll" class="roll-button" name="roll_intelligence_check" title="@{intelligence_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{intelligence}}} {{value=[[@{charintelligence}]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{charintelligence}]]}} {{roll=$[[1]]}}"></button>
<span class="label secondary-font" data-i18n="intelligence">Inteligência</span>
<input name="attr_charintelligence" type="number" title="@{charintelligence}" value="0" />
<select class="select" name="attr_charintelligencemodoperator" title="@{intelligencemodoperator}">
<option value="*" selected="selected">x</option>
<option value="/">/</option>
</select>
<input name="attr_charintelligencemod" type="number" title="@{charintelligencemod}" value="0" />
<input name="attr_charintelligencefeatureeffect" type="text" readonly="true"
title="@{charintelligencefeatureeffect}" />
<input name="attr_charintelligencedamage" type="number" title="@{charintelligencedamage}" value="0" />
<input name="attr_charintelligencetotal" type="number" disabled="true" title="@{charintelligencetotal}"
value="floor(@{charintelligence} @{charintelligencefeatureeffect}) - @{charintelligencedamage}" />
<button type="roll" class="roll-button" name="roll_perception_check" title="@{perception_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{perception}}} {{value=[[@{charperception}]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{charperception}]]}} {{roll=$[[1]]}}"></button>
<span class="label secondary-font" data-i18n="perception">Percepção</span>
<input name="attr_charperception" type="number" title="@{charperception}" value="0" />
<select class="select" name="attr_charperceptionmodoperator" title="@{perceptionmodoperator}">
<option value="*" selected="selected">x</option>
<option value="/">/</option>
</select>
<input name="attr_charperceptionmod" type="number" title="@{charperceptionmod}" value="0" />
<input name="attr_charperceptionfeatureeffect" type="text" readonly="true"
title="@{charperceptionfeatureeffect}" />
<input name="attr_charperceptiondamage" type="number" title="@{charperceptiondamage}" value="0" />
<input name="attr_charperceptiontotal" type="number" disabled="true" title="@{charperceptiontotal}"
value="floor(@{charperception} @{charperceptionfeatureeffect}) - @{charperceptiondamage}" />
<button type="roll" class="roll-button" name="roll_will_check" title="@{will_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{will}}} {{value=[[@{charwill}]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{charwill}]]}} {{roll=$[[1]]}}"></button>
<span class="label secondary-font" data-i18n="will">Vontade</span>
<input name="attr_charwill" type="number" title="@{charwill}" value="6" />
<select class="select" name="attr_charwillmodoperator" title="@{willmodoperator}">
<option value="*" selected="selected">x</option>
<option value="/">/</option>
</select>
<input name="attr_charwillmod" type="number" title="@{charwillmod}" value="0" />
<input name="attr_charwillfeatureeffect" type="text" readonly="true" title="@{charwillfeatureeffect}" />
<input name="attr_charwilldamage" type="number" title="@{charwilldamage}" value="0" />
<input name="attr_charwilltotal" type="number" disabled="true" title="@{charwilltotal}"
value="floor(@{charwill} @{charwillfeatureeffect}) - @{charwilldamage}" />
<button type="roll" class="roll-button" name="roll_mind_check" title="@{mind_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{mind}}} {{value=[[@{charmind}]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{charmind}]]}} {{roll=$[[1]]}}"></button>
<span class="label secondary-font" data-i18n="mind">Mente</span>
<input name="attr_charmind" type="number" title="@{charmind}" value="8" />
<select class="select" name="attr_charmindmodoperator" title="@{mindmodoperator}">
<option value="*" selected="selected">x</option>
<option value="/">/</option>
</select>
<input name="attr_charmindmod" type="number" title="@{charmindmod}" value="0" />
<input name="attr_charmindfeatureeffect" type="text" readonly="true" title="@{charmindfeatureeffect}" />
<input name="attr_charminddamage" type="number" title="@{charminddamage}" value="0" />
<input name="attr_charmindtotal" type="number" disabled="true" title="@{charmindtotal}"
value="floor(@{charmind} @{charmindfeatureeffect}) - @{charminddamage}" />
<button type="roll" class="roll-button" name="roll_magic_check" title="@{magic_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{magic}}} {{value=[[@{charmagic}]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{charmagic}]]}} {{roll=$[[1]]}}"></button>
<span class="label secondary-font" data-i18n="magic">Magia</span>
<input name="attr_charmagic" type="number" title="@{charmagic}" value="0" />
<select class="select" name="attr_charmagicmodoperator" title="@{charmagicmodoperator}">
<option value="*" selected="selected">x</option>
<option value="/">/</option>
</select>
<input name="attr_charmagicmod" type="number" title="@{charmagicmod}" value="0" />
<input name="attr_charmagicfeatureeffect" type="text" readonly="true" title="@{charmagicfeatureeffect}" />
<input name="attr_charmagicdamage" type="number" title="@{charmagicdamage}" value="0" />
<input name="attr_charmagictotal" type="number" disabled="true" title="@{charmagictotal}"
value="floor(@{charmagic} @{charmagicfeatureeffect}) - @{charmagicdamage}" />
<button type="roll" class="roll-button" name="roll_luck_check" title="@{luck_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{luck}}} {{value=[[@{charluck}]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{charluck}]]}} {{roll=$[[1]]}}"></button>
<span class="label secondary-font" data-i18n="luck">Sorte</span>
<input name="attr_charluck" type="number" title="@{charluck}" value="0" />
<select class="select" name="attr_charluckmodoperator" title="@{luckmodoperator}">
<option value="*" selected="selected">x</option>
<option value="/">/</option>
</select>
<input name="attr_charluckmod" type="number" title="@{charluckmod}" value="0" />
<input name="attr_charluckfeatureeffect" type="text" readonly="true" title="@{charluckfeatureeffect}" />
<input name="attr_charluckdamage" type="number" title="@{charluckdamage}" value="0" />
<input name="attr_charlucktotal" type="number" disabled="true" title="@{charlucktotal}"
value="floor(@{charluck} @{charluckfeatureeffect}) - @{charluckdamage}" />
</div>
</div>
<div class="box flex-column">
<span class="box-title main-font" data-i18n="features">Características</span>
<div class="showhidebutton configtype corner-position">
<input type="checkbox" name="attr_features_showhide_checkbox" value="1" />
<span></span>
</div>
<!-- Hidden checkbox that controls show/hide section. See Sheet Workers-->
<input class="toggle-checkbox" type="checkbox" name="attr_features_showhide_checkbox_invisible" value="1" />
<div class="showhide">
<div class="select-hidden-grid">
<button type="action" class="add-button" name="act_ambidexterity"></button>
<span class="label secondary-font" data-i18n="ambidexterity">Ambidestria</span>
<button type="action" class="add-button" name="act_obvious_feature"></button>
<span class="label secondary-font" data-i18n="obvious_feature">Característica Óbvia</span>
<button type="action" class="add-button" name="act_contortion"></button>
<span class="label secondary-font" data-i18n="contortion" data-i18n-title="contortion-description"
title="Cada 2 níveis atribuí +1 de Esquiva">Contorcionismo</span>
<button type="action" class="add-button" name="act_slow_reflexes"></button>
<span class="label secondary-font" data-i18n="slow_reflexes" data-i18n-title="slow_reflexes-description"
title="Cada nível atribuí -1 de Esquiva">Reflexos Lentos</span>
<button type="action" class="add-button" name="act_fast_reflexes"></button>
<span class="label secondary-font" data-i18n="fast_reflexes" data-i18n-title="fast_reflexes-description"
title="Cada nível atribuí +1 de Esquiva">Reflexos Rápidos</span>
<button type="action" class="add-button" name="act_increased_senses"></button>
<span class="label secondary-font" data-i18n="increased_senses"
data-i18n-title="increased_senses-description" title="Cada nível atribuí +1 de Percepção">Sentidos
Ampliados</span>
<button type="action" class="add-button" name="act_reduced_senses"></button>
<span class="label secondary-font" data-i18n="reduced_senses" data-i18n-title="reduced_senses-description"
title="Cada nível atribuí -1 de Percepção">Sentidos Reduzidos</span>
<button type="action" class="add-button" name="act_increased_mind"></button>
<span class="label secondary-font" data-i18n="increased_mind" data-i18n-title="increased_mind-description"
title="Cada nível atribuí +1 de Mente">Ampliação Mental</span>
<button type="action" class="add-button" name="act_post"></button>
<span class="label secondary-font" data-i18n="post">Cargo</span>
<button type="action" class="add-button" name="act_readiness"></button>
<span class="label secondary-font" data-i18n="readiness">Prontidão</span>
<button type="action" class="add-button" name="act_reduced_mind"></button>
<span class="label secondary-font" data-i18n="reduced_mind" data-i18n-title="reduced_mind-description"
title="Cada nível atribuí -1 de Mente">Redução Mental</span>
<button type="action" class="add-button" name="act_strong_will"></button>
<span class="label secondary-font" data-i18n="strong_will" data-i18n-title="strong_will-description"
title="Cada nível atribuí +1 de Vontade">Vontade Forte</span>
<button type="action" class="add-button" name="act_weak_will"></button>
<span class="label secondary-font" data-i18n="weak_will" data-i18n-title="weak_will-description"
title="Cada nível atribuí -1 de Vontade">Vontade Fraca</span>
<button type="action" class="add-button" name="act_additional_limbs"></button>
<span class="label secondary-font" data-i18n="additional_limbs"
data-i18n-title="additional_limbs-description"
title="Cada dois níveis, atribuí a expressão “x(nível/2+1)” ao atributo Destreza. Adiciona seu (nível/2) ao número de ações físicas do personagem">Membros
Adicionais</span>
<button type="action" class="add-button" name="act_increased_size"></button>
<span class="label secondary-font" data-i18n="increased_size" data-i18n-title="increased_size-description"
title="Comprada a partir do nível 2. Atribuí a expressão “x(nível)” ao atributo Físico e gera nível-1 de penalidade à Esquiva.">Tamanho
Ampliado</span>
<button type="action" class="add-button" name="act_reduced_size"></button>
<span class="label secondary-font" data-i18n="reduced_size" data-i18n-title="reduced_size-description"
title="Comprada a partir do nível 2. Atribuí a expressão “/(nível)” ao atributo Físico e gera nível-1 de bônus à Esquiva.">Tamanho
Reduzido</span>
</div>
</div>
<div class="repeatable-grid features">
<span class="column-header secondary-font" data-i18n="feature">Característica</span>
<span class="column-header secondary-font" data-i18n="level">Nível</span>
<span class="column-header secondary-font" data-i18n="cost">Custo</span>
<div></div>
</div>
<input type="hidden" name="attr_features_total_cost" />
<fieldset class="repeating_features">
<div class="repeatable-item">
<div class="repeatable-grid features">
<input name="attr_feature" type="text" title="@{feature}" />
<input name="attr_featurelevel" type="text" title="@{featurelevel}" value="1" />
<input name="attr_featurecost" type="text" title="@{featurecost}" value="0" />
<input type="hidden" name="attr_featureid" />
<div class="showhidebutton arrowtype">
<input type="checkbox" name="attr_showhide_checkbox" value="1" />
<span></span>
</div>
</div>
<!-- Hidden checkbox that controls show/hide section. See Sheet Workers-->
<input class="toggle-checkbox" type="checkbox" name="attr_showhide_checkbox_invisible" value="1" />
<div class="showhide flex-column">
<span class="column-header secondary-font" data-i18n="description">Descrição</span>
<textarea name="attr_featuredescription" title="@{featuredescription}"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="box flex-column">
<span class="box-title main-font" data-i18n="powers">Poderes</span>
<div class="showhidebutton configtype corner-position">
<input type="checkbox" name="attr_powers_showhide_checkbox" value="1" />
<span></span>
</div>
<!-- Hidden checkbox that controls show/hide section. See Sheet Workers-->
<input class="toggle-checkbox" type="checkbox" name="attr_powers_showhide_checkbox_invisible" value="1" />
<div class="showhide">
<div class="select-hidden-grid">
<button type="action" class="add-button" name="act_increased_dexterity"></button>
<span class="label secondary-font" data-i18n="increased_dexterity"
data-i18n-title="increased_dexterity-description"
title="Comprada a partir do nível 2. Atribuí a expressão “x(nível)” ao atributo Destreza. Adiciona seu (nível-1) ao número de ações físicas do personagem.">Ampliação
de Destreza</span>
<button type="action" class="add-button" name="act_increased_physical"></button>
<span class="label secondary-font" data-i18n="increased_physical"
data-i18n-title="increased_physical-description"
title="Comprada a partir do nível 2. Atribuí a expressão “x(nível)” ao atributo Físico">Ampliação de
Físico</span>
<button type="action" class="add-button" name="act_increased_intelligence"></button>
<span class="label secondary-font" data-i18n="increased_intelligence"
data-i18n-title="increased_intelligence-description"
title="Comprada a partir do nível 2. Atribuí a expressão “x(nível)” ao atributo Inteligência. Adiciona seu (nível-1) ao número de ações mentais do personagem.">Ampliação
de Inteligência</span>
<button type="action" class="add-button" name="act_reduced_dexterity"></button>
<span class="label secondary-font" data-i18n="reduced_dexterity"
data-i18n-title="reduced_dexterity-description"
title="Comprada a partir do nível 2. Atribuí a expressão “/(nível)” ao atributo Destreza">Redução de
Destreza</span>
<button type="action" class="add-button" name="act_reduced_physical"></button>
<span class="label secondary-font" data-i18n="reduced_physical"
data-i18n-title="reduced_physical-description"
title="Comprada a partir do nível 2. Atribuí a expressão “/(nível)” ao atributo Físico">Redução de
Físico</span>
<button type="action" class="add-button" name="act_reduced_intelligence"></button>
<span class="label secondary-font" data-i18n="reduced_intelligence"
data-i18n-title="reduced_dexterity-description"
title="Comprada a partir do nível 2. Atribuí a expressão “/(nível)” ao atributo Inteligência">Redução de
Inteligência</span>
</div>
</div>
<div class="repeatable-grid powers">
<span class="column-header secondary-font" data-i18n="name">Nome</span>
<span class="column-header secondary-font" data-i18n="level">Nível</span>
<span class="column-header secondary-font" data-i18n="cost">Custo</span>
<div></div>
</div>
<input type="hidden" name="attr_powers_total_cost" />
<fieldset class="repeating_powers">
<div class="repeatable-item">
<div class="repeatable-grid powers">
<input name="attr_power" type="text" title="@{power}" />
<input name="attr_powerlevel" type="text" title="@{powerlevel}" value="1" />
<input name="attr_powercost" type="text" title="@{powercost}" value="0" />
<input type="hidden" name="attr_powerid" />
<div class="showhidebutton arrowtype">
<input type="checkbox" name="attr_showhide_checkbox" value="1" />
<span></span>
</div>
</div>
<!-- Hidden checkbox that controls show/hide section. See Sheet Workers-->
<input class="toggle-checkbox" type="checkbox" name="attr_showhide_checkbox_invisible" value="1" />
<div class="showhide flex-column">
<span class="column-header secondary-font" data-i18n="description">Descrição</span>
<textarea name="attr_powerdescription" title="@{powerdescription}"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="box flex-column">
<span class="box-title main-font" data-i18n="equipments">Equipamentos</span>
<fieldset class="repeating_equipments">
<div class="repeatable-item">
<div class="repeatable-row">
<input name="attr_equipment" type="text" data-i18n-placeholder="equipment" placeholder="Equipamento"
title="@{equipment}" />
<div class="showhidebutton arrowtype">
<input type="checkbox" name="attr_showhide_checkbox" value="1" />
<span></span>
</div>
</div>
<!-- Hidden checkbox that controls show/hide section. See Sheet Workers-->
<input class="toggle-checkbox" type="checkbox" name="attr_showhide_checkbox_invisible" value="1" />
<div class="showhide flex-column">
<span class="column-header secondary-font" data-i18n="description">Descrição</span>
<textarea name="attr_equipmentdescription" title="@{equipmentdescription}"></textarea>
</div>
</div>
</fieldset>
</div>
</div>
<!-- Middle column 2 -->
<div class="middle-column">
<div class="box flex-column">
<span class="box-title main-font" data-i18n="contact_weapons">Armas de contato</span>
<div class="repeatable-grid contact-weapons">
<span class="column-header secondary-font" data-i18n="weapon">Arma</span>
<span class="column-header secondary-font" data-i18n="level">Nível</span>
<span class="column-header secondary-font" data-i18n="damage">Dano</span>
<span class="column-header secondary-font" data-i18n="blow">Golpe</span>
<span class="column-header secondary-font" data-i18n="parry">Aparo</span>
<div></div>
</div>
<div class="repeatable-grid contact-weapons">
<input class="row-item-margin" readonly="true" name="attr_fight_name" type="text" title="@{fight_name}"
data-i18n-placeholder="fight" placeholder="Briga" />
<input class="row-item-margin" readonly="true" name="attr_fightlevel" type="text" title="@{fightlevel}" value="0" />
<input class="weapons-damage-total" readonly="true" name="attr_fightdamagetotal" type="text"
title="@{fightdamagetotal}" value="0" />
<div class="weapons-subheader-grid">
<div></div>
<input class="weapons-base" disabled="true" name="attr_fightblowtotal" type="text"
title="@{fightblowtotal}" value="@{fightblow} + (@{chardexterity} @{weaponeffect})" />
<button type="roll" class="roll-button" name="roll_fightblow_check" title="@{fightblow_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{fight} - @{blow}}} {{value=[[@{fightblow} + (@{chardexterity} @{weaponeffect})]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{fightblow} + (@{chardexterity} @{weaponeffect}) ]] }} {{roll=$[[1]]}} {{damage=[[@{fightdamagetotal}]]}} {{bodyroll=[[2d6cs0cf0]]}}"></button>
</div>
<div class="weapons-subheader-grid">
<div></div>
<input class="weapons-base" disabled="true" name="attr_fightparrytotal" type="text"
title="@{fightparrytotal}" value="@{fightparry} + (@{chardexterity} @{weaponeffect})" />
<button type="roll" class="roll-button" name="roll_fightparry_check" title="@{fightparry_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{fight} - @{parry}}} {{value=[[@{fightparry} + (@{chardexterity} @{weaponeffect})]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{fightparry} + (@{chardexterity} @{weaponeffect}) ]] }} {{roll=$[[1]]}}"></button>
</div>
<div class="showhidebutton arrowtype">
<input type="checkbox" name="attr_fight_showhide_checkbox" value="1" />
<span></span>
</div>
</div>
<!-- Hidden checkbox that controls show/hide section. See Sheet Workers-->
<input class="toggle-checkbox" type="checkbox" name="attr_fight_showhide_checkbox_invisible" value="1" />
<div class="showhide flex-column">
<div class="repeatable-grid contact-weapons-hidden">
<div>
<span class="column-header secondary-font" data-i18n="damage">Dano</span>
<div class="weapons-subheader-grid">
<span class="column-subheader secondary-font" data-i18n="base">Base</span>
<span class="column-subheader secondary-font" data-i18n="total">Total</span>
</div>
</div>
<div>
<span class="column-header secondary-font" data-i18n="blow">Golpe</span>
<div class="weapons-subheader-grid">
<span class="column-subheader secondary-font" data-i18n="base">Base</span>
<span class="column-subheader secondary-font" data-i18n="total">Total</span>
</div>
</div>
<div>
<span class="column-header secondary-font" data-i18n="parry">Aparo</span>
<div class="weapons-subheader-grid">
<span class="column-subheader secondary-font" data-i18n="base">Base</span>
<span class="column-subheader secondary-font" data-i18n="total">Total</span>
</div>
</div>
<div class="weapons-subheader-grid">
<input class="weapons-damage-base" readonly="true" name="attr_fightdamage" type="text"
title="@{fightdamage}" value="d2-1" />
<input class="weapons-damage-total" readonly="true" name="attr_fightdamagetotal" type="text"
title="@{fightdamagetotal}" value="0" />
</div>
<div class="weapons-subheader-grid">
<input class="weapons-damage-base" readonly="true" name="attr_fightblow" type="text"
title="@{fightblow}" value="0" />
<input class="weapons-damage-total" disabled="true" name="attr_fightblowtotal" type="text"
title="@{fightblowtotal}" value="@{fightblow} + (@{chardexterity} @{weaponeffect})" />
</div>
<div class="weapons-subheader-grid">
<input class="weapons-damage-base" readonly="true" name="attr_fightparry" type="text"
title="@{fightparry}" value="0" />
<input class="weapons-damage-total" disabled="true" name="attr_fightparrytotal" type="text"
title="@{fightparrytotal}" value="@{fightparry} + (@{chardexterity} @{weaponeffect})" />
</div>
</div>
</div>
<input type="hidden" name="attr_weaponeffect" value="+0" />
<fieldset class="repeating_contactweapons">
<div class="repeatable-item">
<div class="repeatable-grid contact-weapons">
<input class="row-item-margin" name="attr_weaponname" type="text" title="@{weaponname}" />
<input class="row-item-margin" name="attr_weaponlevel" type="text" title="@{weaponlevel}" value="0" />
<input class="weapons-damage-total" readonly="true" name="attr_weapondamagetotal" type="text"
title="@{weapondamagetotal}" value="0" />
<div class="weapons-subheader-grid">
<div></div>
<input class="weapons-base" name="attr_weaponblowtotal" type="text" title="@{weaponblowtotal}"
disabled="true"
value="@{weaponlevel} + @{weaponblow} + (@{chardexterity} @{weaponeffect})" />
<button type="roll" class="roll-button" name="roll_weaponblow_check" title="@{weaponblow_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{weaponname} - @{blow}}} {{value=[[@{weaponblowtotal}]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{weaponblowtotal} ]] }} {{roll=$[[1]]}} {{damage=[[@{weapondamagetotal}]]}} {{bodyroll=[[2d6cs0cf0]]}}"></button>
</div>
<div class="weapons-subheader-grid">
<div></div>
<input class="weapons-base" name="attr_weaponparrytotal" type="text" title="@{weaponparrytotal}"
disabled="true"
value="@{weaponlevel} + @{weaponparry} + (@{chardexterity} @{weaponeffect})" />
<button type="roll" class="roll-button" name="roll_weaponparry_check" title="@{weaponparry_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{weaponname} - @{parry}}} {{value=[[@{weaponparrytotal}]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{weaponparrytotal} ]] }} {{roll=$[[1]]}}"></button>
</div>
<div class="showhidebutton arrowtype">
<input type="checkbox" name="attr_showhide_checkbox" value="1" />
<span></span>
</div>
</div>
<!-- Hidden checkbox that controls show/hide section. See Sheet Workers-->
<input class="toggle-checkbox" type="checkbox" name="attr_showhide_checkbox_invisible" value="1" />
<div class="showhide flex-column">
<div class="repeatable-grid contact-weapons-hidden">
<div>
<span class="column-header secondary-font" data-i18n="damage">Dano</span>
<div class="weapons-subheader-grid">
<span class="column-subheader secondary-font" data-i18n="base">Base</span>
<span class="column-subheader secondary-font" data-i18n="total">Total</span>
</div>
</div>
<div>
<span class="column-header secondary-font" data-i18n="blow">Golpe</span>
<div class="weapons-subheader-grid">
<span class="column-subheader secondary-font" data-i18n="base">Base</span>
<span class="column-subheader secondary-font" data-i18n="total">Total</span>
</div>
</div>
<div>
<span class="column-header secondary-font" data-i18n="parry">Aparo</span>
<div class="weapons-subheader-grid">
<span class="column-subheader secondary-font" data-i18n="base">Base</span>
<span class="column-subheader secondary-font" data-i18n="total">Total</span>
</div>
</div>
<div class="weapons-subheader-grid">
<input class="weapons-damage-base" name="attr_weapondamage" type="text" title="@{weapondamage}"
value="0" />
<input class="weapons-damage-total" readonly="true" name="attr_weapondamagetotal" type="text"
title="@{weapondamagetotal}" value="0" />
</div>
<div class="weapons-subheader-grid">
<input class="weapons-damage-base" name="attr_weaponblow" type="text" title="@{weaponblow}"
value="0" />
<input class="weapons-damage-total" name="attr_weaponblowtotal" type="text"
title="@{weaponblowtotal}" disabled="true"
value="@{weaponlevel} + @{weaponblow} + (@{chardexterity} @{weaponeffect})" />
</div>
<div class="weapons-subheader-grid">
<input class="weapons-damage-base" name="attr_weaponparry" type="text" title="@{weaponparry}"
value="0" />
<input class="weapons-damage-total" name="attr_weaponparrytotal" type="text"
title="@{weaponparrytotal}" disabled="true"
value="@{weaponlevel} + @{weaponparry} + (@{chardexterity} @{weaponeffect})" />
</div>
</div>
<span class="column-header secondary-font" data-i18n="description">Descrição</span>
<textarea name="attr_weapondescription" title="@{weapondescription}"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="box flex-column">
<span class="box-title main-font" data-i18n="long_range_weapons">Armas de Longo Alcance</span>
<div class="repeatable-grid long-range-weapons">
<span class="column-header secondary-font" data-i18n="weapon">Arma</span>
<span class="column-header secondary-font" data-i18n="level">Nível</span>
<span class="column-header secondary-font" data-i18n="damage">Dano</span>
<span class="column-header secondary-font" data-i18n="fast_shot">Tiro Rápido</span>
<span class="column-header secondary-font" data-i18n="aimed_shot">Tiro Mirado</span>
<div></div>
</div>
<input type="hidden" name="attr_weaponeffect" value="+0" />
<fieldset class="repeating_longrangeweapons">
<div class="repeatable-item">
<div class="repeatable-grid long-range-weapons">
<input class="row-item-margin" name="attr_weaponname" type="text" title="@{weaponname}" />
<input class="row-item-margin" name="attr_weaponlevel" type="text" title="@{weaponlevel}" value="0" />
<input class="weapons-damage-total" name="attr_weapondamagetotal" type="text"
title="@{weapondamagetotal}" />
<div class="weapons-die-label">
<input class="row-item-margin" name="attr_weaponfastshot" type="number" title="@{weaponfastshot}"
value="0" />
<button type="roll" class="roll-button" name="roll_weaponfastshot_check"
title="@{weaponfastshot_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{weaponname} - @{fast_shot}}} {{value=[[@{chardexterity} + @{weaponlevel} + @{weaponfastshot}]]}} {{dispute=[[ [[2d6cs<5cf>2]] + @{chardexterity} + @{weaponlevel} + @{weaponfastshot} ]] }} {{roll=$[[1]]}} {{damage=[[@{weapondamagetotal}]]}} {{bodyroll=[[2d6cs0cf0]]}}"></button>
</div>
<div class="weapons-die-label">
<input class="row-item-margin" name="attr_weaponaimedshot" type="number" title="@{weaponaimedshot}"
value="0" />
<button type="roll" class="roll-button" name="roll_weaponaimedshot_check"
title="@{weaponaimedshot_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{weaponname} - @{aimed_shot}}} {{value=[[@{chardexterity} + @{weaponlevel} + @{weaponaimedshot}]]}} {{dispute=[[ [[2d6cs<5cf>2]] + @{chardexterity} + @{weaponlevel} + @{weaponaimedshot} ]] }} {{roll=$[[1]]}} {{damage=[[@{weapondamagetotal}]]}} {{bodyroll=[[2d6cs0cf0]]}}"></button>
</div>
<div class="showhidebutton arrowtype">
<input type="checkbox" name="attr_showhide_checkbox" value="1" />
<span></span>
</div>
</div>
<!-- Hidden checkbox that controls show/hide section. See Sheet Workers-->
<input class="toggle-checkbox" type="checkbox" name="attr_showhide_checkbox_invisible" value="1" />
<div class="showhide flex-column">
<div class="repeatable-grid long-range-weapons-hidden">
<span class="column-header secondary-font" data-i18n="shots">Carga</span>
<span class="column-header secondary-font" data-i18n="reload_actions">Ações de Recarga</span>
<span class="column-header secondary-font" data-i18n="range">Alcance</span>
<span class="column-header secondary-font" data-i18n="rate_of_fire">Cad</span>
<input class="row-item-margin" name="attr_weaponrshots" type="number" title="@{weaponshots}" />
<input class="row-item-margin" name="attr_weaponreloadactions" type="number"
title="@{weaponreloadactions}" />
<input class="row-item-margin" name="attr_weaponrange" type="text" title="@{weaponrange}" />
<input class="row-item-margin" name="attr_weaponrateoffire" type="text" title="@{weaponrateoffire}" />
</div>
<span class="column-header secondary-font" data-i18n="description">Descrição</span>
<textarea name="attr_weapondescription" title="@{weapondescription}"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="box flex-column">
<span class="box-title main-font" data-i18n="protection">Proteção</span>
<div class="repeatable-grid protection">
<span class="column-header secondary-font" data-i18n="name">Nome</span>
<span class="column-header secondary-font" data-i18n="protected_areas">Áreas Protegidas</span>
<span class="column-header secondary-font absortion" data-i18n="absortion">Absorção</span>
<span class="column-header secondary-font" data-i18n="penalty">Penalidade</span>
<div></div>
</div>
<fieldset class="repeating_protection">
<div class="repeatable-item">
<div class="repeatable-grid protection">
<input class="row-item-margin" name="attr_protectionname" type="text" title="@{protectionname}" />
<input class="row-item-margin" name="attr_protectionprotectedareas" type="text"
title="@{protectionprotectedarreas}" />
<div class="flex-row">
<input class="row-item-margin" name="attr_protectionnormalabsortion" type="number"
title="@{protectionnormalabsortion}" />
<span class="row-item-margin">/</span>
<input class="row-item-margin" name="attr_protectionhighabsortion" type="number"
title="@{protectionhighabsortion}" />
</div>
<input class="row-item-margin" name="attr_protectionpenalty" type="number" title="@{protectionpenalty}"
value="0" />
<div class="showhidebutton arrowtype">
<input type="checkbox" name="attr_showhide_checkbox" value="1" />
<span></span>
</div>
</div>
<!-- Hidden checkbox that controls show/hide section. See Sheet Workers-->
<input class="toggle-checkbox" type="checkbox" name="attr_showhide_checkbox_invisible" value="1" />
<div class="showhide flex-column">
<span class="column-header secondary-font" data-i18n="description">Descrição</span>
<textarea name="attr_protectiondescription" title="@{protectiondescription}"></textarea>
</div>
</div>
</fieldset>
<div class="penalty">
<span class="column-header secondary-font" data-i18n="totalpenalty">Penalidade Total</span>
<input class="row-item-margin" name="attr_totalpenalty" readonly type="number" title="@{totalpenalty}" />
</div>
</div>
<div class="box flex-column">
<span class="box-title main-font" data-i18n="skills">Habilidades</span>
<div class="repeatable-grid skills">
<div></div>
<span class="column-header secondary-font" data-i18n="skill">Habilidade</span>
<span class="column-header secondary-font" data-i18n="attribute">Atributo</span>
<span class="column-header secondary-font" data-i18n="level">Nível</span>
<span class="column-header secondary-font" data-i18n="cost">Custo</span>
<span class="column-header secondary-font" data-i18n="total">Total</span>
<div></div>
</div>
<div class="repeatable-grid skills">
<button type="roll" class="roll-button" name="roll_fight_check" title="@{fight_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{fight}}} {{value=[[@{fighttotal}]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{fighttotal}]]}} {{roll=$[[1]]}}"></button>
<input class="row-item-margin" readonly="true" name="attr_fight_name" type="text" title="@{fight_name}"
data-i18n-placeholder="fight" placeholder="Briga" />
<span class="secondary-font" data-i18n="dexterity">Destreza</span>
<input class="row-item-margin" name="attr_fightlevel" type="text" title="@{fightlevel}" value="0" />
<input class="row-item-margin" name="attr_fightcost" type="text" readonly title="@{fightcost}" value="0" />
<input class="row-item-margin" name="attr_fighttotal" type="number" readonly title="@{fighttotal}"
value="0" />
<div>
</div>
</div>
<input type="hidden" name="attr_skills_total_cost" />
<fieldset class="repeating_skills">
<div class="repeatable-item">
<div class="repeatable-grid skills">
<button type="roll" class="roll-button" name="roll_skill_check" title="@{skill_check}"
value="&{template:main} {{charname=@{character_name}}} {{action=@{skill}}} {{value=[[@{skilltotal}]]}} {{dispute=[[ [[2d6cs>2cf<5]] + @{skilltotal}]]}} {{roll=$[[1]]}}"></button>
<input class="row-item-margin" name="attr_skill" type="text" title="@{skill}" />
<select class="select row-item-margin" name="attr_skillattribute" title="@{skillattribute}">
<option value="charphysique" data-i18n="physique" selected="selected">Físico</option>
<option value="chardexterity" data-i18n="dexterity">Destreza</option>
<option value="charintelligence" data-i18n="intelligence">Inteligência</option>
<option value="charwill" data-i18n="will">Vontade</option>
<option value="charmind" data-i18n="mind">Mente</option>
<option value="charmagic" data-i18n="magic">Magia</option>
<option value="charperception" data-i18n="perception">Percepção</option>
<option value="charluck" data-i18n="luck">Sorte</option>
</select>
<input class="row-item-margin" name="attr_skilllevel" type="text" title="@{skilllevel}" value="1" />
<input class="row-item-margin" name="attr_skillcost" type="text" readonly title="@{skillcost}"
value="1" />
<input class="row-item-margin" name="attr_skilltotal" type="number" readonly
title="@{skilltotal}" value="0" />
<div class="showhidebutton arrowtype">
<input type="checkbox" name="attr_showhide_checkbox" value="1" />
<span></span>
</div>
</div>
<!-- Hidden checkbox that controls show/hide section. See Sheet Workers-->
<input class="toggle-checkbox" type="checkbox" name="attr_showhide_checkbox_invisible" value="1" />
<div class="showhide flex-column">
<span class="column-header secondary-font" data-i18n="description">Descrição</span>
<textarea name="attr_skilldescription" title="@{skilldescription}"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="experience-points">
<span class="label secondary-font" data-i18n="experience_points">Pontos de Experiência</span>
<input class="bigger-number-input" name="attr_xp" type="number" title="@{xp}" />
</div>
</div>
</div>
<div class="box flex-column">
<span class="box-title main-font" data-i18n="notes">Anotações</span>
<textarea name="attr_notes" title="@{notes}"></textarea>
</div>
</div>
<!-- Journal Tab -->
<div class='journaltab'>
<h2>Journal/Notes</h2>
<span>Journal/Notes Stuff Goes here</span>
</div>
<!-- Config tab-->
<div class='configurationtab'>
<h2>Config/Settings</h2>
<span>Sheet Config/Settings goes here</span>
</div>
<!-- Footer -->
<div class="footer secondary-font">
<span data-i18n="copyright">Copyright OPERA RPG © 2020. Todos os direitos reservados.</span>
</div>
</div>
<!-- end of sheet -->
<!-- Roll Templates -->
<rolltemplate class="sheet-rolltemplate-main">
<div class="template-container">
<div class="template-row template-header template-label secondary-font">
{{charname}}
</div>
{{#action}}
<div class="template-row">
<span class="template-label secondary-font">{{action}}: {{value}}</span>
{{#text}}
<p>{{text}}</p>
{{/text}}
</div>
{{/action}}
{{#roll}}
<div class="template-row">
<span class="template-label secondary-font" data-i18n="roll">Rolagem</span>
{{roll}}
</div>
{{/roll}}
{{#dispute}}
<div class="template-row">
<span class="template-label secondary-font" data-i18n="dispute_test">Teste de Disputa</span>
{{dispute}}
</div>
{{/dispute}}
{{#damage}}
<div class="template-row">
<span class="template-label secondary-font" data-i18n="damage">Dano</span>
{{damage}}
</div>
{{/damage}}
{{#bodyroll}}
<div class="template-row">
<span class="template-label secondary-font" data-i18n="body_area">Área do Corpo Atingida</span>
{{bodyroll}}
{{#rollBetween() bodyroll 11 12}}
<span class="template-label secondary-font" data-i18n="head_a">Cabeça(A)</span>
{{/rollBetween() bodyroll 11 12}}
{{#rollTotal() bodyroll 2}}
<span class="template-label secondary-font" data-i18n="heart_b">Coração(B)</span>
{{/rollTotal() bodyroll 2}}
{{#rollBetween() bodyroll 6 8}}
<span class="template-label secondary-font" data-i18n="belly_c">Barriga(C)</span>
{{/rollBetween() bodyroll 6 8}}
{{#rollTotal() bodyroll 3}}
<span class="template-label secondary-font" data-i18n="sensitive_parts_d">Partes sensíveis(D)</span>
{{/rollTotal() bodyroll 3}}
{{#rollTotal() bodyroll 4}}
<span class="template-label secondary-font" data-i18n="right_arm_e">Braço direito(E)</span>
{{/rollTotal() bodyroll 4}}
{{#rollTotal() bodyroll 10}}
<span class="template-label secondary-font" data-i18n="left_arm_f">Braço esquerdo(F)</span>
{{/rollTotal() bodyroll 10}}
{{#rollTotal() bodyroll 5}}
<span class="template-label secondary-font" data-i18n="right_leg_f">Perna direita(G)</span>
{{/rollTotal() bodyroll 5}}
{{#rollTotal() bodyroll 9}}
<span class="template-label secondary-font" data-i18n="left_leg_h">Perna esquerda(H)</span>
{{/rollTotal() bodyroll 9}}
</div>
{{/bodyroll}}
</div>
</rolltemplate>
<!-- Strings translations for Roll Queries-->
<div style="display: none;">
<span data-i18n="no">Não</span>
<span data-i18n="result">Resultado</span>
<span data-i18n="check">Teste</span>
<span data-i18n="normal">Normal</span>
<span data-i18n="contest">Disputa</span>
<span data-i18n="normalorcontest">Normal ou Disputa?</span>
<span data-i18n="head_a">Cabeça(A)</span>
<span data-i18n="heart_b">Coração(B)</span>
<span data-i18n="belly_c">Barriga(C)</span>
<span data-i18n="sensitive_parts_d">Partes sensíveis(D)</span>
<span data-i18n="right_arm_e">Braço direito(E)</span>
<span data-i18n="left_arm_f">Braço esquerdo(F)</span>
<span data-i18n="right_leg_f">Perna direita(G)</span>
<span data-i18n="left_leg_h">Perna esquerda(H)</span>
</div>
<!--Sheet Workers -->
<script type="text/worker">
const buttonlist = ["profile","journal","configuration"];
/*config tabs control */
buttonlist.forEach(button => {
on(`clicked:${button}`, function() {
setAttrs({
tabcontrol: button
});
});
});
/*Controls show hide checkbox button from repeating sections*/
on("change:repeating_equipments:showhide_checkbox " +
"change:repeating_contactweapons:showhide_checkbox " +
"change:repeating_longrangeweapons:showhide_checkbox " +
"change:repeating_protection:showhide_checkbox " +
"change:repeating_skills:showhide_checkbox " +
"change:powers_showhide_checkbox " +
"change:repeating_powers:showhide_checkbox " +
"change:features_showhide_checkbox " +
"change:fight_showhide_checkbox " +
"change:repeating_features:showhide_checkbox" , function(eventInfo) {
let source = eventInfo.sourceAttribute;
let changeAttributes = new Object();
let targetId = source + '_invisible';
changeAttributes[targetId] = eventInfo.newValue;
setAttrs(changeAttributes);
});
function setRollTotal(factors, target) {
getAttrs(factors, values => {
let total = '';
let out = {};
for (let i = 0; i < factors.length; i++) {
let v = factors[i];
total += `(${values[v]})`;
if ((i+1) != factors.length) {
total += '+';
}
}
console.log('total');
console.log(total);
out[target] = total;
setAttrs(out);
});
}
/*Controlling fight damage total*/
on('sheet:opened change:fightdamage change:physicaldamage', function(eventInfo) {
setRollTotal(['fightdamage', 'physicaldamage'], 'fightdamagetotal');
});
/*Controlling contact weapons damage total*/
on('change:repeating_contactweapons:weapondamage change:physicaldamage', function(eventInfo) {
console.log('weapon damage total');
/* recovering all weapons IDs */
getSectionIDs(`repeating_contactweapons`, idArray => {
idArray.forEach(id => {
setRollTotal([`repeating_contactweapons_${id}_weapondamage`, 'physicaldamage'], `repeating_contactweapons_${id}_weapondamagetotal`);
});
});
});
/* calculating physical damage */
on('sheet:opened change:charphysique change:charphysicalfeatureeffect', function(eventInfo) {
getAttrs(['charphysique', 'charphysicalfeatureeffect'], values => {
let parse = '';
let factor = 0;
let total = 0;
parse += values.charphysique;
parse += values.charphysicalfeatureeffect;
factor = Math.floor(eval(parse));
total = Math.floor(factor/8);
console.log(`physical damage total: ${total}`);
setAttrs({
physicaldamage: total
});
});
});
//Repeating Sum [https://wiki.roll20.net/RepeatingSum]
const repeatingSum = (destinations, section, fields) => {
if (!Array.isArray(destinations)) destinations = [destinations.replace(/\s/g, '').split(',')];
if (!Array.isArray(fields)) fields = [fields.replace(/\s/g, '').split(',')];
getSectionIDs(`repeating_${section}`, idArray => {
const attrArray = idArray.reduce((m, id) => [...m, ...(fields.map(field => `repeating_${section}_${id}_${field}`))], []);
getAttrs([...attrArray], v => {
const getValue = (section, id, field) => v[`repeating_${section}_${id}_${field}`] === 'on' ? 1 : parseFloat(v[`repeating_${section}_${id}_${field}`]) || 0;
const commonMultipliers = (fields.length <= destinations.length) ? [] : fields.splice(destinations.length, fields.length - destinations.length);
const output = {};
destinations.forEach((destination, index) => {
output[destination] = idArray.reduce((total, id) => total + getValue(section, id, fields[index]) * commonMultipliers.reduce((subtotal, mult) => subtotal * getValue(section, id, mult), 1), 0);
});
setAttrs(output);
});
});
};
/* calculating total protection penalty */
on('sheet:opened change:repeating_protection remove:repeating_protection', function() {
repeatingSum("totalpenalty","protection", "protectionpenalty");
});
/* Declaring a Cost Object to be used on creation points calculation */
function Cost(negative, positive) {
this.negative = negative;
this.positive = positive;
}
/* calculates total Cost of a repeating section */
function calculateCost(section, field, total) {
getSectionIDs(section, idArray => {
const fields = idArray.map(id => `${section}_${id}_${field}`);
getAttrs(fields, function(values) {
console.log(`begin calc Cost for ${total} `);
let out = {};
out[total] = new Cost(0,0);
for (let key in values) {
let parsedValue = parseInt(values[key])||0;
if (parsedValue > 0) {
out[total].positive += parsedValue;
} else {
out[total].negative += parsedValue;
}
}
console.log(out);
setAttrs(out);
});
});
}
function getIntValue(value) {
return parseInt(value)||0;
}
/* calculating total creation points */
on('sheet:opened change:fightcost ' +
'change:powers_total_cost ' +
'change:skills_total_cost ' +
'change:features_total_cost'
, function() {
getAttrs(['fightcost', 'powers_total_cost', 'skills_total_cost', 'features_total_cost'], values =>{
let totalNegative = 0;
let totalPositive = 0;
console.log('begin calc creation points');
for (let key in values) {
v = values[key];
console.log(v);
if (v.positive !== undefined) {
totalPositive += getIntValue(v.positive);
totalNegative += getIntValue(v.negative);
} else {
/*if it doesn't have the positive property, than it is the simple fightcost value */
totalPositive += getIntValue(v);
}
}
/* each negative point beyond -10 costs half rounded down.
* Ex: -15 has -5 past -10, so -15 will be (-10) + (-5/2) = -10 -2 = -12.
*/
if (totalNegative < -10) {
totalNegative = -10 + Math.floor((totalNegative+10)/2);
}
/* the max negative cost is -20 */
if (totalNegative < -20) {
totalNegative = -20;
}
console.log(`total negative = ${totalNegative}`);
console.log(`total positive = ${totalPositive}`);
setAttrs({
used_creation_points: totalPositive+totalNegative
});
});
});
/* calculating total powers cost */
on('sheet:opened change:repeating_powers remove:repeating_powers', function() {
calculateCost("repeating_powers", "powercost", "powers_total_cost");
});
/* calculating total skills cost */
on('sheet:opened change:repeating_skills remove:repeating_skills', function() {
calculateCost("repeating_skills", "skillcost", "skills_total_cost");
});
/* calculating total features cost */
on('sheet:opened change:repeating_features remove:repeating_features', function() {
calculateCost("repeating_features", "featurecost", "features_total_cost");
});
function getSkillCost(skillLevel) {
let skillCost = 0;
/* the skill cost value is equal to the sum of the level plus all levels before */
for(let i=1; i<=skillLevel; i++) {
skillCost += i;
}
return skillCost;
}
/* controlling skill cost due to skill level selection */
on('change:repeating_skills:skilllevel', function(eventInfo) {
const skillLevel = eventInfo.newValue;
let skillCost = getSkillCost(skillLevel);
setAttrs({
repeating_skills_skillcost: skillCost
});
});
/*sets a skill total. If the total exceeds 14, sets the maximum 14 */
function setSkillTotal(attributeField, levelField, totalField) {
getAttrs([attributeField, levelField], function(values) {
let total = 0;
let target = {};
total += parseInt(values[attributeField])||0;
total += parseInt(values[levelField])||0;
console.log(total);
target[totalField] = total > 14? 14 : total;
setAttrs(target);
});
}
/* setting the Fight Skill Total */
on('change:chardexterity change:fightlevel', function(eventInfo) {
setSkillTotal('chardexterity', 'fightlevel', 'fighttotal');
});
/* Since the repeating_skills skillattribute has changed from @{attributeName} to
* simply attributeName, this parse is needed to make the skill total calc worker
* with old sheets */
function parseAttributeName(attrName) {
let ret = attrName.replace('@{','').replace('}','');
return ret;
}
/* setting skill total */
on('change:repeating_skills:skillattribute change:repeating_skills:skilllevel ' +
'change:charphysique '+
'change:chardexterity '+
'change:charintelligence '+
'change:charperception '+
'change:charwill '+
'change:charmind '+
'change:charmagic '+
'change:charluck '
, function(eventInfo) {
/* recovering all skills IDs */
getSectionIDs(`repeating_skills`, idArray => {
idArray.forEach(id => {
/*recovering skill attribute name */
getAttrs([`repeating_skills_${id}_skillattribute`], values => {
let attrName = parseAttributeName(values[`repeating_skills_${id}_skillattribute`]);
setSkillTotal(attrName, `repeating_skills_${id}_skilllevel` , `repeating_skills_${id}_skilltotal`)
});
});
});
});
const fightParameters = [
{
fightblow: 0,
fightparry: 0,
fightdodgebonus: 0,
fightdamage: 'd2-1'
},
{
fightblow: 1,
fightparry: 1,
fightdodgebonus: 1,
fightdamage: 'd2-1'
},
{
fightblow: 2,
fightparry: 2,
fightdodgebonus: 2,
fightdamage: 'd2-1'
},
{
fightblow: 2,
fightparry: 2,
fightdodgebonus: 2,
fightdamage: '1'
},
{
fightblow: 3,
fightparry: 3,
fightdodgebonus: 3,
fightdamage: '1'
},
{
fightblow: 4,
fightparry: 4,
fightdodgebonus: 4,
fightdamage: '1'
},
{
fightblow: 4,
fightparry: 4,
fightdodgebonus: 4,
fightdamage: '1'
}
];
/* controlling fight cost, damage, dodge, parry and blow due to fight level selection */
on('change:fightlevel', function(eventInfo) {
const skillLevel = eventInfo.newValue;
out = {};
let skillCost = getSkillCost(skillLevel);
/* fight levels beyond 6 give no more bonus, so we have to use the level 6 bonus */
let fightParams = skillLevel>6 ? fightParameters[6]:fightParameters[skillLevel];
out.fightcost = skillCost;
out = Object.assign(out, fightParams);
setAttrs(out);
});
/*config Roll Queries translations */
on("sheet:opened", function(eventInfo){
setAttrs({
no: getTranslationByKey("no"),
result: getTranslationByKey("result"),
check: getTranslationByKey("check"),
normal: getTranslationByKey("normal"),
contest: getTranslationByKey("contest"),
normalorcontest: getTranslationByKey("normalorcontest"),
modifier: getTranslationByKey("modifier"),
physique: getTranslationByKey("physique"),
dexterity: getTranslationByKey("dexterity"),
intelligence: getTranslationByKey("intelligence"),
will: getTranslationByKey("will"),
mind: getTranslationByKey("mind"),
magic: getTranslationByKey("magic"),
perception: getTranslationByKey("perception"),
luck: getTranslationByKey("luck"),
fast_shot: getTranslationByKey("fast_shot"),
aimed_shot: getTranslationByKey("aimed_shot"),
parry: getTranslationByKey("parry"),
blow: getTranslationByKey("blow"),
initiative: getTranslationByKey("initiative"),
dodge: getTranslationByKey("dodge"),
fight: getTranslationByKey("fight"),
});
});
const OperationEnum = {
SUM: 0,
MULT: 1
};
/* Configuring all the fields that have an effect applied
For the effect fields from the attributes, you have to specify the name of the mod field on the attributeMod property.
*/
const effectsTargets = {
charperceptionfeatureeffect: {
attributeMod: 'charperceptionmod'
},
charphysicalfeatureeffect: {
attributeMod: 'charphysiquemod'
},
chardexterityfeatureeffect: {
attributeMod: 'chardexteritymod'
},
charintelligencefeatureeffect: {
attributeMod: 'charintelligencemod'
},
charwillfeatureeffect: {
attributeMod: 'charwillmod'
},
charmindfeatureeffect: {
attributeMod: 'charmindmod'
},
charmagicfeatureeffect: {
attributeMod: 'charmagicmod'
},
charluckfeatureeffect: {
attributeMod: 'charluckmod'
},
dodgefeatureeffect: {},
physical_actionseffect:{},
mind_actionseffect:{},
initiativefeatureeffect: {},
weaponeffect: {}
};
/* Pre configured feature and power effects. Every feature object will have:
- button: An act button associated (the add button);
- name: The translated feature's name;
- cost: how much does it cost to purchase;
- effects: An array of effects objects. Each of these objects consist of:
- target: The sheet's attribute where the effect will be applied;
- value: A function that returns a calculated formula of the value of the effect;
- operation: If it is a sum or multiplication(division if the value is negative). This value is used
later to calculate the mod to be applied on the target sheet's attribute. The formula
will be explained in the function that deals with it.
*/
const features = {
ambidexterity:
{
name: getTranslationByKey('ambidexterity'),
cost: 3
},
obvious_feature:
{
name: getTranslationByKey('obvious_feature'),
cost: 0
},
contortion:
{
name: getTranslationByKey('contortion'),
cost: 2,
effects: [
{
target: 'dodgefeatureeffect',
value: level => Math.floor(level/2),
operation: OperationEnum.SUM
}
]
},
slow_reflexes:
{
name: getTranslationByKey('slow_reflexes'),
cost: -5,
effects: [
{
target: 'dodgefeatureeffect',
value: level => (-1)*level,
operation: OperationEnum.SUM
}
]
},
fast_reflexes:
{
name: getTranslationByKey('fast_reflexes'),
cost: 5,
effects: [
{
target: 'dodgefeatureeffect',
value: level => level,
operation: OperationEnum.SUM
}
]
},
increased_senses: {
name: getTranslationByKey('increased_senses'),
cost: 8,
effects: [
{
target: 'charperceptionfeatureeffect',
value: level => level,
operation: OperationEnum.SUM
}
]
},
reduced_senses:
{
name: getTranslationByKey('reduced_senses'),
cost: -8,
effects: [
{
target: 'charperceptionfeatureeffect',
value: level => (-1)*level,
operation: OperationEnum.SUM
}
]
},
increased_mind: {
name: getTranslationByKey('increased_mind'),
cost: 3,
effects: [
{
target: 'charmindfeatureeffect',
value: level => level,
operation: OperationEnum.SUM
}
]
},
post:
{
name: getTranslationByKey('post'),
cost: 2
},
readiness:
{
name: getTranslationByKey('readiness'),
cost: 4
},
reduced_mind:
{
name: getTranslationByKey('reduced_mind'),
cost: -3,
effects: [
{
target: 'charmindfeatureeffect',
value: level => (-1)*level,
operation: OperationEnum.SUM
}
]
},
strong_will:
{
name: getTranslationByKey('strong_will'),
cost: 6,
effects: [
{
target: 'charwillfeatureeffect',
value: level => level,
operation: OperationEnum.SUM
}
]
},
weak_will:
{
name: getTranslationByKey('weak_will'),
cost: -6,
effects: [
{
target: 'charwillfeatureeffect',
value: level => (-1)*level,
operation: OperationEnum.SUM
}
]
},
additional_limbs:
{
name: getTranslationByKey('additional_limbs'),
cost: 6,
effects: [
{
target: 'chardexterityfeatureeffect',
value: level => Math.floor(level/2)+1,
operation: OperationEnum.MULT
},
{
target: 'initiativefeatureeffect',
value: level => level,
operation: OperationEnum.SUM
},
{
target: 'dodgefeatureeffect',
value: level => level,
operation: OperationEnum.SUM
},
{
target: 'weaponeffect',
value: level => level,
operation: OperationEnum.SUM
},
{
target: 'physical_actionseffect',
value: level => Math.floor(level/2),
operation: OperationEnum.SUM
}
]
},
increased_size:
{
name: getTranslationByKey('increased_size'),
cost: 11,
level: 2,
effects: [
{
target: 'charphysicalfeatureeffect',
value: level => level,
operation: OperationEnum.MULT
},
{
target: 'dodgefeatureeffect',
value: level => (-1)*(level-1),
operation: OperationEnum.SUM
}
]
},
reduced_size:
{
name: getTranslationByKey('reduced_size'),
cost: -12,
level: 2,
effects: [
{
target: 'charphysicalfeatureeffect',
value: level => (-1)*level,
operation: OperationEnum.MULT
},
{
target: 'dodgefeatureeffect',
value: level => (level-1),
operation: OperationEnum.SUM
}
]
}
};
/* POWERS CONFIG*/
const powers = {
increased_dexterity:
{
name: getTranslationByKey('increased_dexterity'),
cost: 14,
level: 2,
effects: [
{
target: 'chardexterityfeatureeffect',
value: level => level,
operation: OperationEnum.MULT
},
{
target: 'initiativefeatureeffect',
value: level => level,
operation: OperationEnum.SUM
},
{
target: 'dodgefeatureeffect',
value: level => level,
operation: OperationEnum.SUM
},
{
target: 'weaponeffect',
value: level => level,
operation: OperationEnum.SUM
},
{
target: 'physical_actionseffect',
value: level => level-1,
operation: OperationEnum.SUM
}
]
},
increased_physical:
{
name: getTranslationByKey('increased_physical'),
cost: 16,
level: 2,
effects: [
{
target: 'charphysicalfeatureeffect',
value: level => level,
operation: OperationEnum.MULT
}
]
},
increased_intelligence:
{
name: getTranslationByKey('increased_intelligence'),
cost: 12,
level: 2,
effects: [
{
target: 'charintelligencefeatureeffect',
value: level => level,
operation: OperationEnum.MULT
},
{
target: 'mind_actionseffect',
value: level => level-1,
operation: OperationEnum.SUM
}
]
},
reduced_dexterity:
{
name: getTranslationByKey('reduced_dexterity'),
cost: -14,
level: 2,
effects: [
{
target: 'chardexterityfeatureeffect',
value: level => (-1)*level,
operation: OperationEnum.MULT
}
]
},
reduced_physical:
{
name: getTranslationByKey('reduced_physical'),
cost: -16,
level: 2,
effects: [
{
target: 'charphysicalfeatureeffect',
value: level => (-1)*level,
operation: OperationEnum.MULT
}
]
},
reduced_intelligence:
{
name: getTranslationByKey('reduced_intelligence'),
cost: -12,
level: 2,
effects: [
{
target: 'charintelligencefeatureeffect',
value: level => (-1)*level,
operation: OperationEnum.MULT
}
]
}
};
/*setting preconfigured powers and features add buttons */
setPreconfiguredSections(features, 'feature');
setPreconfiguredSections(powers, 'power');
/* Sets preconfigured sections add buttons, like features and powers */
function setPreconfiguredSections(values, sectionName) {
for (let button in values) {
on(`clicked:${button}`, function() {
var newrowid = generateRowID();
var newrowattrs = {};
newrowattrs[`repeating_${sectionName}s_${newrowid}_${sectionName}`] = values[button].name;
newrowattrs[`repeating_${sectionName}s_${newrowid}_${sectionName}cost`] = values[button].cost;
if (values[button].hasOwnProperty('level')) {
newrowattrs[`repeating_${sectionName}s_${newrowid}_${sectionName}level`] = values[button].level;
}
if (values[button].effects !== undefined) {
newrowattrs[`repeating_${sectionName}s_${newrowid}_${sectionName}id`] = button;
}
setAttrs(newrowattrs);
});
}
}
/* adds the list of the character's attributes to the array of values to be retrieved */
function addAttributesMods(attributesArray) {
for(target in effectsTargets) {
if (effectsTargets[target].hasOwnProperty('attributeMod')) {
attributesArray.push(effectsTargets[target].attributeMod);
attributesArray.push(effectsTargets[target].attributeMod + 'operator');
}
}
}
/* build the repeating section's list of attributes which values should be retrieved */
function buildSectionAttributesArray(sectionRowIds, sectionName, attributesArray) {
for(var i=0; i < sectionRowIds.length; i++) {
const id = sectionRowIds[i];
attributesArray.push(`repeating_${sectionName}s_${id}_${sectionName}level`);
attributesArray.push(`repeating_${sectionName}s_${id}_${sectionName}id`);
}
return attributesArray;
}
/* Calculate the totals for the effects of a repeating section
sectionConfig: The const object with the configuration of the effects and its formulas;
sectionName: The name of the sheet's repeating section which effects will be calculated. Should be in singular (ex: power, instead of powers);
values: The values object retrieved from the getAttrs function;
sectionIds: the array of ids from the repeating section;
totals: the totals object that will store all the calculations to set the formulas on all effects fields on the sheet
*/
function calculateEffectsAndMods(sectionConfig, sectionName, values, sectionIds, totals) {
for(var i=0; i < sectionIds.length; i++) {
const id = sectionIds[i];
const level = parseInt(values[`repeating_${sectionName}s_${id}_${sectionName}level`])||0;
const itemID = values[`repeating_${sectionName}s_${id}_${sectionName}id`];
let effects;
if (itemID !== undefined && itemID !== '') {
if (sectionConfig[itemID].hasOwnProperty('effects')) {
effects = sectionConfig[itemID].effects;
}
if (effects !== undefined) {
sumEffects(effects, level, totals);
}
}
}
}
/* setting and calculating feature effects */
on('sheet:opened change:repeating_features remove:repeating_features '+
'change:repeating_powers remove:repeating_powers ' +
'change:charphysiquemod change:charphysiquemodoperator '+
'change:chardexteritymod change:chardexteritymodoperator '+
'change:charintelligencemod change:charintelligencemodoperator '+
'change:charperceptionmod change:charperceptionmodoperator '+
'change:charwillmod change:charwillmodoperator '+
'change:charmindmod change:charmindmodoperator '+
'change:charmagicmod change:charmagicmodoperator '+
'change:charluckmod change:charluckmodoperator' , function() {
let totals = {};
let out = {};
getSectionIDs('features', function(featuresIdarray) {
getSectionIDs('powers', function(powersIdarray) {
let attributesArray = [];
buildSectionAttributesArray(featuresIdarray, 'feature', attributesArray);
buildSectionAttributesArray(powersIdarray, 'power', attributesArray);
addAttributesMods(attributesArray);
getAttrs(attributesArray, function(values) {
calculateEffectsAndMods(features, 'feature', values, featuresIdarray, totals);
calculateEffectsAndMods(powers, 'power', values, powersIdarray, totals);
out = generateEffectFormulas(totals, values);
setAttrs(out);
});
});
});
});
function initTotal() {
return {
totalSum: 0,
totalMult: 0
}
}
function sumEffects(effects, level, totals) {
effects.forEach(effect => {
if (!totals.hasOwnProperty(effect.target)) {
const target = effect.target;
totals[target] = initTotal();
}
const value = effect.value(level);
switch(effect.operation) {
case OperationEnum.SUM:
totals[effect.target].totalSum += value;
break;
case OperationEnum.MULT:
totals[effect.target].totalMult += value;
break;
}
});
}
/* The effect formula is like this:
If the total multiplication is negative, then we have to do a division.
If the total multiplication is positive, then we have to do a multiplication.
If the total multiplication is zero, then it is not added to the formula.
The total sum is just summed at the end of the formula.
Example:
feature A gives a x4 bonus to physique.
feature B gives a /2 penalty to physique.
multiplication counts as positive.
division counts as negative.
We have to do the sum of multiplications minus the sum of divisions to determine the bonus formula.
For simplicity, we store on the effects, a negative value on the mult field when it is a division.
physique's featureMod will then have the formula:
(4 - 2) = 2, which is positive. So it will be a multiplication:
formula = *2;
Then, physique in the end will be = orig*2.
*/
function generateEffectFormulas(totals, values) {
let targetAttributes = {};
for (target in effectsTargets) {
let formula = ``;
treatAttributesMods(target, values, totals);
if (totals.hasOwnProperty(target)) {
if (totals[target].totalMult > 0) {
formula += `*${totals[target].totalMult}`;
}
if (totals[target].totalMult < 0) {
formula += `/${Math.abs(totals[target].totalMult)}`;
}
if (totals[target].totalSum > 0) {
formula += `+${totals[target].totalSum}`;
}
if (totals[target].totalSum < 0) {
formula += `${totals[target].totalSum}`;
}
}
if (formula == ``) {
formula = '+0';
}
targetAttributes[target] = formula;
}
return targetAttributes;
}
function treatAttributesMods(target, values, totals) {
if (effectsTargets[target].hasOwnProperty('attributeMod')) {
const attributeMod = effectsTargets[target].attributeMod;
const attributeModValue = Math.abs(parseInt(values[attributeMod])||0);
const attributeModOperator = values[attributeMod+'operator'];
if (!totals.hasOwnProperty(target)) {
totals[target] = initTotal();
}
switch(attributeModOperator) {
case '*':
totals[target].totalMult += attributeModValue;
break;
case '/':
totals[target].totalMult -= attributeModValue;
break;
}
}
}
</script>