Files
roll20-character-sheets/Basic Fantasy RPG/BFRPGsheet.html
T
2024-06-03 13:15:14 -04:00

508 lines
17 KiB
HTML

<!--
Basic Fantasy Role-Playing Game Character Sheet
-->
<div class=bfrpgsheet>
<div class='floater'>
<label>Name</label>
<input type=text width=50 class='wide' name="attr_name" />
<br>
<label>Race</label>
<input type=text width=20 class='wide' name="attr_race" />
<br>
<label>Class</label>
<input type=text width=20 class='medium' name="attr_class" />
<label>Level</label>
<input type=number width=5 name="attr_level" />
</div>
<div class='floater'>
<label class='medium'>Gender</label>
<input type=text width=10 class='narrow' name="attr_gender" />
<label class='basic'>Age</label>
<input type=number width=10 class=shortnum name="attr_age" />
<br>
<label class='medium'>Height</label>
<input type=text width=10 class=medium name="attr_height" />
<br>
<label class='medium'>Weight</label>
<input type=text width=10 class=medium name="attr_weight" />
</div>
<hr>
<div class='floater'>
<div class='attrgrid'>
<div>
<label>Attribute</label>
</div>
<div>
<label>Value</label>
</div>
<div>
<label>Bonus</label>
</div>
<div>
<label>Strength</label>
</div>
<div>
<input type=number width=5 class=fillbox name="attr_STR" class=shortnum />
</div>
<div>
<input type=number width=5 class=fillbox name="attr_STRbonus" />
</div>
<div>
<label>Intelligence</label>
</div>
<div>
<input type=number width=5 class=fillbox name="attr_INT" class=shortnum />
</div>
<div>
<input type=number width=5 class=fillbox name="attr_INTbonus" />
</div>
<div>
<label>Wisdom</label>
</div>
<div>
<input type=number width=5 class=fillbox name="attr_WIS" class=shortnum />
</div>
<div>
<input type=number width=5 class=fillbox name="attr_WISbonus" />
</div>
<div>
<label>Dexterity</label>
</div>
<div>
<input type=number width=5 class=fillbox name="attr_DEX" class=shortnum />
</div>
<div>
<input type=number width=5 class=fillbox name="attr_DEXbonus" />
</div>
<div>
<label>Constitution</label>
</div>
<div>
<input type=number width=5 class=fillbox name="attr_CON" class=shortnum />
</div>
<div>
<input type=number width=5 class=fillbox name="attr_CONbonus" />
</div>
<div>
<label>Charisma</label>
</div>
<div>
<input type=number width=5 class=fillbox name="attr_CHA" class=shortnum />
</div>
<div>
<input type=number width=5 class=fillbox name="attr_CHAbonus" />
</div>
</div>
</div>
<div class='floater'>
<label>Combat</label><br>
<label>AC</label>
<input name="attr_ac" style="width: 14em;" type="text"><br>
<label>HP</label>
<input name="attr_hp_max" style="width: 7em;" type="text">
<input name="attr_hp" style="width: 6em;" type="text"><br>
<label>AB</label>
<input name="attr_ab_normal" style="width: 14em;" type="text"><br>
<label>Melee</label>
<input name="attr_ab_melee" class="narrow" type="number" />
<button type=roll value="/roll 1d20+@{ab_melee}+@{combat_adjust}"></button>
+<input name="attr_combat_adjust" class="narrow" type="number"><br>
<label>Missile</label>
<input name="attr_ab_missile" class="narrow" type="number" />
<button type=roll value="/roll 1d20+@{ab_missile}+@{combat_adjust}"></button><br>
<label>Move</label>
<input name="attr_movement" class="medium" type="text">
</div>
<hr>
<div class=weapons>
<label>Weapons</label>
<div class=weaponsblock>
<span><label>Name</label></span>
<span><label>Total AB</label></span>
<span><label>Damage</label></span>
<span><label>Range</label></span>
<span><label>Notes</label></span>
</div>
<fieldset class=repeating_weapons>
<div class=weaponsblock>
<span><input type=text name=attr_weaponname /></td></span>
<span>
<input type=text name=attr_weaponab class=weaponab />
<button type=roll value="/roll 1d20+@{weaponab}+@{combat_adjust}"></button>
</span>
<span>
<input type=text name=attr_weapondamage class=weaponab />
<button type=roll value="/roll @{weapondamage}"></button>
</span>
<span><input type=text name=attr_weaponrange /></span>
<span><input type=text name=attr_weaponnotes /></span>
</div>
</fieldset>
</div>
<hr>
<div class='floater'>
<div>
<label>Equipment</label>
<br>
<textarea name="attr_equipment"></textarea>
</div>
</div>
<div class='floater'>
<div>
<label>Money</label>
<br>
<textarea name="attr_money"></textarea>
</div>
</div>
<hr>
<div class='floater'>
<div>
<label class=wide>Experience</label>
<br>
<label class=wide>Current XP</label>
<input name="attr_currentxp" type="text" class=medium>
<br>
<label class=wide>XP for Next Level</label>
<input name="attr_xpnextlevel" type="text" class=medium>
</div>
<hr>
<div>
<label class=wide>Thief Abilities</label>
<input type=checkbox name="attr_showthiefabilities" class=showthiefabilities value=1 />
<br>
<div class=thiefabilitiesblock>
<label class=wide>Open Locks</label>
<input name="attr_openlocks" type="text" class=narrow>
<button type=roll value="/roll 1d100<@{openlocks}"></button>
<br>
<label class=wide>Remove Traps</label>
<input name="attr_removetraps" type="text" class=narrow>
<button type=roll value="/roll 1d100<@{removetraps}"></button>
<br>
<label class=wide>Pick Pockets</label>
<input name="attr_pickpockets" type="text" class=narrow>
<button type=roll value="/roll 1d100<@{pickpockets}"></button>
<br>
<label class=wide>Move Silently</label>
<input name="attr_movesilently" type="text" class=narrow>
<button type=roll value="/roll 1d100<@{movesilently}"></button>
<br>
<label class=wide>Climb Walls</label>
<input name="attr_climbwalls" type="text" class=narrow>
<button type=roll value="/roll 1d100<@{climbwalls}"></button>
<br>
<label class=wide>Hide</label>
<input name="attr_hide" type="text" class=narrow>
<button type=roll value="/roll 1d100<@{hide}"></button>
<br>
<label class=wide>Listen</label>
<input name="attr_listen" type="text" class=narrow>
<button type=roll value="/roll 1d100<@{listen}"></button>
</div>
</div>
<hr>
<div>
<label>Spells</label>
<input type=checkbox name="attr_showspells" class=showspells value=1 />
<br>
<div class=spellsblock>
<label>Level</label>
<span class=spellcolumn><label class=basic>1</label></span>
<span class=spellcolumn><label class=basic>2</label></span>
<span class=spellcolumn><label class=basic>3</label></span>
<span class=spellcolumn><label class=basic>4</label></span>
<span class=spellcolumn><label class=basic>5</label></span>
<span class=spellcolumn><label class=basic>6</label></span>
<br>
<label>Number</label>
<span class=spellcolumn><input type="number" name="attr_level1spells" class='shortnum'></span>
<span class=spellcolumn><input type="number" name="attr_level2spells" class='shortnum spellcolumn'></span>
<span class=spellcolumn><input type="number" name="attr_level3spells" class='shortnum spellcolumn'></span>
<span class=spellcolumn><input type="number" name="attr_level4spells" class='shortnum spellcolumn'></span>
<span class=spellcolumn><input type="number" name="attr_level5spells" class='shortnum spellcolumn'></span>
<span class=spellcolumn><input type="number" name="attr_level6spells" class='shortnum spellcolumn'></span>
<br>
<textarea name="attr_spells"></textarea>
</div>
</div>
</div>
<div class='floater'>
<div>
<label class=extrawide>Saving Throws</label>
<br>
<label class=extrawide>Death Ray or Poison</label>
<input name="attr_deathrayorpoison" type="number" class=narrow>
<button type=roll value="/roll 1d20>@{deathrayorpoison}"></button>
<br>
<label class=extrawide>Magic Wands</label>
<input name="attr_magicwands" type="number" class=narrow>
<button type=roll value="/roll 1d20>@{magicwands}"></button>
<br>
<label class=extrawide>Paralysis or Petrification</label>
<input name="attr_paralysispetrification" type="number" class=narrow>
<button type=roll value="/roll 1d20>@{paralysispetrification}"></button>
<br>
<label class=extrawide>Dragon Breath</label>
<input name="attr_dragonbreath" type="number" class=narrow>
<button type=roll value="/roll 1d20>@{dragonbreath}"></button>
<br>
<label class=extrawide>Rods, Staves, and Spells</label>
<input name="attr_rodsstavesspells" type="number" class=narrow>
<button type=roll value="/roll 1d20>@{rodsstavesspells}"></button>
</div>
<hr>
<div>
<label class=extrawide>Turn Undead</label>
<input type=checkbox name="attr_showturnundead" class=showturnundead value=1 />
<div class=turnundeadblock>
<label class=extrawide>Skeleton</label>
<input name="attr_turnskeleton" type="number" class=narrow />
<button type=roll value="/roll 1d20>@{turnskeleton}"></button>
<br>
<label class=extrawide>Zombie</label>
<input name="attr_turnzombie" type="number" class=narrow />
<button type=roll value="/roll 1d20>@{turnzombie}"></button>
<br>
<label class=extrawide>Ghoul</label>
<input name="attr_turnghoul" type="number" class=narrow />
<button type=roll value="/roll 1d20>@{turnghoul}"></button>
<br>
<label class=extrawide>Wight</label>
<input name="attr_turnwight" type="number" class=narrow />
<button type=roll value="/roll 1d20>@{turnwight}"></button>
<br>
<label class=extrawide>Wraith</label>
<input name="attr_turnwraith" type="number" class=narrow />
<button type=roll value="/roll 1d20>@{turnwraith}"></button>
<br>
<label class=extrawide>Mummy</label>
<input name="attr_turnmummy" type="number" class=narrow />
<button type=roll value="/roll 1d20>@{turnmummy}"></button>
<br>
<label class=extrawide>Spectre</label>
<input name="attr_turnspectre" type="number" class=narrow />
<button type=roll value="/roll 1d20>@{turnspectre}"></button>
<br>
<label class=extrawide>Vampire</label>
<input name="attr_turnvampire" type="number" class=narrow />
<button type=roll value="/roll 1d20>@{turnvampire}"></button>
</div>
</div>
<hr>
<div>
<label class=wide>Notes</label>
<br>
<textarea name="attr_notes"></textarea>
</div>
</div>
<hr>
<b>Basic Fantasy RPG Character Sheet for Roll20</b> Release 3
</div>
<script type="text/worker">
// following two data structures are specifically for importing data from the expanded character sheet.
// this is necessarily an incomplete process but should get the most important bits, sadly excluding
// equipment and treasure.
var newfields = [
"charisma", "charisma_mod", "constitution", "constitution_mod", "dexterity",
"dexterity_mod", "intelligence", "intelligence_mod", "strength", "strength_mod",
"wisdom", "wisdom_mod", "ab", "AC", "age", "class", "CWskill_rank",
"current_xp", "save_death_ray", "save_dragons_breath", "height", "Hskill_rank",
"HP", "HP_max", "level", "spell_slots_l1", "spell_slots_l2", "spell_slots_l3",
"spell_slots_l4", "spell_slots_l5", "spell_slots_l6", "Lskill_rank",
"save_magic_wand", "move_encounter", "MSskill_rank", "character_name",
"OL_skill_rank", "save_paralysis", "PPskill_rank", "race", "RTskill_rank",
"save_spell", "turnghoulvalue", "turnmummyvalue", "turnskeletonvalue",
"turnspectrevalue", "turnvampirevalue", "turnwightvalue", "turnwraithvalue",
"turnzombievalue", "weight", "xp_next_level"
];
fieldmap = {
"CHA": "charisma",
"CHAbonus": "charisma_mod",
"CON": "constitution",
"CONbonus": "constitution_mod",
"DEX": "dexterity",
"DEXbonus": "dexterity_mod",
"INT": "intelligence",
"INTbonus": "intelligence_mod",
"STR": "strength",
"STRbonus": "strength_mod",
"WIS": "wisdom",
"WISbonus": "wisdom_mod",
"ab_normal": "ab",
"ac": "AC",
"age": "age",
"class": "class",
"climbwalls": "CWskill_rank",
"currentxp": "current_xp",
"deathrayorpoison": "save_death_ray",
"dragonbreath": "save_dragons_breath",
"height": "height",
"hide": "Hskill_rank",
"hp": "HP",
"hp_max": "HP_max",
"level": "level",
"level1spells": "spell_slots_l1",
"level2spells": "spell_slots_l2",
"level3spells": "spell_slots_l3",
"level4spells": "spell_slots_l4",
"level5spells": "spell_slots_l5",
"level6spells": "spell_slots_l6",
"listen": "Lskill_rank",
"magicwands": "save_magic_wand",
"movement": "move_encounter",
"movesilently": "MSskill_rank",
"name": "character_name",
"openlocks": "OL_skill_rank",
"paralysispetrification": "save_paralysis",
"pickpockets": "PPskill_rank",
"race": "race",
"removetraps": "RTskill_rank",
"rodsstavesspells": "save_spell",
"turnghoul": "turnghoulvalue",
"turnmummy": "turnmummyvalue",
"turnskeleton": "turnskeletonvalue",
"turnspectre": "turnspectrevalue",
"turnvampire": "turnvampirevalue",
"turnwight": "turnwightvalue",
"turnwraith": "turnwraithvalue",
"turnzombie": "turnzombievalue",
"weight": "weight",
"xpnextlevel": "xp_next_level"
};
const ability_table = {
3: "-3",
4: "-2",
5: "-2",
6: "-1",
7: "-1",
8: "-1",
9: "+0",
10: "+0",
11: "+0",
12: "+0",
13: "+1",
14: "+1",
15: "+1",
16: "+2",
17: "+2",
18: "+3"
};
// getting "unexpanded" here to check for expanded sheet conversion
const scores = [ "unexpanded", "STR", "INT", "WIS", "DEX", "CON", "CHA" ];
var updatesheet = function() {
getAttrs([ "STRbonus", "DEXbonus", "ab_normal" ], function(values) {
var AB = parseInt(values["ab_normal"]);
updates = {
"ab_melee": parseInt(values["STRbonus"]) + AB,
"ab_missile": parseInt(values["DEXbonus"]) + AB
};
setAttrs(updates, "silent");
});
}
on("sheet:opened", function () {
var updates = {};
getAttrs(scores, function(values) {
if(values["unexpanded"] != '1') {
// need to update from expanded sheet
getAttrs(newfields, function(values) {
var updates = { "unexpanded": "1" };
for(k of Object.keys(fieldmap)) {
var v = values[fieldmap[k]];
if(v != undefined && (v+"") != "") {
updates[k] = values[fieldmap[k]] + "";
}
}
setAttrs(updates);
});
} else {
for(score in values) {
var bonus = score + "bonus";
var value = ability_table[parseInt(values[score])];
updates[bonus] = parseInt(value);
}
setAttrs(updates, "silent");
updatesheet();
}
});
});
on("change:STR change:INT change:WIS change:DEX change:CON change:CHA", function(ev) {
var score = ev.sourceAttribute.toUpperCase();
var bonus = score + "bonus";
var updates = {};
getAttrs([ score ], function(values) {
updates[bonus] = parseInt(ability_table[parseInt(values[score])]);
setAttrs(updates, "silent");
updatesheet();
});
});
</script>
<!-- end of sheet -->