mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 19:52:29 +00:00
* Update Fate Core sheet based on user feedback. https://app.roll20.net/forum/post/7284174/fix-the-fate-core-sheets/ * Add an options menu. * Explain how to delete certain items. * Improve options menu. You can now set the number of stress boxes in every single track you create, and the option descriptions are less prescriptive. * Add negative skills and fix legacy data bug. Poor and terrible skills are available again (via the options menu), and if a legacy stress track is copied over, there will now be options for it. * Bug fix: editing a governing skill doesn't update stress. * Allow setting one or zero stress boxes per track.
1076 lines
57 KiB
HTML
1076 lines
57 KiB
HTML
<script type="text/worker">
|
||
var log = function(value) {
|
||
console.log(value);
|
||
};
|
||
|
||
try {
|
||
var numberMatcher = /^\d+$/;
|
||
|
||
//Breaks a string into the pieces needed to identify a repeating attribute.
|
||
//Sample usage:
|
||
//var repeatingMatch = repeatingMatcher(string);
|
||
//if(repeatingMatch)
|
||
// getRepeatingAttributes(repeatingMatch[1], [repeatingMatch[2]], callback);
|
||
var repeatingMatcher = /repeating_(\w+)_(\w+)/;
|
||
|
||
//A cache of lots of different values.
|
||
var cache = {};
|
||
|
||
//Fate's ladder, except only the values that have associated attributes.
|
||
var ladder = [null, "Avg", "Fair", "Good", "Great", "Sup", "Fan", "Epic", "Leg"];
|
||
|
||
//All attributes in the skill pyramid.
|
||
var skillAttributes = [];
|
||
for(var rung of ladder) {
|
||
if(rung) {
|
||
for(var i = 1; i <= 8; i++) {
|
||
skillAttributes.push(rung + i);
|
||
}
|
||
}
|
||
}
|
||
|
||
function getSectionIDsOrdered(sectionName, callback) {
|
||
'use strict';
|
||
getAttrs([`_reporder_${sectionName}`], function (v) {
|
||
getSectionIDs(sectionName, function (idArray) {
|
||
let reporderArray = v[`_reporder_${sectionName}`] ? v[`_reporder_${sectionName}`].toLowerCase().split(',') : [],
|
||
ids = [...new Set(reporderArray.filter(x => idArray.includes(x)).concat(idArray))];
|
||
callback(ids);
|
||
});
|
||
});
|
||
};
|
||
|
||
/**
|
||
* @param repeatingName - The word that comes after "repeating_" in the
|
||
* attribute name. For instance, if you want to find
|
||
* "repeating_aspects_$0_aspect", then this should be "aspects".
|
||
*
|
||
* @param suffixes - An array of words identifying which parts of the
|
||
* repeating attribute you want. For instance, if you want
|
||
* "repeating_aspects_$0_aspect" (which is, in fact, the only part),
|
||
* then this should be ["aspect"].
|
||
*
|
||
* @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.
|
||
*/
|
||
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. Unlike
|
||
* getRepeatingAttributes(), you do not need to specify suffixes.
|
||
*/
|
||
function getRepeatingAttributesOrdered(repeatingName, suffixes, callback) {
|
||
if(suffixes) {
|
||
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);
|
||
});
|
||
});
|
||
} else {
|
||
getSectionIDsOrdered(repeatingName, function(idsOrdered) {
|
||
var result = [];
|
||
|
||
for(var id of idsOrdered) {
|
||
result.push({id:id});
|
||
}
|
||
|
||
callback(result);
|
||
});
|
||
}
|
||
}
|
||
/**
|
||
* Adds a repeating row of the given type, populating it with the given
|
||
* attributes. Sample usage:
|
||
* addRepeatingRow("Advantages", {Advantages:"High Ground", Adv1:"on"});
|
||
*/
|
||
function addRepeatingRow(repeatingName, localAttrs, newRowID) {
|
||
if(!newRowID) {
|
||
newRowID = generateRowID();
|
||
}
|
||
|
||
var attrs = {};
|
||
for(var attr in localAttrs) {
|
||
attrs["repeating_" + repeatingName + "_" + newRowID + "_" + attr] = localAttrs[attr];
|
||
}
|
||
setAttrs(attrs);
|
||
|
||
return newRowID;
|
||
}
|
||
|
||
function getRung(locationInPyramid) {
|
||
if(locationInPyramid) {
|
||
for(var rung of ladder) {
|
||
if(locationInPyramid.startsWith(rung)) {
|
||
return ladder.indexOf(rung);
|
||
}
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
function updateStress() {
|
||
updateBasicStress();
|
||
updateRepeatingStress();
|
||
}
|
||
|
||
function updateBasicStress() {
|
||
updateStressTrack(cache.PhyGoverningSkill, "physique", "Phy");
|
||
updateStressTrack(cache.MenGoverningSkill, "will", "Men");
|
||
}
|
||
|
||
function updateRepeatingStress() {
|
||
getRepeatingAttributes("StressOptions", ["GoverningSkill", "Mirrored"], function(stressOptions) {
|
||
for(var stressOption of stressOptions) {
|
||
updateStressTrack(stressOption.GoverningSkill, null, "repeating_Stress_" + stressOption.Mirrored + "_Stress");
|
||
}
|
||
});
|
||
}
|
||
|
||
function updateStressTrack(governingSkill, defaultGoverningSkill, boxPrefix) {
|
||
var boxesAvailable = 2;
|
||
|
||
//The "governing skill" may actually be a number of boxes, in which
|
||
//case there's a lot less to do.
|
||
if(governingSkill && numberMatcher.test(governingSkill)) {
|
||
boxesAvailable = parseInt(governingSkill);
|
||
} else {
|
||
if(governingSkill) {
|
||
governingSkill = governingSkill.toLowerCase();
|
||
} else if(defaultGoverningSkill) {
|
||
governingSkill = defaultGoverningSkill.toLowerCase();
|
||
} else {
|
||
return;
|
||
}
|
||
|
||
var locationInPyramid;
|
||
|
||
for(var attribute of skillAttributes) {
|
||
if(cache[attribute].toLowerCase() === governingSkill) {
|
||
locationInPyramid = attribute;
|
||
break;
|
||
}
|
||
}
|
||
|
||
var rung = getRung(locationInPyramid);
|
||
|
||
if(rung >= 3) {
|
||
boxesAvailable = 4;
|
||
} else if(rung >= 1) {
|
||
boxesAvailable = 3;
|
||
} else {
|
||
boxesAvailable = 2;
|
||
}
|
||
}
|
||
|
||
var attrs = {};
|
||
|
||
attrs[boxPrefix + "1Active"] = boxesAvailable >= 1 ? "on" : 0;
|
||
attrs[boxPrefix + "2Active"] = boxesAvailable >= 2 ? "on" : 0;
|
||
attrs[boxPrefix + "3Active"] = boxesAvailable >= 3 ? "on" : 0;
|
||
attrs[boxPrefix + "4Active"] = boxesAvailable >= 4 ? "on" : 0;
|
||
|
||
var changeMade = false;
|
||
for(var attr in attrs) {
|
||
if(attrs[attr] === cache[attr]) {
|
||
delete attrs[attr];
|
||
} else {
|
||
cache[attr] = attrs[attr];
|
||
changeMade = true;
|
||
}
|
||
}
|
||
|
||
if(changeMade) {
|
||
setAttrs(attrs);
|
||
}
|
||
}
|
||
|
||
function listenForChanges(attributeArray, listener) {
|
||
on("change:" + attributeArray.map(
|
||
function(attribute) {
|
||
return attribute.toLowerCase();
|
||
}).join(" change:"),
|
||
listener);
|
||
}
|
||
|
||
/**
|
||
* When the value at mirrorSource changes, the value at
|
||
* mirrorDestination will be set to that value.
|
||
*/
|
||
function createMirror(mirrorSource, mirrorDestination) {
|
||
getAttrs([mirrorSource], function(sourceAttrs) {
|
||
var attrs = {};
|
||
attrs[mirrorDestination] = sourceAttrs[mirrorSource];
|
||
setAttrs(attrs);
|
||
});
|
||
|
||
on("change:" + mirrorSource, function(eventInfo) {
|
||
var attrs = {};
|
||
attrs[mirrorDestination] = eventInfo.newValue;
|
||
setAttrs(attrs);
|
||
});
|
||
}
|
||
|
||
/**
|
||
* @param option - The name of the attribute to watch.
|
||
*
|
||
* @param results - An object. The keys in this object represent the
|
||
* possible values of the option attribute. The values are themselves
|
||
* objects, and will be passed directly to setAttrs().
|
||
*/
|
||
function createOption(option, results) {
|
||
on("change:" + option.toLowerCase(), function(eventInfo) {
|
||
if(results[eventInfo.newValue]) {
|
||
setAttrs(results[eventInfo.newValue]);
|
||
}
|
||
});
|
||
}
|
||
|
||
/**
|
||
* @param option - The name of the attribute to watch.
|
||
*
|
||
* @param grades - An ordered list of possible values for option.
|
||
*
|
||
* @param resultAttributes - An ordered list of attributes that will
|
||
* be turned on as the grade increases. resultAttributes.length must
|
||
* be one less than grades.length.
|
||
*
|
||
* @param onValue - Any result attribute below the current grade
|
||
* will be set to this. At the maximum grade, everything will be on.
|
||
*
|
||
* @param offValue - Any result attribute at or above the current grade
|
||
* will be set to this. At the minimum grade, everything will be off.
|
||
*/
|
||
function createGradedOption(option, grades, resultAttributes, onValue, offValue) {
|
||
var results = {};
|
||
|
||
for(var i = 0; i < grades.length; i++) {
|
||
var result = {};
|
||
results[grades[i]] = result;
|
||
|
||
var j = 0;
|
||
//Everything below the current grade should be on. At the lowest
|
||
//grade, i will equal 0, meaning nothing will be on.
|
||
for(; j < i; j++) {
|
||
result[resultAttributes[j]] = onValue;
|
||
}
|
||
|
||
//Everything at or above the current grade should be off. At the
|
||
//highest grade, i will equal resultAttributes.length, meaning
|
||
//nothing will be off.
|
||
for(; j < resultAttributes.length; j++) {
|
||
result[resultAttributes[j]] = offValue;
|
||
}
|
||
}
|
||
|
||
createOption(option, results);
|
||
}
|
||
|
||
/**
|
||
* Creates and deletes repeating rows to match the number typed in by
|
||
* the user.
|
||
*
|
||
* @param option - The name of the attribute to watch. Must be a text
|
||
* input field.
|
||
*
|
||
* @param repeatingName - The name of the repeating section.
|
||
*
|
||
* @param initValues - A function or object. If this is an object, it
|
||
* will be passed to addRepeatingRow(). If it is a function, it must
|
||
* take a row ID and return an object that can be passed to addRepeatingRow().
|
||
*
|
||
* @param deletionBlockers - An array of attribute names. If a row
|
||
* defines any of these attributes, it will not be deleted. May be null.
|
||
*
|
||
* @param hardCodedRows - The number of rows that appear to be part of
|
||
* this repeating section but are actually hard-coded.
|
||
*
|
||
* @param extraValues - An array of attribute names to search for. These
|
||
* attributes will be passed to removalCallback but will not block deletion.
|
||
*
|
||
* @param removalCallback - If defined, this will be called just before
|
||
* a row is removed. It must take one parameter: data about the row to
|
||
* be removed.
|
||
*/
|
||
function createRepeatingOption(option, repeatingName, initValues, deletionBlockers, hardCodedRows, extraValues, removalCallback) {
|
||
on("change:" + option.toLowerCase(), function(eventInfo) {
|
||
var targetRows;
|
||
|
||
try {
|
||
targetRows = parseInt(eventInfo.newValue);
|
||
} catch(e) {
|
||
var revert = {};
|
||
revert[option] = eventInfo.previousValue;
|
||
setAttrs(revert);
|
||
return;
|
||
}
|
||
|
||
if(targetRows < hardCodedRows) {
|
||
targetRows = 0;
|
||
|
||
var minimum = {};
|
||
minimum[option] = hardCodedRows.toString();
|
||
setAttrs(minimum);
|
||
} else {
|
||
targetRows -= hardCodedRows;
|
||
}
|
||
|
||
getRepeatingAttributesOrdered(repeatingName, deletionBlockers.concat(extraValues), function(foundAttributes) {
|
||
var currentRows = 0;
|
||
var removableRows = [];
|
||
for(var row of foundAttributes) {
|
||
currentRows++;
|
||
|
||
var blocked = false;
|
||
for(var blocker of deletionBlockers) {
|
||
if(row[blocker]) {
|
||
blocked = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if(!blocked) {
|
||
removableRows.push(row);
|
||
}
|
||
}
|
||
|
||
if(currentRows < targetRows) {
|
||
for(var i = currentRows; i < targetRows; i++) {
|
||
var newRowID = generateRowID();
|
||
var initialValues = initValues;
|
||
if(typeof initValues === "function") {
|
||
initialValues = initValues(newRowID);
|
||
}
|
||
|
||
addRepeatingRow(repeatingName, initialValues, newRowID);
|
||
}
|
||
} else if(currentRows > targetRows) {
|
||
removableRows.reverse();
|
||
|
||
for(var i = 0; i < currentRows - targetRows; i++) {
|
||
if(i >= removableRows.length) {
|
||
var minimum = {};
|
||
minimum[option] = (hardCodedRows + currentRows - removableRows.length).toString();
|
||
setAttrs(minimum);
|
||
|
||
break;
|
||
}
|
||
|
||
if(removalCallback) {
|
||
removalCallback(removableRows[i]);
|
||
}
|
||
|
||
removeRepeatingRow("repeating_" + repeatingName + "_" + removableRows[i].id);
|
||
}
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Unlike with createRepeatingOption(), it's fine to pass empty objects
|
||
* for initValues.
|
||
*/
|
||
function createMirroredRepeatingOption(option, repeatingName1, repeatingName2, initValues1, initValues2, deletionBlockers, hardCodedRows) {
|
||
function add(rowID1) {
|
||
initValues2.Mirrored = rowID1;
|
||
var rowID2 = addRepeatingRow(repeatingName2, initValues2);
|
||
|
||
initValues1.Mirrored = rowID2;
|
||
return initValues1;
|
||
}
|
||
|
||
function remove(removed) {
|
||
removeRepeatingRow("repeating_" + repeatingName2 + "_" + removed.Mirrored);
|
||
}
|
||
|
||
createRepeatingOption(option, repeatingName1, add, deletionBlockers, hardCodedRows, ["Mirrored"], remove);
|
||
}
|
||
|
||
//Set up the options section.
|
||
createMirror("Options", "OptionsActive");
|
||
createMirror("AdvantagesOption", "AdvantagesActive");
|
||
createMirror("ExtrasOption", "ExtrasActive");
|
||
createGradedOption("MaxSkillLevel",
|
||
["Great (+4)", "Superb (+5)", "Fantastic (+6)", "Epic (+7)", "Legendary (+8)"],
|
||
["SuperbActive", "FantasticActive", "EpicActive", "LegendaryActive"],
|
||
"on", "0");
|
||
createGradedOption("MinSkillLevel",
|
||
["Average (+1)", "Mediocre (+0)", "Poor (-1)", "Terrible (-2)"],
|
||
["MediocreActive", "PoorActive", "TerribleActive"],
|
||
"on", "0");
|
||
createRepeatingOption("ConsequenceSlots", "Cons", {conType:"Mild"}, ["Consequence"], 3);
|
||
createMirroredRepeatingOption("StressTracks", "Stress", "StressOptions", {}, {}, ["Name"], 2);
|
||
createRepeatingOption("CharacterAspectSlots", "Aspects", {Asp1:"0"}, ["Aspect"], 2);
|
||
|
||
on("change:StuntTextboxSize", function(eventInfo) {
|
||
var small = eventInfo.newValue.indexOf("small") >= 0 || eventInfo.newValue.indexOf("little") >= 0;
|
||
|
||
if(small) {
|
||
setAttrs({LargeStuntsTextbox:"0", LargeExtrasTextbox:"0"});
|
||
} else {
|
||
setAttrs({LargeStuntsTextbox:"on", LargeExtrasTextbox:"on"});
|
||
}
|
||
});
|
||
|
||
on("change:repeating_stressoptions:governingskill", updateRepeatingStress);
|
||
|
||
on("sheet:opened", function() {
|
||
//Figure out what needs to be cached.
|
||
var cachedAttributes = [
|
||
"Phy3Active",
|
||
"Phy4Active",
|
||
"PhyGoverningSkill",
|
||
"Men3Active",
|
||
"Men4Active",
|
||
"MenGoverningSkill"
|
||
];
|
||
cachedAttributes = cachedAttributes.concat(skillAttributes);
|
||
|
||
//Cache it!
|
||
getAttrs(cachedAttributes, function(attributes) {
|
||
cache = attributes;
|
||
|
||
updateStress();
|
||
});
|
||
listenForChanges(cachedAttributes, function(eventInfo) {
|
||
for(var attribute of cachedAttributes) {
|
||
if(eventInfo.sourceAttribute === attribute.toLowerCase()) {
|
||
//Update the cache.
|
||
if(eventInfo.newValue) {
|
||
cache[attribute] = eventInfo.newValue;
|
||
} else {
|
||
cache[attribute] = "";
|
||
}
|
||
|
||
//Call a function to process the change.
|
||
if(skillAttributes.indexOf(attribute) >= 0) {
|
||
updateStress();
|
||
} else if(attribute === "PhyGoverningSkill" || attribute === "MenGoverningSkill") {
|
||
updateBasicStress();
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
});
|
||
|
||
//If the user has never had a chance to choose how many character
|
||
//aspects they have, give them a total of five.
|
||
getAttrs(["CharacterAspectSlots"], function(slots) {
|
||
if(slots.CharacterAspectSlots !== "5") {
|
||
//They've definitely changed it. Leave it be.
|
||
return;
|
||
}
|
||
|
||
//If they have fewer than three, there's a mismatch.
|
||
getRepeatingAttributes("Aspects", ["Aspect"], function(existing) {
|
||
for(var i = existing.length; i < 3; i++) {
|
||
addRepeatingRow("Aspects", {Asp1:"0"});
|
||
}
|
||
});
|
||
});
|
||
|
||
//Backwards compatibility time!
|
||
var oldStressAttributes = ["ThirdStressSkill", "OpenStress1", "OpenStress2", "OpenStress3"];
|
||
var oldConsequenceAttributes = ["MildPhyConsequence", "MildMenConsequence", "MildThirdConsequence"];
|
||
var oldAttributes = ["ID", "character_name", "Description"]
|
||
.concat(oldStressAttributes)
|
||
.concat(oldConsequenceAttributes);
|
||
getAttrs(oldAttributes, function(attributes) {
|
||
var changeMade = false;
|
||
|
||
//Move ID into the description.
|
||
if(attributes.ID) {
|
||
if(!attributes.character_name || attributes.ID.toLowerCase() !== attributes.character_name.toLowerCase()) {
|
||
var aka = "aka " + attributes.ID;
|
||
if(attributes.Description) {
|
||
attributes.Description += " (" + aka + ")";
|
||
} else {
|
||
attributes.Description = aka;
|
||
}
|
||
}
|
||
|
||
attributes.ID = "";
|
||
changeMade = true;
|
||
}
|
||
|
||
//Move extra stress into repeating rows.
|
||
for(var oldStressAttribute of oldStressAttributes) {
|
||
if(attributes[oldStressAttribute]) {
|
||
var rowID2 = generateRowID();
|
||
|
||
var rowID1 = addRepeatingRow("Stress", {Name:attributes[oldStressAttribute], Mirrored:rowID2});
|
||
|
||
addRepeatingRow("StressOptions", {Mirrored:rowID1}, rowID2);
|
||
|
||
attributes[oldStressAttribute] = "";
|
||
changeMade = true;
|
||
}
|
||
}
|
||
|
||
//Move extra consequences into repeating rows.
|
||
for(var oldConsequenceAttribute of oldConsequenceAttributes) {
|
||
if(attributes[oldConsequenceAttribute]) {
|
||
addRepeatingRow("Cons", {Consequence:attributes[oldConsequenceAttribute]});
|
||
|
||
attributes[oldConsequenceAttribute] = "";
|
||
changeMade = true;
|
||
}
|
||
}
|
||
|
||
if(changeMade) {
|
||
setAttrs(attributes);
|
||
}
|
||
});
|
||
});
|
||
} catch(e) {
|
||
log("Encountered an error: " + e);
|
||
}
|
||
</script>
|
||
|
||
<div class="sheet-section-basic sheet-section">
|
||
<img class="sheet-logo" src="http://www.faterpg.com/wp-content/uploads/2013/06/Powered-by-Fate-Final-Light-BG.png" alt="FATE CORE" />
|
||
<table>
|
||
<tr>
|
||
<td>
|
||
<label>Name</label>
|
||
<input class="sheet-descriptions" type="text" name="attr_character_name" />
|
||
</td>
|
||
<td>
|
||
<label>Refresh</label>
|
||
<input type="number" name="attr_Refresh" value="3" min="0" />
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td>
|
||
<label>Description</label>
|
||
<input class="sheet-descriptions" type="text" name="attr_Description" />
|
||
</td>
|
||
<td>
|
||
<label>Fate Points</label>
|
||
<input type="number" name="attr_Fate" value="3" min="0" />
|
||
</td>
|
||
|
||
</tr>
|
||
</table>
|
||
</div> <!-- .section-basic -->
|
||
|
||
<div class="sheet-break"></div>
|
||
|
||
<div class="sheet-section-skills sheet-section">
|
||
<div class="sheet-header"
|
||
title="Fate's default skills: Athletics, Burglary, Contacts, Crafts, Deceive, Drive, Empathy, Fight, Investigate, Lore, Notice, Physique, Provoke, Rapport, Resources, Shoot, Stealth, Will">
|
||
<a href="https://fate-srd.com/fate-core/default-skill-list">Skills</a></div>
|
||
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_LegendaryActive" />
|
||
<div class="sheet-table">
|
||
<div>Legendary (+8)</div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Leg1" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+8+@{RollModifiers}]] @{Leg1}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Leg2" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+8+@{RollModifiers}]] @{Leg2}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Leg3" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+8+@{RollModifiers}]] @{Leg3}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Leg4" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+8+@{RollModifiers}]] @{Leg4}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Leg5" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+8+@{RollModifiers}]] @{Leg5}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Leg6" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+8+@{RollModifiers}]] @{Leg6}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Leg7" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+8+@{RollModifiers}]] @{Leg7}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Leg8" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+8+@{RollModifiers}]] @{Leg8}" tabindex="-1"></button></div>
|
||
</div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_EpicActive" />
|
||
<div class="sheet-table">
|
||
<div>Epic (+7)</div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Epic1" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+7+@{RollModifiers}]] @{Epic1}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Epic2" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+7+@{RollModifiers}]] @{Epic2}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Epic3" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+7+@{RollModifiers}]] @{Epic3}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Epic4" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+7+@{RollModifiers}]] @{Epic4}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Epic5" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+7+@{RollModifiers}]] @{Epic5}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Epic6" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+7+@{RollModifiers}]] @{Epic6}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Epic7" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+7+@{RollModifiers}]] @{Epic7}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Epic8" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+7+@{RollModifiers}]] @{Epic8}" tabindex="-1"></button></div>
|
||
</div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_FantasticActive" />
|
||
<div class="sheet-table">
|
||
<div>Fantastic (+6)</div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Fan1" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+6+@{RollModifiers}]] @{Fan1}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Fan2" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+6+@{RollModifiers}]] @{Fan2}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Fan3" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+6+@{RollModifiers}]] @{Fan3}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Fan4" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+6+@{RollModifiers}]] @{Fan4}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Fan5" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+6+@{RollModifiers}]] @{Fan5}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Fan6" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+6+@{RollModifiers}]] @{Fan6}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Fan7" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+6+@{RollModifiers}]] @{Fan7}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Fan8" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+6+@{RollModifiers}]] @{Fan8}" tabindex="-1"></button></div>
|
||
</div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_SuperbActive" checked="true" />
|
||
<div class="sheet-table">
|
||
<div>Superb (+5)</div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Sup1" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+5+@{RollModifiers}]] @{Sup1}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Sup2" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+5+@{RollModifiers}]] @{Sup2}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Sup3" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+5+@{RollModifiers}]] @{Sup3}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Sup4" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+5+@{RollModifiers}]] @{Sup4}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Sup5" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+5+@{RollModifiers}]] @{Sup5}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Sup6" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+5+@{RollModifiers}]] @{Sup6}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Sup7" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+5+@{RollModifiers}]] @{Sup7}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Sup8" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+5+@{RollModifiers}]] @{Sup8}" tabindex="-1"></button></div>
|
||
</div>
|
||
<div class="sheet-table">
|
||
<div>Great (+4)</div>
|
||
<div><input class="sheet-skill-on" type="text" name="attr_Great1" />
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+4+@{RollModifiers}]] @{Great1}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Great2" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+4+@{RollModifiers}]] @{Great2}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Great3" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+4+@{RollModifiers}]] @{Great3}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Great4" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+4+@{RollModifiers}]] @{Great4}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Great5" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+4+@{RollModifiers}]] @{Great5}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Great6" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+4+@{RollModifiers}]] @{Great6}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Great7" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+4+@{RollModifiers}]] @{Great7}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Great8" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+4+@{RollModifiers}]] @{Great8}" tabindex="-1"></button></div>
|
||
</div>
|
||
<div class="sheet-table">
|
||
<div>Good (+3)</div>
|
||
<div><input class="sheet-skill-on" type="text" name="attr_Good1" />
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+3+@{RollModifiers}]] @{Good1}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-on" type="text" name="attr_Good2" />
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+3+@{RollModifiers}]] @{Good2}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Good3" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+3+@{RollModifiers}]] @{Good3}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Good4" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+3+@{RollModifiers}]] @{Good4}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Good5" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+3+@{RollModifiers}]] @{Good5}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Good6" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+3+@{RollModifiers}]] @{Good6}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Good7" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+3+@{RollModifiers}]] @{Good7}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Good8" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+3+@{RollModifiers}]] @{Good8}" tabindex="-1"></button></div>
|
||
</div>
|
||
<div class="sheet-table">
|
||
<div>Fair (+2)</div>
|
||
<div><input class="sheet-skill-on" type="text" name="attr_Fair1" />
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+2+@{RollModifiers}]] @{Fair1}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-on" type="text" name="attr_Fair2" />
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+2+@{RollModifiers}]] @{Fair2}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-on" type="text" name="attr_Fair3" />
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+2+@{RollModifiers}]] @{Fair3}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Fair4" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+2+@{RollModifiers}]] @{Fair4}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Fair5" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+2+@{RollModifiers}]] @{Fair5}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Fair6" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+2+@{RollModifiers}]] @{Fair6}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Fair7" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+2+@{RollModifiers}]] @{Fair7}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-invisible" type="text" name="attr_Fair8" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+2+@{RollModifiers}]] @{Fair8}" tabindex="-1"></button></div>
|
||
</div>
|
||
<div class="sheet-table">
|
||
<div>Average (+1)</div>
|
||
<div><input class="sheet-skill-on" type="text" name="attr_Avg1" />
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+1+@{RollModifiers}]] @{Avg1}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-on" type="text" name="attr_Avg2" />
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+1+@{RollModifiers}]] @{Avg2}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-on" type="text" name="attr_Avg3" />
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+1+@{RollModifiers}]] @{Avg3}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-on" type="text" name="attr_Avg4" />
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+1+@{RollModifiers}]] @{Avg4}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Avg5" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+1+@{RollModifiers}]] @{Avg5}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Avg6" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+1+@{RollModifiers}]] @{Avg6}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Avg7" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+1+@{RollModifiers}]] @{Avg7}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Avg8" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF+1+@{RollModifiers}]] @{Avg8}" tabindex="-1"></button></div>
|
||
</div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_MediocreActive" checked="true" />
|
||
<div class="sheet-table">
|
||
<div>Mediocre (+0)</div>
|
||
<div><button type="roll" value="/me rolls [[4dF+@{RollModifiers}]]"></button></div>
|
||
</div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_PoorActive" />
|
||
<div class="sheet-table">
|
||
<div>Poor (-1)</div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Poor1" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Poor1}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Poor2" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Poor2}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Poor3" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Poor3}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Poor4" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Poor4}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Poor5" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Poor5}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Poor6" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Poor6}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Poor7" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Poor7}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Poor8" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Poor8}" tabindex="-1"></button></div>
|
||
</div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_TerribleActive" />
|
||
<div class="sheet-table">
|
||
<div>Terrible (-2)</div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Ter1" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Ter1}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Ter2" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Ter2}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Ter3" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Ter3}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Ter4" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Ter4}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Ter5" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Ter5}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Ter6" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Ter6}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Ter7" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Ter7}" tabindex="-1"></button></div>
|
||
<div><input class="sheet-skill-off" type="text" name="attr_Ter8" placeholder=" "/>
|
||
<button class="sheet-hidden-roll" type="roll" value="/me rolls [[4dF-1+@{RollModifiers}]] @{Ter8}" tabindex="-1"></button></div>
|
||
</div>
|
||
</div> <!-- .section-skills -->
|
||
|
||
<div class="sheet-break"></div>
|
||
|
||
<div class="sheet-flex-row">
|
||
<div class="sheet-section-aspects sheet-section">
|
||
<div class="sheet-header"
|
||
title="Aspects are phrases that describe something unique or noteworthy about you. You may invoke them by spending fate points.">
|
||
<a href="https://fate-srd.com/fate-core/types-aspects">Aspects</a></div>
|
||
<div class="sheet-repitem sheet-flex-row">
|
||
<textarea class="sheet-flex-1" name="attr_HighConcept" placeholder="High Concept Aspect" rows="1"></textarea>
|
||
<div class="sheet-flex-column">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_HiCon1" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_HiCon2" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_HiCon3" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_HiCon4" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_HiCon5" title="Free invoke">
|
||
</div>
|
||
</div>
|
||
<div class="sheet-repitem sheet-flex-row">
|
||
<textarea class="sheet-flex-1" name="attr_Trouble" placeholder="Trouble Aspect" rows="1"></textarea>
|
||
<div class="sheet-flex-column">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Trouble1" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Trouble2" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Trouble3" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Trouble4" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Trouble5" title="Free invoke">
|
||
</div>
|
||
</div>
|
||
<fieldset class="repeating_Aspects sheet-no-repeating-buttons">
|
||
<div class="sheet-repitem sheet-flex-row">
|
||
<textarea class="sheet-flex-1" name="attr_Aspect" rows="1"></textarea>
|
||
<div class="sheet-flex-column">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Asp1" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Asp2" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Asp3" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Asp4" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Asp5" title="Free invoke">
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
</div> <!-- .section-aspects -->
|
||
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_AdvantagesActive" checked="true">
|
||
|
||
<div class="sheet-section-advantages sheet-section">
|
||
<div class="sheet-header"
|
||
title="Situation aspects are phrases that describe the current scene. Boosts are similar, but go away after one invocation. Invoking a boost is always free.">
|
||
Boosts and situation aspects</div>
|
||
<fieldset class="repeating_Advantages">
|
||
<div class="sheet-repitem sheet-flex-row">
|
||
<textarea class="sheet-flex-1" name="attr_Advantages" rows="1"></textarea>
|
||
<div class="sheet-flex-column">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Adv1" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Adv2" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Adv3" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Adv4" title="Free invoke">
|
||
<input class="sheet-repeating-checkbox" type="checkbox" name="attr_Adv5" title="Free invoke">
|
||
</div>
|
||
</fieldset>
|
||
</div> <!-- .section-advantages -->
|
||
</div>
|
||
|
||
<div class="sheet-break"></div>
|
||
|
||
<div class="sheet-flex-row">
|
||
<div class="sheet-section-stunts sheet-section">
|
||
<div class="sheet-header"
|
||
title="A stunt allows you to do something extra in a specific situation. Unless the stunt specifically says otherwise, it doesn't require a fate point.">
|
||
<a href="https://fate-srd.com/fate-core/skills-stunts">Stunts</a></div>
|
||
<input class="sheet-large-textbox" type="checkbox" name="attr_LargeStuntsTextbox">
|
||
<textarea name="attr_Stunts" rows="2"></textarea>
|
||
<fieldset class="repeating_Stunts">
|
||
<textarea name="attr_Stunt" rows="2"></textarea>
|
||
</fieldset>
|
||
</div> <!-- .section-stunts -->
|
||
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_ExtrasActive" checked="true">
|
||
|
||
<div class="sheet-section-extras sheet-section">
|
||
<div class="sheet-header"
|
||
title="An extra can be anything that’s technically part of a character or controlled by a character but gets special treatment in the rules, such as magic abilities or a privately-owned business. Consult your GM.">
|
||
<a href="https://fate-srd.com/fate-core/creating-extra">Extras</a></div>
|
||
<input class="sheet-large-textbox" type="checkbox" name="attr_LargeExtrasTextbox">
|
||
<textarea name="attr_Extras" rows="2"></textarea>
|
||
<fieldset class="repeating_Extras">
|
||
<textarea name="attr_Extra" rows="2"></textarea>
|
||
</fieldset>
|
||
</div> <!-- .section-extras -->
|
||
</div>
|
||
|
||
<div class="sheet-break"></div>
|
||
|
||
<div class="sheet-flex-row">
|
||
<div class="sheet-section-stress sheet-section">
|
||
<div class="sheet-header"
|
||
title="When you would take damage, you may check AT MOST ONE stress checkbox to reduce the damage by the number next to that box. Stress goes away at the end of the scene.">
|
||
<a href="https://fate-srd.com/fate-core/conflicts">Stress</a></div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_Phy1Active" checked="true" />
|
||
<div class="sheet-table">
|
||
<div class="sheet-large-text sheet-stress-left-column">Physical </div>
|
||
<div><label>1<input type="checkbox" name="attr_Phy1" /></label></div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_Phy2Active" checked="true" />
|
||
<div><label>2<input type="checkbox" name="attr_Phy2" /></label></div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_Phy3Active" />
|
||
<div><label>3<input type="checkbox" name="attr_Phy3" /></label></div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_Phy4Active" />
|
||
<div><label>4<input type="checkbox" name="attr_Phy4" /></label></div>
|
||
</div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_Men1Active" checked="true" />
|
||
<div class="sheet-table">
|
||
<div class="sheet-large-text sheet-stress-left-column">Mental </div>
|
||
<div><label>1<input type="checkbox" name="attr_Men1" /></label></div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_Men2Active" checked="true" />
|
||
<div><label>2<input type="checkbox" name="attr_Men2" /></label></div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_Men3Active" />
|
||
<div><label>3<input type="checkbox" name="attr_Men3" /></label></div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_Men4Active" />
|
||
<div><label>4<input type="checkbox" name="attr_Men4" /></label></div>
|
||
</div>
|
||
<fieldset class="repeating_Stress sheet-no-repeating-buttons">
|
||
<div class="sheet-table">
|
||
<input class="sheet-dynamic-name sheet-stress-left-column" type="text" name="attr_Name" placeholder="(Name)" />
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_Stress1Active" checked="true" />
|
||
<div><label>1<input type="checkbox" name="attr_Stress1" /></label></div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_Stress2Active" checked="true" />
|
||
<div><label>2<input type="checkbox" name="attr_Stress2" /></label></div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_Stress3Active" />
|
||
<div><label>3<input type="checkbox" name="attr_Stress3" /></label></div>
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_Stress4Active" />
|
||
<div><label>4<input type="checkbox" name="attr_Stress4" /></label></div>
|
||
<input class="sheet-hidden" type="text" name="attr_Mirrored" />
|
||
</div>
|
||
</fieldset>
|
||
</div> <!-- .section-stress -->
|
||
|
||
<div class="sheet-section-consequences sheet-section">
|
||
<div class="sheet-header"
|
||
title="Consequences are aspects representing physical or emotional damage. When you take a consequence, your enemies get one free invocation.">
|
||
<a href="https://fate-srd.com/fate-core/conflicts">Consequences</a></div>
|
||
<div class="sheet-left-label">
|
||
<div>Mild</div>
|
||
<div><input type="text" name="attr_MildConsequence" /></div>
|
||
<div><input type="checkbox" name="attr_MildInvoke" title="Free invoke" /></div>
|
||
</div>
|
||
<div class="sheet-left-label">
|
||
<div>Moderate</div>
|
||
<div><input type="text" name="attr_ModerateConsequence" /></div>
|
||
<div><input type="checkbox" name="attr_ModerateInvoke" title="Free invoke" /></div>
|
||
</div>
|
||
<div class="sheet-left-label">
|
||
<div>Severe</div>
|
||
<div><input type="text" name="attr_SevereConsequence" /></div>
|
||
<div><input type="checkbox" name="attr_SevereInvoke" title="Free invoke" /></div>
|
||
</div>
|
||
<fieldset class="repeating_Cons sheet-no-repeating-buttons">
|
||
<div class="sheet-left-label">
|
||
<select name="attr_conType">
|
||
<option>Mild</option>
|
||
<option>Moderate</option>
|
||
<option>Severe</option>
|
||
</select>
|
||
<div><input type="text" name="attr_Consequence"></div>
|
||
<div><input type="checkbox" name="attr_Invoke" title="Free invoke" /></div>
|
||
</div>
|
||
</fieldset>
|
||
</div> <!-- .section-consequences -->
|
||
</div>
|
||
|
||
<div class="sheet-break"></div>
|
||
|
||
<div class="sheet-section-notes sheet-section">
|
||
<div class="sheet-header">Notes</div>
|
||
<textarea name="attr_Notes" rows="7"></textarea>
|
||
</div> <!-- .section-notes -->
|
||
|
||
<div class="sheet-break"></div>
|
||
|
||
<div class="sheet-flex-row">
|
||
<label class="sheet-small-text">
|
||
<input type="checkbox" class="sheet-dropdown-arrow" name="attr_Options" />
|
||
<span>
|
||
Options
|
||
</span>
|
||
</label>
|
||
</div>
|
||
|
||
<input class="sheet-active-toggle" type="checkbox" name="attr_OptionsActive">
|
||
|
||
<div class="sheet-section-options sheet-popup">
|
||
<div>Layout and preferences</div>
|
||
|
||
<label title="Deselect this to get rid of the "Modifier" popup that appears when rolling dice.">
|
||
Use roll modifiers?
|
||
<input type="checkbox" name="attr_RollModifiers" value="?{Modifier|0}" checked="true">
|
||
</label>
|
||
|
||
<label title="Deselect this to hide the "Boosts and situation aspects" section, giving you more room to track character aspects.">
|
||
Show boosts and situation aspects?
|
||
<input type="checkbox" name="attr_AdvantagesOption" checked="true">
|
||
</label>
|
||
|
||
<label title="Deselect this to hide the Extras section, giving you more room to track stunts.">
|
||
Show extras?
|
||
<input type="checkbox" name="attr_ExtrasOption" checked="true">
|
||
</label>
|
||
|
||
<label title="You can resize textboxes by hand, but they'll reset each time you open the sheet. Use this to control the size they reset to.">
|
||
Track stunts and extras using:
|
||
<select name="attr_StuntTextboxSize">
|
||
<option>One big textbox</option>
|
||
<option selected="selected">Several small textboxes</option>
|
||
</select>
|
||
</label>
|
||
|
||
<hr>
|
||
|
||
<div>Stats</div>
|
||
|
||
<label title="The highest skill level that will show up in your pyramid. Skills above this level will be hidden, not deleted.">
|
||
Maximum skill level:
|
||
<select name="attr_MaxSkillLevel">
|
||
<option>Great (+4)</option>
|
||
<option selected="selected">Superb (+5)</option>
|
||
<option>Fantastic (+6)</option>
|
||
<option>Epic (+7)</option>
|
||
<option>Legendary (+8)</option>
|
||
</select>
|
||
</label>
|
||
|
||
<label title="The lowest skill level that will show up in your pyramid. Skills below this level will be hidden, not deleted.">
|
||
Minimum skill level:
|
||
<select name="attr_MinSkillLevel">
|
||
<option>Average (+1)</option>
|
||
<option selected="selected">Mediocre (+0)</option>
|
||
<option>Poor (-1)</option>
|
||
<option>Terrible (-2)</option>
|
||
</select>
|
||
</label>
|
||
|
||
<label title="How many character aspects you have. To remove an aspect, clear the text before changing this number.">
|
||
Character aspects:
|
||
<input type="number" name="attr_CharacterAspectSlots" value="5" min="2" />
|
||
</label>
|
||
|
||
<label title="How many consequences you can take without being taken out (not counting extreme consequences). To remove a consequence, clear the text before changing this number.">
|
||
Consequence slots:
|
||
<input type="number" name="attr_ConsequenceSlots" value="3" min="3" />
|
||
</label>
|
||
|
||
<label title="How many types of stress you'll be using. To remove a track, clear the name before changing this number.">
|
||
Stress tracks:
|
||
<input type="number" name="attr_StressTracks" value="2" min="2" />
|
||
</label>
|
||
|
||
<label title="Either enter the skill that determines how many physical stress boxes you have, or just enter the number of boxes.">
|
||
Physical stress boxes/governing skill:
|
||
<input type="text" name="attr_PhyGoverningSkill" value="Physique" />
|
||
</label>
|
||
|
||
<label title="Either enter the skill that determines how many mental stress boxes you have, or just enter the number of boxes">
|
||
Mental stress boxes/governing skill:
|
||
<input type="text" name="attr_MenGoverningSkill" value="Will" />
|
||
</label>
|
||
|
||
<fieldset class="repeating_StressOptions sheet-no-repeating-buttons">
|
||
<label title="Either enter the skill that determines how many stress boxes you have in this track, or just enter the number of boxes.">
|
||
Custom stress boxes/governing skill:
|
||
<input type="text" name="attr_GoverningSkill" value="2" min="2" />
|
||
<input class="sheet-hidden" type="text" name="attr_Mirrored" />
|
||
</label>
|
||
</label>
|
||
</div> <!-- .section-options -->
|