Files
roll20-character-sheets/Cyberpunk Red/CyberpunkRed.html
T
2024-06-03 13:15:14 -04:00

227 lines
11 KiB
HTML

<div class="main">
<div class="header flex-center section">
<input type="hidden" name="attr_version" value="1" />
<h1><em>Cyberpunk Red</em></h1>
<span data-i18n="character-sheet">Character Sheet</span>
<div>&nbsp;</div>
<label><span data-i18n="roll-initiative">Roll initiative:</span><button type="roll" name="roll_initiative" value="&{template:initiative} {{name=@{character_name}}} {{rollname=initiative}} {{theroll=[[1d10+@{ref} &{tracker}]]}}" class="skillroll"></label>
</div>
<div class="common section">
<label data-i18n="character-name">Character name:</label><input name="attr_character_name" type="text" />
<label data-i18n="character-role">Role:</label><input name="attr_type" type="text" />
</div>
<div class="stats section flex-row">
<span><label data-i18n="INT">INT </label><input type="number" name="attr_int" value="" class="inputstats" /></span>
<span><label data-i18n="REF">REF </label><input type="number" name="attr_ref" value="" class="inputstats" /></span>
<span><label data-i18n="DEX">DEX </label><input type="number" name="attr_dex" value="" class="inputstats" /></span>
<span><label data-i18n="TECH">TECH </label><input type="number" name="attr_tech" value="" class="inputstats" /></span>
<span><label data-i18n="COOL">COOL </label><input type="number" name="attr_cool" value="" class="inputstats" /></span>
<span><label data-i18n="WILL">WILL </label><input type="number" name="attr_will" value="" class="inputstats" /></span>
<span><label data-i18n="LUCK">LUCK </label><input type="number" name="attr_luck_max" value="" class="inputstats" /></span>
<span><label data-i18n="MOVE">MOVE </label><input type="number" name="attr_move" value="" class="inputstats" /></span>
<span><label data-i18n="BODY">BODY </label><input type="number" name="attr_body" value="" class="inputstats" /></span>
<span><label data-i18n="EMP">EMP </label><input type="number" name="attr_emp" value="" class="inputstats" /></span>
</div>
<div class="hits section flex-row">
<span><label data-i18n="current-hp">Current HP</label><input name="attr_hp" type="number" style="font-weight:bold" /></span>
<span class="spacer">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span><label data-i18n="starting-hp">Starting HP</label><input name="attr_hp_max" type="number" /></span>
<span class="spacer">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span><label data-i18n="seriously-wounded">Seriously Wounded</label><input name="attr_seriouslywounded" type="number" /></span>
<span class="spacer">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span><label data-i18n="death-saves">Death Saves</label><input name="attr_deathsaves" type="number" value="0" />
<button type="roll" name="act_deathsave" value="&{template:cprdeathsave} {{name=@{character_name}}} {{rollname=Death Save}} {{theroll=[[1d10+@{deathsaves}]]}} {{bodystat=[[@{body}]]}}" class="skillroll"></span>
<span class="spacer">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span><label data-i18n="remaining-luck">Remaining Luck</label><input name="attr_luck" type="number" style="font-weight:bold" /></span>
</div>
<div class="skills section">
<label data-i18n="skills">Skills</label><input name="attr_skillinfocheck" class="skillinfocheck" type="checkbox"/><span> Show help</span>
<span class="skillinfo">
<p/>
<p>Due to a limitation of Roll20's dice expressions, this sheet's roll
template uses a workaround to support crits and fumbles in skill rolls.
The sheet may appear to be rolling 1d8+1, or rolling a constant number,
when it's really rolling 1d10. Behind the scenes, this is what
the sheet does with skill rolls:</p>
<ol>
<li>It rolls (all at once) 1d10, 1-1d10, 10+1d10, and 1d8+1.</li>
<li>If the first d10 is a 1, the result is the 1-1d10 (a fumble).</li>
<li>If the first d10 is a 10, the result is the 10+1d10 (a crit).</li>
<li>Otherwise it's the 1d8+1 (a number between 2 and 9, neither a fumble nor a crit).</li>
</ol>
<p>Statistically this works out correctly for skill rolls in Cyberpunk Red.</p>
</span>
<fieldset class="repeating_skills">
<input name="attr_skill" class="skill" type="text" />
<select name="attr_skillstat" class="skillstat">
<option value="0">-</option>
<option data-i18n="INT" value="@{int}">INT</option>
<option data-i18n="REF" value="@{ref}">REF</option>
<option data-i18n="DEX" value="@{dex}">DEX</option>
<option data-i18n="TECH" value="@{tech}">TECH</option>
<option data-i18n="COOL" value="@{cool}">COOL</option>
<option data-i18n="WILL" value="@{will}">WILL</option>
<option data-i18n="LUCK" value="@{luck}">LUCK</option>
<option data-i18n="MOVE" value="@{move}">MOVE</option>
<option data-i18n="BODY" value="@{body}">BODY</option>
<option data-i18n="EMP" value="@{emp}">EMP</option>
</select>
<input name="attr_skillbonus" type="number" value="0" />
<button type="roll" name="roll_skill" value="&{template:cprskill} {{name=@{character_name}}} {{rollname=@{skill}}} {{theroll=[[1d10]]}} {{normalroll=[[1d8+1+@{skillstat}+@{skillbonus}]]}} {{critroll=[[10+1d10+@{skillstat}+@{skillbonus}]]}} {{fumbleroll=[[1-1d10+@{skillstat}+@{skillbonus}]]}}" class="skillroll">
</button>
</fieldset>
</div>
<div class="armor section">
<label data-i18n="Armor">Armor</label>
<fieldset class="repeating_armor">
<input name="attr_armor" type="text" class="armorname" />
<div class="flex-row">
<label><span data-i18n="armor-head">Head:</span>: <input name="attr_armorhead" type="number" style="display:inline"></label>
<label><span data-i18n="armor-body">Body:</span>: <input name="attr_armorbody" type="number" style="display:inline"></label>
</div>
</fieldset>
</div>
<div class="weapons section">
<label data-i18n="weapons">Weapons</label>
<fieldset class="repeating_weapon">
<label><span data-i18n="weapon-name">Name:</span>: <input name="attr_weapon" type="text" /></label>
<label><span data-i18n="weapon-damage">Damage:</span>: <input name="attr_weapondamage" type="text" class="weapondamage" />
<button type="roll" name="roll_damage" value="&{template:default} {{name=@{weapon}}} {{damage=[[@{weapondamage}]]}}" class="damageroll"></label>
</fieldset>
</div>
<div class="life section flex-col">
<label data-i18n="background">Background</label>
<textarea name="attr_background" onkeyup="this.style.height = '1px';this.style.height=(25+this.scrollHeight)+'px';"></textarea>
<label data-i18n="motivation">Motivation</label>
<textarea name="attr_motivation"></textarea>
<label data-i18n="goals">Goals</label>
<textarea name="attr_goals"></textarea>
<label data-i18n="friends">Friends</label>
<textarea name="attr_friends"></textarea>
<label data-i18n="enemies">Enemies</label>
<textarea name="attr_enemies"></textarea>
<label data-i18n="romance">Romance</label>
<textarea name="attr_romance"></textarea>
<label data-i18n="personality">Personality</label>
<textarea name="attr_personality"></textarea>
</div>
<div class="equipment section flex-col">
<div class="cyberware">
<label data-i18n="cyberware">Cyberware</label>
<fieldset class="repeating_cyberware">
<textarea name="attr_cyberware"></textarea>
</fieldset>
</div>
<div class="gear">
<label data-i18n="gear">Gear</label>
<fieldset class="repeating_gear">
<textarea name="attr_gear"></textarea>
</fieldset>
</div>
</div>
</div>
<rolltemplate class="sheet-rolltemplate-initiative">
<table class="template-container">
<caption class="template-header">{{name}} rolls{{#rollname}} {{rollname}}{{/rollname}}</caption>
<tr class="roll">
<td class="normalroll">
{{theroll}}
</td>
</tr>
</table>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-cprskill">
<table class="template-container">
<caption class="template-header">{{name}} rolls{{#rollname}} {{rollname}}{{/rollname}}</caption>
<tr class="roll">
{{#rollWasCrit() theroll}}
<td class="critroll">
{{critroll}}
</td>
{{/rollWasCrit() theroll}}
{{#rollWasFumble() theroll}}
<td class="fumbleroll">
{{fumbleroll}}
</td>
{{/rollWasFumble() theroll}}
{{#rollBetween() theroll 2 9}}
<td class="normalroll">
{{normalroll}}
</td>
{{/rollBetween() theroll 2 9}}
</tr>
</table>
</rolltemplate>
<rolltemplate class="sheet-rolltemplate-cprdeathsave">
<table class="template-container">
<caption class="template-header">{{rollname}}</caption>
<tr class="roll">
<td class="normalroll">
{{#rollLess() theroll bodystat}}
{{theroll}} <span class="alive">{{name}} is still alive!</span>
{{/rollLess() theroll bodystat}}
{{#^rollLess() theroll bodystat}}
{{theroll}} <span class="dead">{{name}} is DEAD ☠️</span>
{{/^rollLess() theroll bodystat}}
</td>
</tr>
</table>
</rolltemplate>
<script type="text/worker">
var currentVersion = 7;
on('sheet:opened', function() {
getAttrs(["version"], function(values) {
v = values.version;
if (v < 2) {
getSectionIDs(["skills"], function(idarray) {
getAttrs(idarray.map(i => "repeating_skills_" + i + "_skillstat"),
function(values) {
for (var key in Object.keys(values)) {
var k = Object.keys(values)[key];
var v = values[k];
var obj = {};
if (v == 0) {
obj[k] = "@{int}";
} else {
obj[k] = v.split(" ")[0];
}
setAttrs(obj);
}
});
});
}
if (v < 3) {
getAttrs(["luck"], function(values) {
setAttrs({
"luck_max": values["luck"],
});
});
}
if (v < 4) {
getAttrs(["body"], function(values) {
setAttrs({
"hp_max": values.body * 5,
});
});
}
if (v < currentVersion) {
setAttrs({
"version": currentVersion,
});
}
});
});
on("change:body", function() {
getAttrs(["body"], function(values) {
setAttrs({
hp_max: values.body * 5,
seriouslywounded: Math.ceil((values.body * 5) / 2),
});
});
});
</script>