Files
roll20-character-sheets-tester/Mutants and Masterminds 3E/mutants-and-masterminds.html
T
Medieve df58a9fc06 Mutants and Masterminds 3E Styling
Some color and adjustments to the sheet header and how powers are displayed.
2020-11-19 23:06:05 -07:00

1137 lines
63 KiB
HTML

<input class="sheet-hide-output" type="checkbox" name="attr_hide-output" value="1" checked="true" /><span></span>
<input class="sheet-output-message" type="text" name="attr_output-message" title="output-message" />
<div class="sheet-wrapper">
<div class="sheet-row">
<!-- Logo -->
<!-- --------------- -->
<!-- Details Section -->
<!-- --------------- -->
<div class="section-details">
<div class="character">
<input type="text" name="attr_identity-name" title="identity-name" placeholder="Real Identity"/>
<input type="text" name="attr_character_name" title="real-name" placeholder="Super Alias"/>
</div>
<div class="details1">
<b> Secret</b><input type="radio" name="attr_identity-status" title="identity-status" value="0"/>
<b>Gender:</b><input type="text" name="attr_gender" title="gender" value=""/>
<b>Height:</b><input type="text" name="attr_height" title="height"/>
<b>Weight:</b><input type="text" name="attr_weight" title="weight"/>
<b> Public</b><input type="radio" name="attr_identity-status" title="identity-status" value="1"/>
<b>Age:</b><input type="number" name="attr_age" title="age" value="0"/>
<b>Eyes:</b><input type="text" name="attr_eyes" title="eyes"/>
<b>Hair:</b><input type="text" name="attr_hair" title="hair"/>
</div>
<div class="details2">
<div>
<input type="text" name="attr_group" title="group" placeholder="Group Affiliation" />
<input type="text" name="attr_base" title="base" placeholder="Base of Operations" />
</div>
<div>
<input type="number" name="attr_power-level" title="power-level" value="0" placeholder="Power Lever"/>
<span>¢</span>
</div>
</div>
<div class="power">
<b>Power Point Totals:</b>
<b>Abilities</b><input type="number" name="attr_ability-points" title="ability-points" value="(@{total-ability-score} * 2)" disabled/>
<b>+</b>
<b>Powers</b><input type="number" name="attr_power-points" title="power-points" value="0"/><b>+</b>
<b>Advantages</b><input type="number" name="attr_advantage-points" title="advantage-points" value="0"/>
<b>+</b>
<b>Skills</b><input type="number" name="attr_skill-points" title="skill-points" value="(@{total-skill-ranks} / 2)" disabled/>
<b>+</b>
<b>Defenses</b>
<input type="number" name="attr_defense-points" title="defense-points" value="@{total-defense-points}" disabled/>
<b>=</b>
<input type="number" name="attr_total-power-points" title="attr_total-power-points" value="(@{ability-points} + @{power-points} + @{advantage-points} + @{skill-points} + @{defense-points})" disabled/><b>/</b>
<input type="number" name="attr_max-power-points" title="attr_max-power-points" value="(@{starting-power-points} + @{power-points-earned})" disabled/><b> *</b>
</div>
<img src="https://i.imgur.com/0aRNO0Z.png" title="Mutants and Masterminds Character Sheet"/>
</div>
</div>
<span class="note"><b>* Total Power Points Earned = Starting Power Points + Power Points Earned</b></span>
<br />
<input type="hidden" name="attr_tab" class="tab" value="stats"/>
<button class="tab-button" type="action" name="act_stats">Stats & Skills</button>
<button class="tab-button" type="action" name="act_powers">Powers, Advantages, & Equipment</button>
<button class="tab-button" type="action" name="act_options">Options</button>
<!-- ------------------------------------- -->
<!-- Page 1 (Stats & Skills) -->
<!-- ------------------------------------- -->
<div class="sheet-tab-content sheet-tab1">
<div class="sheet-2colrow">
<div class="sheet-col">
<!-- Abilities -->
<div class="section-abilities">
<div class="details-row">
<label>Name</label>
<label>Total</label>
<label>Base</label>
<label>Misc</label>
</div>
<div class="details-row">
<button type="roll" name="roll_strength-roll" title="%{strength-roll}" value="@{who-stat} Strength Result: [[@{die_type}+(@{strength-total})]]">Strength</button>
<input type="number" name="attr_strength-total" title="strength-total" value="(@{strength} + @{strength-misc})" disabled/>
<input type="number" name="attr_strength" title="strength" value="0"/>
<input type="number" name="attr_strength-misc" title="strength-misc" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_agility-roll" title="%{agility-roll}" value="@{who-stat} Agility Result: [[@{die_type}+(@{agility-total})]]">Agility</button>
<input type="number" name="attr_agility-total" title="agility-total" value="(@{agility} + @{agility-misc})" disabled/>
<input type="number" name="attr_agility" title="agility" value="0"/>
<input type="number" name="attr_agility-misc" title="agility-misc" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_fighting-roll" title="%{fighting-roll}" value="@{who-stat} Fighting Result: [[@{die_type}+(@{fighting-total})]]">Fighting</button>
<input type="number" name="attr_fighting-total" title="fighting-total" value="(@{fighting} + @{fighting-misc})" disabled/>
<input type="number" name="attr_fighting" title="fighting" value="0"/>
<input type="number" name="attr_fighting-misc" title="fighting-misc" value="0"/>
</div>
<div class="detailse-row">
<button type="roll" name="roll_awareness-roll" title="%{awareness-roll}" value="@{who-stat} Awareness Result: [[@{die_type}+(@{awareness-total})]]">Awareness</button>
<input type="number" name="attr_awareness-total" title="awareness-total" value="(@{awareness} + @{awareness-misc})" disabled/>
<input type="number" name="attr_awareness" title="awareness" value="0"/>
<input type="number" name="attr_awareness-misc" title="awareness-misc" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_stamina-roll" title="%{stamina-roll}" value="@{who-stat} Stamina Result: [[@{die_type}+(@{stamina-total})]]">Stamina</button>
<input type="number" name="attr_stamina-total" title="stamina-total" value="(@{stamina} + @{stamina-misc})" disabled/>
<input type="number" name="attr_stamina" title="stamina" value="0"/>
<input type="number" name="attr_stamina-misc" title="stamina-misc" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_dexterity-roll" title="%{dexterity-roll}" value="@{who-stat} Dexterity Result: [[@{die_type}+(@{dexterity-total})]]">Dexterity</button>
<input type="number" name="attr_dexterity-total" title="dexterity-total" value="(@{dexterity} + @{dexterity-misc})" disabled/>
<input type="number" name="attr_dexterity" title="dexterity" value="0"/>
<input type="number" name="attr_dexterity-misc" title="dexterity-misc" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_intellect-roll" title="%{intellect-roll}" value="@{who-stat} Intellect Result: [[@{die_type}+(@{intellect-total})]]">Intellect</button>
<input type="number" name="attr_intellect-total" title="intellect-total" value="(@{intellect} + @{intellect-misc})" disabled/>
<input type="number" name="attr_intellect" title="intellect" value="0"/>
<input type="number" name="attr_intellect-misc" title="intellect-misc" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_presence-roll" title="%{presence-roll}" value="@{who-stat} Presence Result: [[@{die_type}+(@{presence-total})]]">Presence</button>
<input type="number" name="attr_presence-total" title="presence-total" value="(@{presence} + @{presence-misc})" disabled/>
<input type="number" name="attr_presence" title="presence" value="0"/>
<input type="number" name="attr_presence-misc" title="presence-misc" value="0"/>
</div>
<input type="hidden" name="attr_total-ability-score" value="(@{strength} + @{agility} + @{fighting} + @{awareness} + @{stamina} + @{dexterity} + @{intellect} + @{presence})" disabled/>
</div>
<br />
<!-- Power Points -->
<div class="section-points">
<div class="details-row">
<div>
<label>Starting Power Points</label>
<label>Earned Power Points</label>
<br />
<input type="number" name="attr_starting-power-points" title="starting-power-points" value="0"/>
<input type="number" name="attr_power-points-earned" title="power-points-earned" value="0"/>
</div>
<div>
<label>Hero Points</label>
<label>Injuries</label>
<br />
<input type="number" name="attr_hero-points" title="hero-points" value="0"/>
<input type="number" name="attr_injuries" title="injuries" value="0"/>
</div>
</div>
</div>
<br />
<!-- Defense -->
<div class="section-defenses">
<div class="details-row">
<label>Defense - Dodge DC</label><input type="number" name="attr_dodge" title="dodge" value="(@{dodge} + 10)" disabled/>
<label>Parry DC</label><input type="number" name="attr_parry" title="parry" value="(@{parry} + 10)" disabled/>
</div>
<div class="details-row">
<label>Name</label>
<label>Ability Name</label>
<label>Total</label><b>=</b><label>Points</label><b>+</b><label>Ability</label><b>+</b>
<label>Misc</label>
</div>
<div class="details-row">
<button type="roll" name="roll_Dodge" title="Dodge" value="@{who-combat} Dodge result: [[@{die_type} + @{dodge}]]">Dodge</button>
<b><label>AGL</label></b>
<input type="number" name="attr_dodge" title="dodge" value="(@{dodge-points} + @{agility-total} + @{dodge-misc} + @{Total_Defenses_Mod})" disabled/>
<b>=</b>
<input type="number" name="attr_dodge-points" title="dodge-points" value="0"/>
<b>+</b>
<input type="number" name="attr_dodge-ability" title="agility" value="@{agility-total}" disabled/>
<b>+</b>
<input type="number" name="attr_dodge-misc" title="dodge-misc" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Parry" title="Parry" value="@{who-combat} Parry result: [[@{die_type} + @{parry}]]">Parry</button></span>
<b><label>FGT</label></b>
<input type="number" name="attr_parry" title="parry" value="(@{parry-points} + @{fighting-total} + @{parry-misc} + @{Total_Defenses_Mod})" disabled/>
<b>=</b>
<input type="number" name="attr_parry-points" title="parry-points" value="0"/>
<b>+</b>
<input type="number" name="attr_parry-ability" title="fighting" value="@{fighting-total}" disabled/>
<b>+</b>
<input type="number" name="attr_parry-misc" title="parry-misc" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Fortitude" title="Fortitude" value="@{who-combat} Fortitude result: [[@{die_type} + @{fortitude}]]">Fortitude</button>
<b><label>STA</label></b>
<input type="number" name="attr_fortitude" title="fortitude" value="(@{fortitude-points} + @{stamina-total} + @{fortitude-misc})" disabled/>
<b>=</b>
<input type="number" name="attr_fortitude-points" title="fortitude-points" value="0"/>
<b>+</b>
<input type="number" name="attr_fortitude-ability" title="stamina" value="@{stamina-total}" disabled/>
<b>+</b>
<input type="number" name="attr_fortitude-misc" title="fortitude-misc" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Toughness" title="Toughness" value="@{who-combat} Toughness result: [[@{die_type} + @{toughness}]]">Toughness</button>
<b><label>STA</label></b>
<input type="number" name="attr_toughness" title="toughness" value="(@{toughness-points} + @{stamina-total} + @{toughness-misc} + (-1 * abs(@{injuries})))" disabled/>
<b>=</b>
<input type="number" name="attr_toughness-points" title="toughness-points" value="0"/>
<b>+</b>
<input type="number" name="attr_toughness-ability" title="stamina" value="@{stamina-total}" disabled/>
<b>+</b>
<input type="number" name="attr_toughness-misc" title="toughness-misc" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Will" title="Will" value="@{who-combat} Will result: [[@{die_type} + @{will}]]">Will</button>
<b><label>AWE</label></b>
<input type="number" name="attr_will" title="will" value="(@{will-points} + @{awareness-total} + @{will-misc})" disabled/>
<b>=</b>
<input type="number" name="attr_will-points" title="will-points" value="0"/>
<b>+</b>
<input type="number" name="attr_will-ability" title="awareness" value="@{awareness-total}" disabled/>
<b>+</b>
<input type="number" name="attr_will-misc" title="will-misc" value="0"/>
</div>
<input type="hidden" name="attr_total-defense-points" value="(@{dodge-points} + @{parry-points} + @{fortitude-points} + @{toughness-points} + @{will-points})" disabled/>
</div>
<br />
<!-- Offense -->
<div class="section-offense">
<div class="details-row">
<b>Offense</b>
</div>
<div class="details-row">
<button type="roll" name="roll_Initiative" title="Initiative" value="@{who-initiative} &{template:default} {{name= @{character_name}'s Initiative}} {{Result: [[@{die_type} + @{initiative} &amp;{tracker}]]}}">Initiative</button>
<input type="number" name="attr_initiative" title="initiative" value="(@{initiative-misc} + @{agility-total})" disabled/>
<b>=</b>
<input type="number" name="attr_initiative-misc" title="initiative-misc" value="0"/></span>
<b>+</b>
<input type="number" name="attr_initiative-ability" title="agility" value="@{agility-total}" disabled/>
</div>
<fieldset class="repeating_attacks">
<button class="die-show" type="roll" name="roll_attack-roll" title="repeating_attack_X_attack-roll (NOT USABLE IN MACROS)" value="@{macro-text}"></button>
<input type="text" name="attr_name" title="Attack Name" value="Name"/>
<input type="number" name="attr_bonus" title="Attack Bonus" value="0"/>
<input type="number" name="attr_crit_rate" title="Crit Target" value="20"/>
<input type="number" name="attr_effect_ranks" title="Effect Ranks" value="0"/>
<select name="attr_save_base" title="Save Type">
<option value="10">Dodge</option>
<option value="10">Parry</option>
<option value="15" selected>Toughness</option>
<option value="10">Fortitude</option>
<option value="10">Will</option?
</select>
<br />
<input type="text" name="attr_effect" title="Effect Names" value="Effect notes go here"/>
<br />
<b>Show Macro Text?</b>
<input type="checkbox" class="sheet-macro-show" title="repeating_attacks_X_macro-text-show" name="attr_macro-text-show" value="1" /><span></span>
<textarea class="sheet-macro" title="repeating_attacks_X_macro-text" name="attr_macro-text">@{who-combat} &{template:default} {{name= @{name}}} {{Result=[[@{die_type}cs>@{crit_rate} + @{bonus} + @{Total_Attack_Mod}]] }} {{Effect= DC [[@{save_base} + @{effect_ranks} + @{Total_Effect_Mod}]]}} {{Notes= @{effect}}}</textarea>
</fieldset>
</div>
<br />
<!-- Modifiers -->
<div class="section-modifiers">
<div class="details-row">
<label>Name</label>
<label>Attack</label>
<label>Defense</label>
<label>Effect</label>
</div>
<div class="details-row">
<b><label>Accurate Attack</label></b>
<input type="number" name="attr_AccAtk_Attack" title="Accurate-Attack Attack Bonus" value="0"/>
<input type="number" name="attr_AccAtk_Defenses" title="Accurate-Attack Defense Bonus" value="0" disabled/>
<input type="number" name="attr_AccAtk_Effect" title="Accurate Attack Effect Penalty" value="(-1)*@{AccAtk_Attack}" disabled/>
</div>
<div class="details-row">
<b><label>All-out Attack</label></b>
<input type="number" name="attr_AOAtk_Attack" title="All-out Attack Attack Bonus" value="0"/>
<input type="number" name="attr_AOAtk_Defenses" title="All0out Attack Defense Penalty" value="(-1)*@{AOAtk_Attack}" disabled/>
<input type="number" name="attr_AOAtk_Effect" title="All-out Attack Effect Bonus" value="0" disabled/>
</div>
<div class="details-row">
<b><label>Defensive Attack</label></b>
<input type="number" name="attr_DefAtk_Attack" title="Defensive Attack Attack Penalty" value="(-1)*@{DefAtk_Defenses}" disabled/>
<input type="number" name="attr_DefAtk_Defenses" title="Defensive Attack Defense Bonus" value="0" />
<input type="number" name="attr_DefAtk_Effect" title="Defensive Attack Effect Penalty" value="0"disabled/>
</div>
<div class="details-row">
<b><label>Power Attack</label></b>
<input type="number" name="attr_PwrAtk_Attack" title="Power Attack-Attack Penalty" value="0"/>
<input type="number" name="attr_PwrAtk_Defenses" title="Power Attack Defense Bonus" value="0" disabled/>
<input type="number" name="attr_PwrAtk_Effect" title="Power Attack Effect Bonus" value="(-1)*@{PwrAtk_Attack}" disabled/>
</div>
<div class="details-row">
<b><label>Conditions</label></b>
<input type="number" name="attr_Cnd_Attack" title="Condition Attack Modifier" value="0"/>
<input type="number" name="attr_Cnd_Defenses" title="Condition Defense Modifier" value="0" disabled/>
<input type="number" name="attr_Cnd_Effect" title="Condition Effect Modifier" value="0" />
</div>
<div class="details-row">
<b><label>Totals</label></b>
<input type="number" name="attr_Total_Attack_Mod" title="Combined Attack Modifier" value="(@{AccAtk_Attack} + @{AOAtk_Attack} + @{DefAtk_Attack} + @{PwrAtk_Attack} + @{Cnd_Attack})" disabled/>
<input type="number" name="attr_Total_Defenses_Mod" title="Combined Defense Modifier" value="(@{AccAtk_Defenses} + @{AOAtk_Defenses} + @{DefAtk_Defenses} + @{PwrAtk_Defenses} + @{Cnd_Defenses})" disabled/>
<input type="number" name="attr_Total_Effect_Mod" title="Combined Effect Modifier" value="(@{AccAtk_Effect} + @{AOAtk_Effect} + @{DefAtk_Effect} + @{PwrAtk_Effect} + @{Cnd_Effect})" disabled/>
</div>
</div>
</div>
<div class="sheet-col">
<!-- Skills -->
<div class="sheet-section-skills">
<div class="details-row">
<label>Name</label>
<label>Ability</label>
<label>Total</label>
<label>Ability</label>
<label>Ranks</label>
<label>Other</label>
</div>
<div class="details-row">
<button type="roll" name="roll_Acrobatics-Check" title="Acrobatics-Check" value="@{who-skill} Acrobatics check: [[@{die_type} + @{Acrobatics}]]">Acrobatics</button>
<b><label>AGI</label></b>
<input type="number" name="attr_Acrobatics" title="Acrobatics" value="(@{Acrobatics-ability} + @{Acrobatics-ranks} + @{Acrobatics-other})" disabled/>
<input type="number" name="attr_Acrobatics-ability" title="Acrobatics-ability" value="@{agility-total}" disabled/>
<input type="number" name="attr_Acrobatics-ranks" title="Acrobatics-ranks" value="0"/>
<input type="number" name="attr_Acrobatics-other" title="Acrobatics-other" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Athletics-Check" title="Athletics-Check" value="@{who-skill} Athletics check: [[@{die_type} + @{Athletics}]]">Athletics</button>
<b><label>STR</label></b>
<input type="number" name="attr_Athletics" title="Athletics" value="(@{Athletics-ability} + @{Athletics-ranks} + @{Athletics-other})" disabled/>
<input type="number" name="attr_Athletics-ability" title="Athletics-ability" value="@{strength-total}" disabled/>
<input type="number" name="attr_Athletics-ranks" title="Athletics-ranks" value="0"/>
<input type="number" name="attr_Athletics-other" title="Athletics-other" value="0"/>
</div>
<div class="details-row close-combat-header">
<label>Close Combat</label>
<b><label>FGT</label></b>
</div>
<div class="details-row close-combat">
<button class="die-show" type="roll" name="roll_Close-Combat-1-Check" title="Close-Combat-1-Check" value="@{who-skill} @{Close-Combat-1-name} check: [[@{die_type} + @{Close-Combat-1}]]"></button>
<input type="text" name="attr_Close-Combat-1-name" title="Close-Combat-1-name"/>
<input type="number" name="attr_Close-Combat-1" title="Close-Combat-1" value="(@{Close-Combat-1-ability} + @{Close-Combat-1-ranks} + @{Close-Combat-1-other})" disabled/>
<input type="number" name="attr_Close-Combat-1-ability" title="Close-Combat-1-ability" value="@{fighting-total}" disabled/>
<input type="number" name="attr_Close-Combat-1-ranks" title="Close-Combat-1-ranks" value="0"/>
<input type="number" name="attr_Close-Combat-1-other" title="Close-Combat-1-other" value="0"/>
</div>
<div class="details-row close-combat">
<button class="die-show" type="roll" name="roll_Close-Combat-2-Check" title="Close-Combat-2-Check" value="@{who-skill} @{Close-Combat-2-name} check: [[@{die_type} + @{Close-Combat-2}]]"></button>
<input type="text" name="attr_Close-Combat-2-name" title="Close-Combat-2-name"/>
<input type="number" name="attr_Close-Combat-2" title="Close-Combat-2" value="(@{Close-Combat-2-ability} + @{Close-Combat-2-ranks} + @{Close-Combat-2-other})" disabled/>
<input type="number" name="attr_Close-Combat-2-ability" title="Close-Combat-2-ability" value="@{fighting-total}" disabled/>
<input type="number" name="attr_Close-Combat-2-ranks" title="Close-Combat-2-ranks" value="0"/>
<input type="number" name="attr_Close-Combat-2-other" title="Close-Combat-2-other" value="0"/>
</div>
<div class="details-row close-combat" style="margin-bottom: 5px;">
<button class="die-show" type="roll" name="roll_Close-Combat-3-Check" title="Close-Combat-3-Check" value="@{who-skill} @{Close-Combat-3-name} check: [[@{die_type} + @{Close-Combat-3}]]"></button>
<input type="text" name="attr_Close-Combat-3-name" title="Close-Combat-3-name"/>
<input type="number" name="attr_Close-Combat-3" title="Close-Combat-3" value="(@{Close-Combat-3-ability} + @{Close-Combat-3-ranks} + @{Close-Combat-3-other})" disabled/>
<input type="number" name="attr_Close-Combat-3-ability" title="Close-Combat-3-ability" value="@{fighting-total}" disabled/>
<input type="number" name="attr_Close-Combat-3-ranks" title="Close-Combat-3-ranks" value="0"/>
<input type="number" name="attr_Close-Combat-3-other" title="Close-Combat-3-other" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Deception-Check" title="Deception-Check" value="@{who-skill} Deception check: [[@{die_type} + @{Deception}]]">Deception</button>
<b><label>PRS</label></b>
<input type="number" name="attr_Deception" title="Deception" value="(@{Deception-ability} + @{Deception-ranks} + @{Deception-other})" disabled/>
<input type="number" name="attr_Deception-ability" title="Deception-ability" value="@{presence-total}" disabled/>
<input type="number" name="attr_Deception-ranks" title="Deception-ranks" value="0"/>
<input type="number" name="attr_Deception-other" title="Deception-other" value="0"/>
</div>
<div class="details-row expertise-header">
<label>Expertise</label>
<b><label>INT</label></b>
</div>
<div class="details-row expertise">
<button class="die-show" type="roll" name="roll_Expertise-1-Check" title="Expertise-1-Check" value="@{who-skill} @{Expertise-1-name} check: [[@{die_type} + @{Expertise-1}]]"></button>
<input type="text" name="attr_Expertise-1-name" title="Expertise-1-name"/>
<input type="number" name="attr_Expertise-1" title="Expertise-1" value="(@{Expertise-1-ability} + @{Expertise-1-ranks} + @{Expertise-1-other})" disabled/>
<input type="number" name="attr_Expertise-1-ability" title="Expertise-1-ability" value="@{intellect-total}" disabled/>
<input type="number" name="attr_Expertise-1-ranks" title="Expertise-1-ranks" value="0"/>
<input type="number" name="attr_Expertise-1-other" title="Expertise-1-other" value="0"/>
</div>
<div class="details-row expertise">
<button class="die-show" type="roll" name="roll_Expertise-2-Check" title="Expertise-2-Check" value="@{who-skill} @{Expertise-2-name} check: [[@{die_type} + @{Expertise-2}]]"></button>
<input type="text" name="attr_Expertise-2-name" title="Expertise-2-name"/>
<input type="number" name="attr_Expertise-2" title="Expertise-2" value="(@{Expertise-2-ability} + @{Expertise-2-ranks} + @{Expertise-2-other})" disabled/>
<input type="number" name="attr_Expertise-2-ability" title="Expertise-2-ability" value="@{intellect-total}" disabled/>
<input type="number" name="attr_Expertise-2-ranks" title="Expertise-2-ranks" value="0"/>
<input type="number" name="attr_Expertise-2-other" title="Expertise-2-other" value="0"/>
</div>
<div class="details-row expertise">
<button class="die-show" type="roll" name="roll_Expertise-3-Check" title="Expertise-3-Check" value="@{who-skill} @{Expertise-3-name} check: [[@{die_type} + @{Expertise-3}]]"></button>
<input type="text" name="attr_Expertise-3-name" title="Expertise-3-name"/>
<input type="number" name="attr_Expertise-3" title="Expertise-3" value="(@{Expertise-3-ability} + @{Expertise-3-ranks} + @{Expertise-3-other})" disabled/>
<input type="number" name="attr_Expertise-3-ability" title="Expertise-3-ability" value="@{intellect-total}" disabled/>
<input type="number" name="attr_Expertise-3-ranks" title="Expertise-3-ranks" value="0"/>
<input type="number" name="attr_Expertise-3-other" title="Expertise-3-other" value="0"/>
</div>
<div class="details-row expertise" style="margin-bottom: 5px;">
<button class="die-show" type="roll" name="roll_Expertise-4-Check" title="Expertise-4-Check" value="@{who-skill} @{Expertise-4-name} check: [[@{die_type} + @{Expertise-4}]]"></button>
<input type="text" name="attr_Expertise-4-name" title="Expertise-4-name"/>
<input type="number" name="attr_Expertise-4" title="Expertise-4" value="(@{Expertise-4-ability} + @{Expertise-4-ranks} + @{Expertise-4-other})" disabled/>
<input type="number" name="attr_Expertise-4-ability" title="Expertise-4-ability" value="@{intellect-total}" disabled/>
<input type="number" name="attr_Expertise-4-ranks" title="Expertise-4-ranks" value="0"/>
<input type="number" name="attr_Expertise-4-other" title="Expertise-4-other" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Insight-Check" title="Insight-Check" value="@{who-skill} Insight check: [[@{die_type} + @{Insight}]]">Insight</button>
<b><label>AWE</label></b>
<input type="number" name="attr_Insight" title="Insight" value="(@{Insight-ability} + @{Insight-ranks} + @{Insight-other})" disabled/>
<input type="number" name="attr_Insight-ability" title="Insight-ability" value="@{awareness-total}" disabled/>
<input type="number" name="attr_Insight-ranks" title="Insight-ranks" value="0"/>
<input type="number" name="attr_Insight-other" title="Insight-other" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Intimidation-Check" title="Intimidation-Check" value="@{who-skill} Intimidation check: [[@{die_type} + @{Intimidation}]]">Intimidation</button>
<b><label>PRS</label></b>
<input type="number" name="attr_Intimidation" title="Intimidation" value="(@{Intimidation-ability} + @{Intimidation-ranks} + @{Intimidation-other})" disabled/>
<input type="number" name="attr_Intimidation-ability" title="Intimidation-ability" value="@{presence-total}" disabled/>
<input type="number" name="attr_Intimidation-ranks" title="Intimidation-ranks" value="0"/>
<input type="number" name="attr_Intimidation-other" title="Intimidation-other" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Investigation-Check" title="Investigation-Check" value="@{who-skill} Investigation check: [[@{die_type} + @{Investigation}]]">Investigation</button>
<b><label>INT</label></b>
<input type="number" name="attr_Investigation" title="Investigation" value="(@{Investigation-ability} + @{Investigation-ranks} + @{Investigation-other})" disabled/>
<input type="number" name="attr_Investigation-ability" title="Investigation-ability" value="@{intellect-total}" disabled/>
<input type="number" name="attr_Investigation-ranks" title="Investigation-ranks" value="0"/>
<input type="number" name="attr_Investigation-other" title="Investigation-other" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Perception-Check" title="Perception-Check" value="@{who-skill} Perception check: [[@{die_type} + @{Perception}]]">Perception</button>
<b><label>AWE</label></b>
<input type="number" name="attr_Perception" title="Perception" value="(@{Perception-ability} + @{Perception-ranks} + @{Perception-other})" disabled/>
<input type="number" name="attr_Perception-ability" title="Perception-ability" value="@{awareness-total}" disabled/>
<input type="number" name="attr_Perception-ranks" title="Perception-ranks" value="0"/>
<input type="number" name="attr_Perception-other" title="Perception-other" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Persuasion-Check" title="Persuasion-Check" value="@{who-skill} Persuasion check: [[@{die_type} + @{Persuasion}]]">Persuasion</button>
<b><label>PRS</label></b>
<input type="number" name="attr_Persuasion" title="Persuasion" value="(@{Persuasion-ability} + @{Persuasion-ranks} + @{Persuasion-other})" disabled/>
<input type="number" name="attr_Persuasion-ability" title="Persuasion-ability" value="@{presence-total}" disabled/>
<input type="number" name="attr_Persuasion-ranks" title="Persuasion-ranks" value="0"/>
<input type="number" name="attr_Persuasion-other" title="Persuasion-other" value="0"/>
</div>
<div class="details-row range-header">
<b><label>Ranged Combat</label></b>
<b><label>DEX</label></b>
</div>
<div class="details-row range">
<button class="die-show" type="roll" name="roll_Ranged-Combat-1-Check" title="Ranged-Combat-1-Check" value="@{who-skill} @{Ranged-Combat-1-name} check: [[@{die_type} + @{Ranged-Combat-1}]]"></button>
<input type="text" name="attr_Ranged-Combat-1-name" title="Ranged-Combat-1-name"/>
<input type="number" name="attr_Ranged-Combat-1" title="Ranged-Combat-1" value="(@{Ranged-Combat-1-ability} + @{Ranged-Combat-1-ranks} + @{Ranged-Combat-1-other})" disabled/>
<input type="number" name="attr_Ranged-Combat-1-ability" title="Ranged-Combat-1-ability" value="@{dexterity-total}" disabled/>
<input type="number" name="attr_Ranged-Combat-1-ranks" title="Ranged-Combat-1-ranks" value="0"/>
<input type="number" name="attr_Ranged-Combat-1-other" title="Ranged-Combat-1-other" value="0"/>
</div>
<div class="details-row range">
<button class="die-show" type="roll" name="roll_Ranged-Combat-2-Check" title="Ranged-Combat-2-Check" value="@{who-skill} @{Ranged-Combat-2-name} check: [[@{die_type} + @{Ranged-Combat-2}]]"></button>
<input type="text" name="attr_Ranged-Combat-2-name" title="Ranged-Combat-2-name"/>
<input type="number" name="attr_Ranged-Combat-2" title="Ranged-Combat-2" value="(@{Ranged-Combat-2-ability} + @{Ranged-Combat-2-ranks} + @{Ranged-Combat-2-other})" disabled/>
<input type="number" name="attr_Ranged-Combat-2-ability" title="Ranged-Combat-2-ability" value="@{dexterity-total}" disabled/>
<input type="number" name="attr_Ranged-Combat-2-ranks" title="Ranged-Combat-2-ranks" value="0"/>
<input type="number" name="attr_Ranged-Combat-2-other" title="Ranged-Combat-2-other" value="0"/>
</div>
<div class="details-row range" style="margin-bottom: 5px;">
<button class="die-show" type="roll" name="roll_Ranged-Combat-3-Check" title="Ranged-Combat-3-Check" value="@{who-skill} @{Ranged-Combat-3-name} check: [[@{die_type} + @{Ranged-Combat-3}]]"></button>
<input type="text" name="attr_Ranged-Combat-3-name" title="Ranged-Combat-3-name"/>
<input type="number" name="attr_Ranged-Combat-3" title="Ranged-Combat-3" value="(@{Ranged-Combat-3-ability} + @{Ranged-Combat-3-ranks} + @{Ranged-Combat-3-other})" disabled/>
<input type="number" name="attr_Ranged-Combat-3-ability" title="Ranged-Combat-3-ability" value="@{dexterity-total}" disabled/>
<input type="number" name="attr_Ranged-Combat-3-ranks" title="Ranged-Combat-3-ranks" value="0"/>
<input type="number" name="attr_Ranged-Combat-3-other" title="Ranged-Combat-3-other" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Sleight-of-hand-Check" title="Sleight-of-hand-Check" value="@{who-skill} Sleight of Hand check: [[@{die_type} + @{Sleight-of-hand}]]">Sleight of Hand</button>
<b><label>DEX</label></b>
<input type="number" name="attr_Sleight-of-hand" title="Sleight-of-hand" value="(@{Sleight-of-hand-ability} + @{Sleight-of-hand-ranks} + @{Sleight-of-hand-other})" disabled/>
<input type="number" name="attr_Sleight-of-hand-ability" title="Sleight-of-hand-ability" value="@{dexterity-total}" disabled/>
<input type="number" name="attr_Sleight-of-hand-ranks" title="Sleight-of-hand-ranks" value="0"/>
<input type="number" name="attr_Sleight-of-hand-other" title="Sleight-of-hand-other" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Stealth-Check" title="Stealth-Check" value="@{who-skill} Stealth check: [[@{die_type} + @{Stealth}]]">Stealth</button>
<b><label>AGI</label></b>
<input type="number" name="attr_Stealth" title="Stealth" value="(@{Stealth-ability} + @{Stealth-ranks} + @{Stealth-other})" disabled/>
<input type="number" name="attr_Stealth-ability" title="Stealth-ability" value="@{agility-total}" disabled/>
<input type="number" name="attr_Stealth-ranks" title="Stealth-ranks" value="0"/>
<input type="number" name="attr_Stealth-other" title="Stealth-other" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Technology-Check" title="Technology-Check" value="@{who-skill} Technology check: [[@{die_type} + @{Technology}]]">Technology</button>
<b><label>INT</label></b>
<input type="number" name="attr_Technology" title="Technology" value="(@{Technology-ability} + @{Technology-ranks} + @{Technology-other})" disabled/>
<input type="number" name="attr_Technology-ability" title="Technology-ability" value="@{intellect-total}" disabled/>
<input type="number" name="attr_Technology-ranks" title="Technology-ranks" value="0"/>
<input type="number" name="attr_Technology-other" title="Technology-other" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Treatment-Check" title="Treatment-Check" value="@{who-skill} Treatment check: [[@{die_type} + @{Treatment}]]">Treatment</button>
<b><label>INT</label></b>
<input type="number" name="attr_Treatment" title="Treatment" value="(@{Treatment-ability} + @{Treatment-ranks} + @{Treatment-other})" disabled/>
<input type="number" name="attr_Treatment-ability" title="Treatment-ability" value="@{intellect-total}" disabled/>
<input type="number" name="attr_Treatment-ranks" title="Treatment-ranks" value="0"/>
<input type="number" name="attr_Treatment-other" title="Treatment-other" value="0"/>
</div>
<div class="details-row">
<button type="roll" name="roll_Vehicles-Check" title="Vehicles-Check" value="@{who-skill} Vehicles check: [[@{die_type} + @{Vehicles}]]">Vehicles</button>
<b><label>DEX</label></b>
<input type="number" name="attr_Vehicles" title="Vehicles" value="(@{Vehicles-ability} + @{Vehicles-ranks} + @{Vehicles-other})" disabled/>
<input type="number" name="attr_Vehicles-ability" title="Vehicles-ability" value="@{dexterity-total}" disabled/>
<input type="number" name="attr_Vehicles-ranks" title="Vehicles-ranks" value="0"/>
<input type="number" name="attr_Vehicles-other" title="Vehicles-other" value="0"/>
</div>
<div class="details-row total-row">
<b>Total Ranks</b>
<input type="number" name="attr_total-skill-ranks" title="total-skill-ranks" value="(@{Acrobatics-ranks} + @{Athletics-ranks} + @{Close-Combat-1-ranks}+ @{Close-Combat-2-ranks} + @{Close-Combat-3-ranks} + @{Deception-ranks} + @{Expertise-1-ranks} + @{Expertise-2-ranks} + @{Expertise-3-ranks} + @{Expertise-4-ranks} + @{Insight-ranks} + @{Intimidation-ranks} + @{Investigation-ranks} + @{Perception-ranks} + @{Persuasion-ranks} + @{Ranged-Combat-1-ranks} + @{Ranged-Combat-2-ranks} + @{Ranged-Combat-3-ranks} + @{Sleight-of-hand-ranks} + @{Stealth-ranks} + @{Technology-ranks} + @{Treatment-ranks} + @{Vehicles-ranks})" disabled/>
</div>
</div>
<br />
<!-- Notes & Conditions -->
<div class="section-notes">
<b>Notes & Conditions</b>
<br />
<textarea name="attr_notes" title="notes"></textarea>
</div>
</div>
<br />
<!-- Motivations & Complications -->
<div class="section-complications">
<b>Motivations & Complications</b>
<br />
<fieldset class="repeating_complication">
<input type="text" name="attr_name" title="repeating_complication_X_name" value="" placeholder="Name" />
<textarea name="attr_description" title="repeating_complication_X_description" placeholder="Description"></textarea>
</fieldset>
</div>
</div>
</div>
<!-- ---------------------------------- -->
<!-- Page 2 (Powers, Advantages & Gear) -->
<!-- ---------------------------------- -->
<div class="sheet-tab-content sheet-tab2">
<input type="hidden" name="attr_subtab" class="tab" value="all"/>
<button type="action" name="act_all">All</button>
<button type="action" name="act_devices">Powers & Devices</button>
<button type="action" name="act_advantages">Advantages</button>
<button type="action" name="act_equipment">Equipment</button>
<!-- Powers & Devices -->
<div class="sheet-tab-content sheet-tab11 sheet-tab99">
<div class="section-powers">
<fieldset class="repeating_power">
<input class="css-alternate-effect" type="hidden" name="attr_alternate-effect" />
<input class="expandtoggle" type="hidden" name="attr_toggle-show">
<label><input type="checkbox" name="attr_toggle-show" value="display" /><span name="attr_name">Power Name</span></label>
<div class="expandtoggle">
<div class="powergrid">
<label>Powers & Devices</label>
<label>Ranks</label>
<label>PP/Rank</label>
<label>Misc</label>
<label>Total</label>
</div>
<div class="powergrid">
<input type="text" name="attr_name" title="repeating_power_X_name" value="Power Name" placeholder="Power Name" />
<input type="number" name="attr_ranks" title="repeating_power_X_ranks" value="1"/>
<input type="number" name="attr_points-per-rank" title="repeating_power_X_points-per-rank" value="1"/>
<input type="number" name="attr_misc-points" title="repeating_power_X_misc-points" value="0"/>
<input type="number" name="attr_total-cost" title="repeating_power_X_total-cost" value="1" />
<button class="die-show" type="roll" name="attr_adv" title="adv" value="@{who-effects} &amp;{template:default} {{name=@{character_name} - @{name}}} {{@{description}}}" class="btn ui-draggable"></button>
</div>
<div>
<input type="radio" name="attr_alternate-effect" title="repeating_power_X_alternate-effect" value="0" checked="true" /><b>Normal power</b>
<input type="radio" name="attr_alternate-effect" title="repeating_power_X_alternate-effect" value="1" /><b>Alternate effect</b>
<input type="radio" name="attr_alternate-effect" title="repeating_power_X_dynamic-alternate-effect" value="2" /><b>Dynamic effect</b>
</div>
<textarea name="attr_description" title="repeating_power_X_description" placeholder="Description"></textarea>
</div>
</fieldset>
</div>
<br />
</div>
<!-- Advantages -->
<div class="sheet-tab-content sheet-tab12 sheet-tab99">
<div class="section-advantages">
<b>Advantages</b>
<fieldset class="repeating_advantage">
<button class="die-show" type="roll" name="attr_adv" title="adv" value="@{who-effects} &amp;{template:default} {{name=@{character_name} - @{name}}} {{@{description}}}" class="btn ui-draggable"></button>
<input type="number" name="attr_ranks" title="repeating_advantage_X_ranks" value="1"/>
<input type="text" name="attr_name" title="repeating_advantage_X_name" value="" placeholder="Name" />
<textarea name="attr_description" title="repeating_advantage_X_description" placeholder="Description"></textarea>
<hr>
</fieldset>
</div>
<br />
<input type="checkbox" class="sheet-secret-macro-show" name="attr_use-wealth-rules" value="1"/><span></span>
<div class="sheet-macro">
<div class="section-wealth">
<b>Wealth</b>
<br />
<button class="die-show" type="roll" name="roll_Wealth" title="Wealth-Check" value="@{who-skill} Wealth check: [[@{die_type} + @{Wealth}]]"></button>
<input type="number" name="attr_Wealth" title="Wealth" value="8"/>
<input class="sheet-no-border" type="text" name="attr_wealth-description" value="Middle Class" />
</div>
</div>
<br />
</div>
<!-- Equipment, Vehicles, and Headquarters -->
<div class="sheet-tab-content sheet-tab13 sheet-tab99">
<div class="section-equipment">
<b>Equipment, Vehicles, and Headquarters</b>
<fieldset class="repeating_equipment">
<button class="die-show" type="roll" name="attr_adv" title="adv" value="@{who-effects} &amp;{template:default} {{name=@{character_name} - @{name}}} {{@{description}}}" class="btn ui-draggable"></button>
<input type="number" name="attr_cost" title="repeating_equipment_X_cost" value="1"/>
<input type="text" name="attr_name" title="repeating_equipment_X_name" value="" placeholder="Name" />
<textarea name="attr_description" title="repeating_equipment_X_description" placeholder="Description"></textarea>
<hr>
</fieldset>
</div>
</div>
</div>
<!-- --------------------------------- -->
<!-- Page 3 (Options) -->
<!-- --------------------------------- -->
<div class="sheet-tab-content sheet-tab3">
<div class="section-import">
<b>Options</b>
<br />
</div>
<div class="section-options">
<div class="details-row">
<b>Roll Target - Stats: </b>
<label class="sheet-small-label1">
<select name="attr_who-stat" title="@{who-stat}">
<option value="@{character_name}'s">Public</option>
<option value="/em 's" selected>Public Emote</option>
<option value="/w gm @{character_name}'s">Whisper GM</option>
<option value="/w @{character_name}">Whisper Self</option>
</select>
</label>
</div>
<div class="details-row">
<b>Roll Target - Combat: </b>
<label class="sheet-small-label1">
<select name="attr_who-combat" title="@{who-combat}">
<option value="@{character_name}'s">Public</option>
<option value="/em 's" selected>Public Emote</option>
<option value="/w gm @{character_name}'s">Whisper GM</option>
<option value="/w @{character_name}">Whisper Self</option>
</select>
</label>
</div>
<div class="details-row">
<b>Roll Target - Initiative: </b>
<label class="sheet-small-label1">
<select name="attr_who-initiative" title="@{who-initiative}">
<option value=" ">Public</option>
<option value="/w gm " selected>Whisper GM</option>
<option value="/w @{character_name}">Whisper Self</option>
</select>
</label>
</div>
<div class="details-row">
<b>Roll Target - Skill: </b>
<label class="sheet-small-label1">
<select name="attr_who-skill" title="@{who-skill}">
<option value="@{character_name}'s">Public</option>
<option value="/em 's" selected>Public Emote</option>
<option value="/w gm @{character_name}'s">Whisper GM</option>
<option value="/w @{character_name}">Whisper Self</option>
</select>
</label>
</div>
<div class="details-row">
<b>Roll Target - Effects: </b>
<label class="sheet-small-label1">
<select name="attr_who-effects" title="@{who-effects}">
<option value="@{character_name}'s">Public</option>
<option value="/em 's" selected>Public Emote</option>
<option value="/w gm @{character_name}'s">Whisper GM</option>
<option value="/w @{character_name}">Whisper Self</option>
</select>
</label>
</div>
<div class="details-row">
<b>Dice Roll Type: </b>
<label class="sheet-small-label1">
<select name="attr_die_type" title="@{die_type}">
<option value="1d20" selected>Standard 1d20</option>
<option value="3d20k2dh1">3d20 Gamematers Guide</option>
<option value="3d6cs>16">Sum 3d6</option>
</select>
</label>
</div>
</div>
</div>
<div class="sheet-mnm-footer">
<img src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/Mutants%20and%20Masterminds%203E/logo_powered.png" class="sheet-mnm-logo">
</div>
</div>
<script type="text/worker">
["stats", "powers", "options"].forEach((button) => {
on(`clicked:${button}`, (eventinfo) => {
setAttrs({ tab: button });
});
});
["devices", "advantages", "equipment", "all"].forEach((button) => {
on(`clicked:${button}`, (eventinfo) => {
setAttrs({ subtab: button });
});
});
function clearLog() {
setAttrs({"output-message": "", "hide-output": "1"}, {silent: true});
}
function log(value) {
setAttrs({"output-message": value, "hide-output": "0"}, {silent: true});
console.log(value);
};
function pluralize(count, thing, singular, plural) {
if(!singular) {
singular = "";
}
if(!plural) {
plural = "s";
}
return count + " " + thing
+ (count == 1 ? singular : plural);
}
try {
var equipmentRowID = null;
/**
* @param repeatingName - The word that comes after "repeating_" in the
* attribute name. For instance, if you want to find
* "repeating_equipment_$0_name", then this should be "equipment".
*
* @param suffixes - An array of words identifying which parts of the
* repeating attribute you want. For instance, if you want
* "repeating_equipment_$0_name" and "repeating_equipment_$0_description",
* then this should be ["name", "description"].
*
* @param callback - A function that takes an array of objects. This
* will be called once the attributes have been found. Each object in
* the array will contain a property for each string in suffixes, mapped
* to the value of that attribute. The objects won't be in order, but
* they will include the repeating section id. If you passed the values
* mentioned above, then this might return the following array:
* [
* {id:"ABC", name:"Sword", description:""},
* {id:"DEF", name:"Shield", description:"A simple wooden buckler."}
* ]
*/
function getRepeatingAttributes(repeatingName, suffixes, callback) {
getSectionIDs("repeating_" + repeatingName, function(idArray) {
var attributeNames = [];
for(var suffix of suffixes) {
for(var id of idArray) {
attributeNames.push("repeating_" + repeatingName
+ "_" + id + "_" + suffix);
}
}
getAttrs(attributeNames, function(attributes) {
var result = [];
for(var id of idArray) {
var attributeSection = {id:id};
result.push(attributeSection);
for(var suffix of suffixes) {
attributeSection[suffix] = attributes["repeating_"
+ repeatingName + "_" + id + "_" + suffix];
}
}
callback(result);
});
});
}
/**
* Like getRepeatingAttributes, but puts the array in order.
*/
function getRepeatingAttributesOrdered(repeatingName, suffixes, callback) {
getRepeatingAttributes(repeatingName, suffixes, function(attributes) {
getSectionIDsOrdered(repeatingName, function(idsOrdered) {
var result = [];
for(var id of idsOrdered) {
for(var attribute of attributes) {
if(attribute.id === id) {
result.push(attribute);
break;
}
}
}
callback(result);
});
}, true);
}
function recountAll() {
console.log("Recounting everything:");
recountPowers(true);
recountAdvantages(recountEquipment);
}
/**
* @param calculateCost - Set this to true if all powers should be
* calculated, or to a row ID if you only want to recalculate one. Make
* sure to convert the row ID to lowercase if it isn't already (this
* will happen automatically if you extract it from eventInfo).
*/
function recountPowers(calculateCost, doneCallback) {
var suffixes;
if(calculateCost) {
suffixes = ["ranks", "points-per-rank", "misc-points", "total-cost",
"alternate-effect"];
} else {
suffixes = ["total-cost"];
}
getRepeatingAttributesOrdered("power", suffixes, function(powers) {
var total = 0;
for(var power of powers) {
if(calculateCost === true || calculateCost === power.id.toLowerCase()) {
power["total-cost"] = calculatePowerCost(powers, power);
}
total += parseInt(power["total-cost"]);
}
setAttrs({"power-points": total}, {silent: true});
console.log("Spent " + pluralize(total, "point") + " on powers.");
if(doneCallback) {
doneCallback();
}
});
}
/**
* Given a complete array of ordered powers and one entry out of that
* array, calculates the total cost of that power. This updates the
* attribute (asynchronously), and also updates the power object
* in-place.
*/
function calculatePowerCost(orderedPowers, power) {
var total = parseInt(power.ranks) * parseFloat(power["points-per-rank"])
+ parseInt(power["misc-points"]);
//If this is an alternate effect, find the effect it's based
//on and make sure this is cheaper (or the same price).
if(power["alternate-effect"] === "1" || power["alternate-effect"] === "2") {
var index = orderedPowers.indexOf(power);
if(index < 0) {
return parseInt(power["total-cost"]);
} else if(index == 0) {
log("Your first power can't be an alternate effect. Try rearranging your powers.");
let values = {};
values["repeating_power_" + power.id + "_alternate-effect"] = "0";
setAttrs(values, {silent: true});
return parseInt(power["total-cost"]);
}
for(var i = index - 1; i >= 0; i--) {
let effectStatus = orderedPowers[i]["alternate-effect"];
if(effectStatus !== "1" && effectStatus !== "2") {
//Check the cost.
if(total > parseInt(orderedPowers[i]["total-cost"])) {
log("An alternate effect can't cost more than the primary effect. (Current cost: "
+ total + ", maximum allowed cost: " + orderedPowers[i]["total-cost"] + ".)");
break;
} else {
//Success!
let values = {};
values["repeating_power_" + power.id + "_total-cost"] =
power["total-cost"] = power["alternate-effect"];
setAttrs(values, {silent: true});
return parseInt(power["total-cost"]);
}
} else if(i == 0) {
log("Your first power can't be an alternate effect. Try rearranging your powers.");
}
}
//If none was found or if the cost was wrong,
//then this isn't a valid alternate effect.
let values = {};
values["repeating_power_" + power.id + "_alternate-effect"] = "0";
setAttrs(values, {silent: true});
}
let values = {};
values["repeating_power_" + power.id + "_total-cost"] = "" + Math.ceil(total);
setAttrs(values, {silent: true});
console.log("Power " + orderedPowers.indexOf(power) + " costs " + Math.ceil(total));
return Math.ceil(total);
}
function recountAdvantages(doneCallback) {
getAttrs(["Wealth"], function(dict) {
var wealth = 8;
if(dict["Wealth"]) {
wealth = parseInt(dict["Wealth"]);
}
if(!wealth || wealth < 0) {
wealth = 0;
setAttrs({Wealth:0});
}
getRepeatingAttributes("advantage", ["name", "ranks"], function(advantages) {
var total = Math.ceil(wealth / 4) - 2;
equipmentRowID = null;
for(var advantage of advantages) {
total += parseInt(advantage.ranks);
if(advantage.name && advantage.name.toLowerCase() === "equipment") {
equipmentRowID = advantage.id;
var ranks = parseInt(advantage.ranks);
if(ranks) {
setAttrs({"equipment-points":ranks * 5}, {silent: true});
} else {
setAttrs({"equipment-points":5}, {silent: true});
}
}
}
setAttrs({"advantage-points": total}, {silent: true});
console.log("Spent " + pluralize(total, "point") + " on advantages.");
if(doneCallback) {
doneCallback();
}
});
});
}
function recountEquipment(doneCallback) {
getRepeatingAttributes("equipment", ["cost"], function(equipment) {
var total = 0;
for(var e of equipment) {
total += parseInt(e.cost);
}
getAttrs(["equipment-points"], function(attr) {
var maximum = 0;
if(attr["equipment-points"]) {
maximum = parseInt(attr["equipment-points"]);
}
if(total > maximum) {
var ranks = Math.ceil(total / 5);
log("Buying " + pluralize(total, "point") + " of equipment requires "
+ pluralize(ranks, "rank") + " of the Equipment advantage.");
} else {
getAttrs(["output-message"], function(dict) {
if(dict["output-message"].endsWith(" of the Equipment advantage.")) {
clearLog();
}
});
}
if(doneCallback) {
doneCallback();
}
});
});
}
on("sheet:opened", function() {
clearLog();
getAttrs(["equipment-points"], function(attr) {
if(!attr["equipment-points"]) {
recountAll();
} else {
getRepeatingAttributes("advantage", ["name"], function(advantages) {
for(var advantage of advantages) {
if(advantage.name.toLowerCase() === "equipment") {
equipmentRowID = advantage.id;
break;
}
}
});
}
});
});
function getSectionIDsOrdered(sectionName, callback) {
'use strict';
getAttrs([`_reporder_repeating_${sectionName}`], function(v) {
getSectionIDs(sectionName, function(idArray) {
let reporderArray = v[`_reporder_repeating_${sectionName}`]
? v[`_reporder_repeating_${sectionName}`].toLowerCase().split(',') : [],
ids = [...new Set(reporderArray.filter(x => idArray.includes(x)).concat(idArray))];
callback(ids);
});
});
}
on("change:repeating_power:name", function(eventInfo) {
if(eventInfo.sourceType !== "sheetworker"
//These values are only ever equal when the attribute is first set.
&& eventInfo.newValue == eventInfo.previousValue) {
var rowID = eventInfo.sourceAttribute.substr("repeating_power_".length, 20);
recountPowers(rowID);
}
});
on("change:repeating_power:ranks change:repeating_power:points-per-rank "
+ "change:repeating_power:misc-points change:repeating_power:alternate-effect", function(eventInfo) {
if(eventInfo.sourceType !== "sheetworker") {
var rowID = eventInfo.sourceAttribute.substr("repeating_power_".length, 20);
recountPowers(rowID);
}
});
on("change:repeating_power:total-cost remove:repeating_power", function(eventInfo) {
if(eventInfo.sourceType !== "sheetworker") {
recountPowers();
}
});
on("change:repeating_advantage:ranks", function(eventInfo) {
if(eventInfo.sourceType !== "sheetworker") {
if(eventInfo.sourceAttribute.toLowerCase().indexOf(equipmentRowID) >= 0) {
recountAdvantages(recountEquipment);
} else {
recountAdvantages();
}
}
});
on("change:repeating_advantage:name", function(eventInfo) {
if(eventInfo.previousValue.toLowerCase() === "equipment") {
setAttrs({"equipment-points":0}, function() {
recountAdvantages(recountEquipment);
});
} else if(eventInfo.newValue.toLowerCase() === "equipment"
|| eventInfo.sourceType !== "sheetworker"
&& eventInfo.newValue == eventInfo.previousValue) {
recountAdvantages(recountEquipment);
}
});
on("remove:repeating_advantage", function(eventInfo) {
if(eventInfo.sourceAttribute.toLowerCase().indexOf(equipmentRowID) >= 0) {
setAttrs({"equipment-points":0}, function() {
recountAdvantages(recountEquipment);
});
} else {
recountAdvantages();
}
});
on("change:Wealth", function(eventInfo) {
if(eventInfo.sourceType !== "sheetworker") {
if(eventInfo.newValue !== undefined) {
onGotNewValue({Wealth:eventInfo.newValue});
} else {
getAttrs(["Wealth"], onGotNewValue);
}
function onGotNewValue(data) {
var wealth = parseInt(data["Wealth"]);
var description;
if(wealth <= 0) {
description = "Impoverished";
} else if(wealth <= 4) {
description = "Struggling";
} else if(wealth <= 10) {
description = "Middle Class";
} else if(wealth <= 15) {
description = "Affluent";
} else if(wealth <= 20) {
description = "Wealthy";
} else if(wealth <= 30) {
description = "Rich";
} else {
description = "Filthy Rich";
}
setAttrs({"wealth-description": description}, {silent: true});
recountAll();
}
}
});
on("change:repeating_equipment:name", function(eventInfo) {
if(eventInfo.sourceType !== "sheetworker"
&& eventInfo.newValue == eventInfo.previousValue) {
recountEquipment();
}
});
on("change:repeating_equipment:cost remove:repeating_equipment", function(eventInfo) {
if(eventInfo.sourceType !== "sheetworker") {
recountEquipment();
}
});
on("change:output-message", function(eventInfo) {
if(eventInfo.sourceType !== "sheetworker") {
clearLog();
}
});
} catch(e) {
log("Encountered an error: " + e);
}
</script>