Files
roll20-character-sheets-tester/Cyberpunk Red/CyberpunkRed.html
T
Rúnar f3a144ec64 [Cyberpunk Red] fix bug with initiative rolls (#5474)
* Cyberpunk Red Jumpstart Kit character sheet

* Minor correction to JSON

* Added inline help for surprising skill rolls.

* Fixed issue with initiative rolls
2019-09-23 15:56:25 -05:00

215 lines
9.4 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>Character Sheet</span>
<div>&nbsp;</div>
<label>Roll initiative: <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>Character name:</label><input name="attr_character_name" type="text" />
<label>Role:</label><input name="attr_type" type="text" />
</div>
<div class="stats section flex-row">
<span><label>INT </label><input type="number" name="attr_int" value="" class="inputstats" /></span>
<span><label>REF </label><input type="number" name="attr_ref" value="" class="inputstats" /></span>
<span><label>DEX </label><input type="number" name="attr_dex" value="" class="inputstats" /></span>
<span><label>TECH </label><input type="number" name="attr_tech" value="" class="inputstats" /></span>
<span><label>COOL </label><input type="number" name="attr_cool" value="" class="inputstats" /></span>
<span><label>WILL </label><input type="number" name="attr_will" value="" class="inputstats" /></span>
<span><label>LUCK </label><input type="number" name="attr_luck_max" value="" class="inputstats" /></span>
<span><label>MOVE </label><input type="number" name="attr_move" value="" class="inputstats" /></span>
<span><label>BODY </label><input type="number" name="attr_body" value="" class="inputstats" /></span>
<span><label>EMP </label><input type="number" name="attr_emp" value="" class="inputstats" /></span>
</div>
<div class="hits section flex-row">
<span><label>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>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>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>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>Remaining Luck</label><input name="attr_luck" type="number" style="font-weight:bold" /></span>
</div>
<div class="skills section">
<label>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 value="@{int}">INT</option>
<option value="@{ref}">REF</option>
<option value="@{dex}">DEX</option>
<option value="@{tech}">TECH</option>
<option value="@{cool}">COOL</option>
<option value="@{will}">WILL</option>
<option value="@{luck}">LUCK</option>
<option value="@{move}">MOVE</option>
<option value="@{body}">BODY</option>
<option 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>Armor</label>
<fieldset class="repeating_armor">
<input name="attr_armor" type="text" class="armorname" />
<div class="flex-row">
<label>Head: <input name="attr_armorhead" type="number" style="display:inline"></label>
<label>Body: <input name="attr_armorbody" type="number" style="display:inline"></label>
</div>
</fieldset>
</div>
<div class="weapons section">
<label>Weapons</label>
<fieldset class="repeating_weapon">
<label>Name: <input name="attr_weapon" type="text" /></label>
<label>Damage: <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>Background</label>
<textarea name="attr_background" onkeyup="this.style.height = '1px';this.style.height=(25+this.scrollHeight)+'px';"></textarea>
<label>Motivation</label>
<textarea name="attr_motivation"></textarea>
<label>Goals</label>
<textarea name="attr_goals"></textarea>
<label>Friends</label>
<textarea name="attr_friends"></textarea>
<label>Enemies</label>
<textarea name="attr_enemies"></textarea>
<label>Romance</label>
<textarea name="attr_romance"></textarea>
<label>Personality</label>
<textarea name="attr_personality"></textarea>
</div>
<div class="gear section">
<label>Gear</label>
<fieldset class="repeating_gear">
<textarea name="attr_gear"></textarea>
</fieldset>
</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>