mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 19:52:29 +00:00
1596 lines
69 KiB
HTML
1596 lines
69 KiB
HTML
<script type="text/worker">
|
||
/* ---- BEGIN: TheAaronSheet.js ---- */
|
||
// Github: https://github.com/shdwjk/TheAaronSheet/blob/master/TheAaronSheet.js
|
||
// By: The Aaron, Arcane Scriptomancer
|
||
// Contact: https://app.roll20.net/users/104025/the-aaron
|
||
|
||
var TAS = TAS || (function(){
|
||
'use strict';
|
||
|
||
var version = '0.2.4',
|
||
lastUpdate = 1457098091,
|
||
|
||
loggingSettings = {
|
||
debug: {
|
||
key: 'debug',
|
||
title: 'DEBUG',
|
||
color: {
|
||
bgLabel: '#7732A2',
|
||
label: '#F2EF40',
|
||
bgText: '#FFFEB7',
|
||
text: '#7732A2'
|
||
}
|
||
},
|
||
error: {
|
||
key: 'error',
|
||
title: 'Error',
|
||
color: {
|
||
bgLabel: '#C11713',
|
||
label: 'white',
|
||
bgText: '#C11713',
|
||
text: 'white'
|
||
}
|
||
},
|
||
warn: {
|
||
key: 'warn',
|
||
title: 'Warning',
|
||
color: {
|
||
bgLabel: '#F29140',
|
||
label: 'white',
|
||
bgText: '#FFD8B7',
|
||
text: 'black'
|
||
}
|
||
},
|
||
info: {
|
||
key: 'info',
|
||
title: 'Info',
|
||
color: {
|
||
bgLabel: '#413FA9',
|
||
label: 'white',
|
||
bgText: '#B3B2EB',
|
||
text: 'black'
|
||
}
|
||
},
|
||
notice: {
|
||
key: 'notice',
|
||
title: 'Notice',
|
||
color: {
|
||
bgLabel: '#33C133',
|
||
label: 'white',
|
||
bgText: '#ADF1AD',
|
||
text: 'black'
|
||
}
|
||
},
|
||
log: {
|
||
key: 'log',
|
||
title: 'Log',
|
||
color: {
|
||
bgLabel: '#f2f240',
|
||
label: 'black',
|
||
bgText: '#ffff90',
|
||
text: 'black'
|
||
}
|
||
},
|
||
callstack: {
|
||
key: 'TAS',
|
||
title: 'function',
|
||
color: {
|
||
bgLabel: '#413FA9',
|
||
label: 'white',
|
||
bgText: '#B3B2EB',
|
||
text: 'black'
|
||
}
|
||
},
|
||
callstack_async: {
|
||
key: 'TAS',
|
||
title: 'ASYNC CALL',
|
||
color: {
|
||
bgLabel: '#413FA9',
|
||
label: 'white',
|
||
bgText: '#413FA9',
|
||
text: 'white'
|
||
}
|
||
},
|
||
TAS: {
|
||
key: 'TAS',
|
||
title: 'TAS',
|
||
color: {
|
||
bgLabel: 'grey',
|
||
label: 'black;background:linear-gradient(#304352,#d7d2cc,#d7d2cc,#d7d2cc,#304352)',
|
||
bgText: 'grey',
|
||
text: 'black;background:linear-gradient(#304352,#d7d2cc,#d7d2cc,#d7d2cc,#304352)'
|
||
}
|
||
}
|
||
},
|
||
|
||
|
||
config = {
|
||
debugMode: false,
|
||
logging: {
|
||
log: true,
|
||
notice: true,
|
||
info: true,
|
||
warn: true,
|
||
error: true,
|
||
debug: false
|
||
}
|
||
},
|
||
|
||
callstackRegistry = [],
|
||
queuedUpdates = {}, //< Used for delaying saves till the last momment.
|
||
|
||
complexType = function(o){
|
||
switch(typeof o){
|
||
case 'string':
|
||
return 'string';
|
||
case 'boolean':
|
||
return 'boolean';
|
||
case 'number':
|
||
return (_.isNaN(o) ? 'NaN' : (o.toString().match(/\./) ? 'decimal' : 'integer'));
|
||
case 'function':
|
||
return 'function: '+(o.name ? o.name+'()' : '(anonymous)');
|
||
case 'object':
|
||
return (_.isArray(o) ? 'array' : (_.isArguments(o) ? 'arguments' : ( _.isNull(o) ? 'null' : 'object')));
|
||
default:
|
||
return typeof o;
|
||
}
|
||
},
|
||
|
||
dataLogger = function(primaryLogger,secondaryLogger,data){
|
||
_.each(data,function(m){
|
||
var type = complexType(m);
|
||
switch(type){
|
||
case 'string':
|
||
primaryLogger(m);
|
||
break;
|
||
case 'undefined':
|
||
case 'null':
|
||
case 'NaN':
|
||
primaryLogger('['+type+']');
|
||
break;
|
||
case 'number':
|
||
case 'not a number':
|
||
case 'integer':
|
||
case 'decimal':
|
||
case 'boolean':
|
||
primaryLogger('['+type+']: '+m);
|
||
break;
|
||
default:
|
||
primaryLogger('['+type+']:=========================================');
|
||
secondaryLogger(m);
|
||
primaryLogger('=========================================================');
|
||
break;
|
||
}
|
||
});
|
||
},
|
||
|
||
|
||
colorLog = function(options){
|
||
var coloredLoggerFunction,
|
||
key = options.key,
|
||
label = options.title || 'TAS',
|
||
lBGColor = (options.color && options.color.bgLabel) || 'blue',
|
||
lTxtColor = (options.color && options.color.label) || 'white',
|
||
mBGColor = (options.color && options.color.bgText) || 'blue',
|
||
mTxtColor = (options.color && options.color.text) || 'white';
|
||
|
||
coloredLoggerFunction = function(message){
|
||
console.log(
|
||
'%c '+label+': %c '+message + ' ',
|
||
'background-color: '+lBGColor+';color: '+lTxtColor+'; font-weight:bold;',
|
||
'background-color: '+mBGColor+';color: '+mTxtColor+';'
|
||
);
|
||
};
|
||
return function(){
|
||
if('TAS'===key || config.logging[key]){
|
||
dataLogger(coloredLoggerFunction,function(m){console.log(m);},_.toArray(arguments));
|
||
}
|
||
};
|
||
},
|
||
|
||
logDebug = colorLog(loggingSettings.debug),
|
||
logError = colorLog(loggingSettings.error),
|
||
logWarn = colorLog(loggingSettings.warn),
|
||
logInfo = colorLog(loggingSettings.info),
|
||
logNotice = colorLog(loggingSettings.notice),
|
||
logLog = colorLog(loggingSettings.log),
|
||
log = colorLog(loggingSettings.TAS),
|
||
logCS = colorLog(loggingSettings.callstack),
|
||
logCSA = colorLog(loggingSettings.callstack_async),
|
||
|
||
registerCallstack = function(callstack,label){
|
||
var idx=_.findIndex(callstackRegistry,function(o){
|
||
return (_.difference(o.stack,callstack).length === _.difference(callstack,o.stack).length) &&
|
||
_.difference(o.stack,callstack).length === 0 &&
|
||
o.label === label;
|
||
});
|
||
if(-1 === idx){
|
||
idx=callstackRegistry.length;
|
||
callstackRegistry.push({
|
||
stack: callstack,
|
||
label: label
|
||
});
|
||
}
|
||
return idx;
|
||
},
|
||
|
||
setConfigOption = function(options){
|
||
var newconf =_.defaults(options,config);
|
||
newconf.logging=_.defaults(
|
||
(options && options.logging)||{},
|
||
config.logging
|
||
);
|
||
config=newconf;
|
||
},
|
||
|
||
debugMode = function(){
|
||
config.logging.debug=true;
|
||
config.debugMode = true;
|
||
},
|
||
|
||
getCallstack = function(){
|
||
var e = new Error('dummy'),
|
||
stack = _.map(_.rest(e.stack.replace(/^[^\(]+?[\n$]/gm, '')
|
||
.replace(/^\s+at\s+/gm, '')
|
||
.replace(/^Object.<anonymous>\s*\(/gm, '{anonymous}()@')
|
||
.split('\n')),function(l){
|
||
return l.replace(/\s+.*$/,'');
|
||
});
|
||
return stack;
|
||
},
|
||
logCallstackSub = function(cs){
|
||
var matches, csa;
|
||
_.find(cs,function(line){
|
||
matches = line.match(/TAS_CALLSTACK_(\d+)/);
|
||
if(matches){
|
||
csa=callstackRegistry[matches[1]];
|
||
logCSA( '===================='+(csa.label ? '> '+csa.label+' <' : '')+'====================');
|
||
logCallstackSub(csa.stack);
|
||
return true;
|
||
}
|
||
logCS(line);
|
||
return false;
|
||
});
|
||
},
|
||
logCallstack = function(){
|
||
var cs;
|
||
if(config.debugMode){
|
||
cs = getCallstack();
|
||
cs.shift();
|
||
log('==============================> CALLSTACK <==============================');
|
||
logCallstackSub(cs);
|
||
log('=========================================================================');
|
||
}
|
||
},
|
||
|
||
|
||
wrapCallback = function (label, callback, context){
|
||
var callstack;
|
||
if('function' === typeof label){
|
||
context=callback;
|
||
callback=label;
|
||
label=undefined;
|
||
}
|
||
if(!config.debugMode){
|
||
return (function(cb,ctx){
|
||
return function(){
|
||
cb.apply(ctx||{},arguments);
|
||
};
|
||
}(callback,context));
|
||
}
|
||
|
||
callstack = getCallstack();
|
||
callstack.shift();
|
||
|
||
return (function(cb,ctx,cs,lbl){
|
||
var ctxref=registerCallstack(cs,lbl);
|
||
|
||
/*jshint -W054 */
|
||
return new Function('cb','ctx','TASlog',
|
||
"return function TAS_CALLSTACK_"+ctxref+"(){"+
|
||
"TASlog('Entering: '+(cb.name||'(anonymous function)'));"+
|
||
"cb.apply(ctx||{},arguments);"+
|
||
"TASlog('Exiting: '+(cb.name||'(anonymous function)'));"+
|
||
"};")(cb,ctx,log);
|
||
/*jshint +W054 */
|
||
}(callback,context,callstack,label));
|
||
},
|
||
|
||
|
||
prepareUpdate = function( attribute, value ){
|
||
queuedUpdates[attribute]=value;
|
||
},
|
||
|
||
applyQueuedUpdates = function() {
|
||
setAttrs(queuedUpdates);
|
||
queuedUpdates = {};
|
||
},
|
||
|
||
namesFromArgs = function(args,base){
|
||
return _.chain(args)
|
||
.reduce(function(memo,attr){
|
||
if('string' === typeof attr) {
|
||
memo.push(attr);
|
||
} else if(_.isArray(args) || _.isArguments(args)){
|
||
memo = namesFromArgs(attr,memo);
|
||
}
|
||
return memo;
|
||
},(_.isArray(base) && base) || [])
|
||
.uniq()
|
||
.value();
|
||
},
|
||
|
||
addId = function(obj,value){
|
||
Object.defineProperty(obj,'id',{
|
||
value: value,
|
||
writeable: false,
|
||
enumerable: false
|
||
});
|
||
},
|
||
|
||
addProp = function(obj,prop,value,fullname){
|
||
(function(){
|
||
var pname=(_.contains(['S','F','I','D'],prop) ? '_'+prop : prop),
|
||
full_pname = fullname || prop,
|
||
pvalue=value;
|
||
|
||
_.each(['S','I','F'],function(p){
|
||
if( !_.has(obj,p)){
|
||
Object.defineProperty(obj, p, {
|
||
value: {},
|
||
enumerable: false,
|
||
readonly: true
|
||
});
|
||
}
|
||
});
|
||
if( !_.has(obj,'D')){
|
||
Object.defineProperty(obj, 'D', {
|
||
value: _.reduce(_.range(10),function(m,d){
|
||
Object.defineProperty(m, d, {
|
||
value: {},
|
||
enumerable: true,
|
||
readonly: true
|
||
});
|
||
return m;
|
||
},{}),
|
||
enumerable: false,
|
||
readonly: true
|
||
});
|
||
}
|
||
|
||
|
||
// Raw value
|
||
Object.defineProperty(obj, pname, {
|
||
enumerable: true,
|
||
set: function(v){
|
||
if(v!==pvalue) {
|
||
pvalue=v;
|
||
prepareUpdate(full_pname,v);
|
||
}
|
||
},
|
||
get: function(){
|
||
return pvalue;
|
||
}
|
||
});
|
||
|
||
// string value
|
||
Object.defineProperty(obj.S, pname, {
|
||
enumerable: true,
|
||
set: function(v){
|
||
var val=v.toString();
|
||
if(val !== pvalue) {
|
||
pvalue=val;
|
||
prepareUpdate(full_pname,val);
|
||
}
|
||
},
|
||
get: function(){
|
||
return pvalue.toString();
|
||
}
|
||
});
|
||
|
||
// int value
|
||
Object.defineProperty(obj.I, pname, {
|
||
enumerable: true,
|
||
set: function(v){
|
||
var val=parseInt(v,10) || 0;
|
||
if(val !== pvalue){
|
||
pvalue=val;
|
||
prepareUpdate(full_pname,val);
|
||
}
|
||
},
|
||
get: function(){
|
||
return parseInt(pvalue,10) || 0;
|
||
}
|
||
});
|
||
|
||
// float value
|
||
Object.defineProperty(obj.F, pname, {
|
||
enumerable: true,
|
||
set: function(v){
|
||
var val=parseFloat(v) || 0;
|
||
if(val !== pvalue) {
|
||
pvalue=val;
|
||
prepareUpdate(full_pname,val);
|
||
}
|
||
},
|
||
get: function(){
|
||
return parseFloat(pvalue) || 0;
|
||
}
|
||
});
|
||
_.each(_.range(10),function(d){
|
||
Object.defineProperty(obj.D[d], pname, {
|
||
enumerable: true,
|
||
set: function(v){
|
||
var val=(parseFloat(v) || 0).toFixed(d);
|
||
if(val !== pvalue){
|
||
pvalue=val;
|
||
prepareUpdate(full_pname,val);
|
||
}
|
||
},
|
||
get: function(){
|
||
return (parseFloat(pvalue) || 0).toFixed(d);
|
||
}
|
||
});
|
||
});
|
||
|
||
}());
|
||
},
|
||
|
||
repeating = function( section ) {
|
||
return (function(s){
|
||
var sectionName = s,
|
||
attrNames = [],
|
||
fieldNames = [],
|
||
operations = [],
|
||
after = [],
|
||
|
||
repAttrs = function TAS_Repeating_Attrs(){
|
||
attrNames = namesFromArgs(arguments,attrNames);
|
||
return this;
|
||
},
|
||
repFields = function TAS_Repeating_Fields(){
|
||
fieldNames = namesFromArgs(arguments,fieldNames);
|
||
return this;
|
||
},
|
||
repReduce = function TAS_Repeating_Reduce(func, initial, final, context) {
|
||
operations.push({
|
||
type: 'reduce',
|
||
func: (func && _.isFunction(func) && func) || _.noop,
|
||
memo: (_.isUndefined(initial) && 0) || initial,
|
||
final: (final && _.isFunction(final) && final) || _.noop,
|
||
context: context || {}
|
||
});
|
||
return this;
|
||
},
|
||
repMap = function TAS_Repeating_Map(func, final, context) {
|
||
operations.push({
|
||
type: 'map',
|
||
func: (func && _.isFunction(func) && func) || _.noop,
|
||
final: (final && _.isFunction(final) && final) || _.noop,
|
||
context: context || {}
|
||
});
|
||
return this;
|
||
},
|
||
repEach = function TAS_Repeating_Each(func, final, context) {
|
||
operations.push({
|
||
type: 'each',
|
||
func: (func && _.isFunction(func) && func) || _.noop,
|
||
final: (final && _.isFunction(final) && final) || _.noop,
|
||
context: context || {}
|
||
});
|
||
return this;
|
||
},
|
||
repTap = function TAS_Repeating_Tap(final, context) {
|
||
operations.push({
|
||
type: 'tap',
|
||
final: (final && _.isFunction(final) && final) || _.noop,
|
||
context: context || {}
|
||
});
|
||
return this;
|
||
},
|
||
repAfter = function TAS_Repeating_After(callback,context) {
|
||
after.push({
|
||
callback: (callback && _.isFunction(callback) && callback) || _.noop,
|
||
context: context || {}
|
||
});
|
||
return this;
|
||
},
|
||
repExecute = function TAS_Repeating_Execute(callback,context){
|
||
var rowSet = {},
|
||
attrSet = {},
|
||
fieldIds = [],
|
||
fullFieldNames = [];
|
||
|
||
repAfter(callback,context);
|
||
|
||
// call each operation per row.
|
||
// call each operation's final
|
||
getSectionIDs("repeating_"+sectionName,function(ids){
|
||
fieldIds = ids;
|
||
fullFieldNames = _.reduce(fieldIds,function(memo,id){
|
||
return memo.concat(_.map(fieldNames,function(name){
|
||
return 'repeating_'+sectionName+'_'+id+'_'+name;
|
||
}));
|
||
},[]);
|
||
getAttrs( _.uniq(attrNames.concat(fullFieldNames)), function(values){
|
||
_.each(attrNames,function(aname){
|
||
if(values.hasOwnProperty(aname)){
|
||
addProp(attrSet,aname,values[aname]);
|
||
}
|
||
});
|
||
|
||
rowSet = _.reduce(fieldIds,function(memo,id){
|
||
var r={};
|
||
addId(r,id);
|
||
_.each(fieldNames,function(name){
|
||
var fn = 'repeating_'+sectionName+'_'+id+'_'+name;
|
||
addProp(r,name,values[fn],fn);
|
||
});
|
||
|
||
memo[id]=r;
|
||
|
||
return memo;
|
||
},{});
|
||
|
||
_.each(operations,function(op){
|
||
var res;
|
||
switch(op.type){
|
||
case 'tap':
|
||
_.bind(op.final,op.context,rowSet,attrSet)();
|
||
break;
|
||
|
||
case 'each':
|
||
_.each(rowSet,function(r){
|
||
_.bind(op.func,op.context,r,attrSet,r.id,rowSet)();
|
||
});
|
||
_.bind(op.final,op.context,rowSet,attrSet)();
|
||
break;
|
||
|
||
case 'map':
|
||
res = _.map(rowSet,function(r){
|
||
return _.bind(op.func,op.context,r,attrSet,r.id,rowSet)();
|
||
});
|
||
_.bind(op.final,op.context,res,rowSet,attrSet)();
|
||
break;
|
||
|
||
case 'reduce':
|
||
res = op.memo;
|
||
_.each(rowSet,function(r){
|
||
res = _.bind(op.func,op.context,res,r,attrSet,r.id,rowSet)();
|
||
});
|
||
_.bind(op.final,op.context,res,rowSet,attrSet)();
|
||
break;
|
||
}
|
||
});
|
||
|
||
// finalize attrs
|
||
applyQueuedUpdates();
|
||
_.each(after,function(op){
|
||
_.bind(op.callback,op.context)();
|
||
});
|
||
});
|
||
});
|
||
};
|
||
|
||
return {
|
||
attrs: repAttrs,
|
||
attr: repAttrs,
|
||
|
||
column: repFields,
|
||
columns: repFields,
|
||
field: repFields,
|
||
fields: repFields,
|
||
|
||
reduce: repReduce,
|
||
inject: repReduce,
|
||
foldl: repReduce,
|
||
|
||
map: repMap,
|
||
collect: repMap,
|
||
|
||
each: repEach,
|
||
forEach: repEach,
|
||
|
||
tap: repTap,
|
||
'do': repTap,
|
||
|
||
after: repAfter,
|
||
last: repAfter,
|
||
done: repAfter,
|
||
|
||
execute: repExecute,
|
||
go: repExecute,
|
||
run: repExecute
|
||
};
|
||
}(section));
|
||
},
|
||
|
||
|
||
repeatingSimpleSum = function(section, field, destination){
|
||
repeating(section)
|
||
.attr(destination)
|
||
.field(field)
|
||
.reduce(function(m,r){
|
||
return m + (r.F[field]);
|
||
},0,function(t,r,a){
|
||
a.S[destination]=t;
|
||
})
|
||
.execute();
|
||
};
|
||
|
||
console.log('%c•.¸¸.•*´¨`*•.¸¸.•*´¨`*•.¸ The Aaron Sheet v'+version+' ¸.•*´¨`*•.¸¸.•*´¨`*•.¸¸.•','background: linear-gradient(to right,green,white,white,green); color:black;text-shadow: 0 0 8px white;');
|
||
console.log('%c•.¸¸.•*´¨`*•.¸¸.•*´¨`*•.¸ Last update: '+(new Date(lastUpdate*1000))+' ¸.•*´¨`*•.¸¸.•*´¨`*•.¸¸.•','background: linear-gradient(to right,green,white,white,green); color:black;text-shadow: 0 0 8px white;');
|
||
|
||
|
||
return {
|
||
/* Repeating Sections */
|
||
repeatingSimpleSum: repeatingSimpleSum,
|
||
repeating: repeating,
|
||
|
||
/* Configuration */
|
||
config: setConfigOption,
|
||
|
||
/* Debugging */
|
||
callback: wrapCallback,
|
||
callstack: logCallstack,
|
||
debugMode: debugMode,
|
||
_fn: wrapCallback,
|
||
|
||
/* Logging */
|
||
debug: logDebug,
|
||
error: logError,
|
||
warn: logWarn,
|
||
info: logInfo,
|
||
notice: logNotice,
|
||
log: logLog
|
||
};
|
||
}());
|
||
|
||
/* ---- END: TheAaronSheet.js ---- */
|
||
|
||
on("change:str change:dex change:int change:con change:wis change:cha", function (eventInfo) {
|
||
getAttrs([eventInfo.sourceAttribute], function(values) {
|
||
for (key in values) {
|
||
// order matters
|
||
var val = parseInt(values[key]);
|
||
var mod = 0;
|
||
if (val <= 3) { mod = -3; }
|
||
else if (val <= 5) { mod = -2; }
|
||
else if (val <= 8) { mod = -1; }
|
||
else if (val <= 12) { mod = 0; }
|
||
else if (val <= 15) { mod = 1; }
|
||
else if (val <= 17) { mod = 2; }
|
||
else if (val <= 18) { mod = 3; }
|
||
else if (val <= 19) { mod = 4; }
|
||
|
||
obj = {};
|
||
obj[key + "_mod"] = mod;
|
||
obj[key + "_check"] = 21 - val;
|
||
|
||
setAttrs(obj);
|
||
}
|
||
});
|
||
});
|
||
|
||
on("change:repeating_words", function (eventInfo) {
|
||
TAS.repeatingSimpleSum('words','committed_effort','total_word_committed_effort');
|
||
TAS.repeatingSimpleSum('words','cost','word_points_spent');
|
||
});
|
||
|
||
on("change:repeating_gifts", function (eventInfo) {
|
||
TAS.repeatingSimpleSum('gifts','committed_effort','total_gift_committed_effort');
|
||
TAS.repeatingSimpleSum('gifts','cost','gift_points_spent');
|
||
});
|
||
|
||
on("change:repeating_miracles", function (eventInfo) {
|
||
TAS.repeatingSimpleSum('miracles','committed_effort','total_miracle_committed_effort');
|
||
});
|
||
|
||
on("change:repeating_npc-tactics", function(eventInfo) {
|
||
TAS.repeating('npc-tactics')
|
||
.fields('tactic_description')
|
||
.attrs('total_npc_tactics')
|
||
.reduce(function(memo, row, attrSet, id, rowSet) {
|
||
memo = memo + 1;
|
||
return memo;
|
||
}, 0, function(memo, rowSet, attrSet) {
|
||
setAttrs({total_npc_tactics: memo});
|
||
})
|
||
.execute();
|
||
});
|
||
|
||
on("change:repeating_npc-effort", function(eventInfo) {
|
||
TAS.repeatingSimpleSum('npc-effort', 'npc_effort_cost', 'total_npc_committed_effort');
|
||
});
|
||
|
||
on("change:repeating_faction-problems", function(eventInfo) {
|
||
TAS.repeatingSimpleSum('faction-problems', 'faction_problem_cost', 'faction_trouble');
|
||
});
|
||
|
||
on("change:repeating_faction-projects", function(eventInfo) {
|
||
TAS.repeatingSimpleSum('faction-projects', 'faction_project_spent', 'faction_dominion_spent');
|
||
});
|
||
|
||
power_map = {
|
||
"6": 1,
|
||
"8": 2,
|
||
"10": 3,
|
||
"12": 4,
|
||
"20": 5
|
||
};
|
||
|
||
on("change:faction_action_die_sides", function(eventInfo) {
|
||
getAttrs([eventInfo.sourceAttribute], function(values) {
|
||
for (key in values) {
|
||
setAttrs({
|
||
faction_action_die: "1d" + values[key],
|
||
faction_power: power_map[values[key]],
|
||
faction_cohesion: power_map[values[key]]
|
||
});
|
||
}
|
||
});
|
||
});
|
||
|
||
on("change:repeating_projects", function(eventInfo) {
|
||
TAS.repeatingSimpleSum('projects', 'project_dominion_spent', 'dominion_spent');
|
||
TAS.repeatingSimpleSum('projects', 'project_influence_spent', 'influence_spent');
|
||
});
|
||
|
||
</script>
|
||
|
||
<div class='sheet-container'>
|
||
<input type="radio" class="sheet-tab sheet-character" name="attr_tab" checked="checked" value="1" title="Character" />
|
||
<input type="radio" class="sheet-tab sheet-npc" name="attr_tab" value="2" title="NPC" />
|
||
<input type="radio" class="sheet-tab sheet-faction" name="attr_tab" value="3" title="Faction" />
|
||
|
||
<div class="spacer"></div>
|
||
<div class="sheet-tab-content sheet-faction">
|
||
<div class="sheet-column">
|
||
<label for="sheet-info-section" class="sheet-faction sheet-section-title">Info</label>
|
||
<div class="sheet-info-section">
|
||
<table class="sheet-info-table">
|
||
<tbody>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
Name
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<input type="text" min="0" name="attr_character_name" class='sheet-faction sheet-input sheet-faction-name' value="" />
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
Action Die
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<select name="attr_faction_action_die_sides" class="sheet-dropdown">
|
||
<option value="6">1d6</option>
|
||
<option value="8">1d8</option>
|
||
<option value="10">1d10</option>
|
||
<option value="12">1d12</option>
|
||
<option value="20">1d20</option>
|
||
</select>
|
||
<button type="roll" name="roll_faction_action_die" value="&{template:default} {{name=Action Die @{faction_action_die}}} {{roll=[[(@{faction_action_die}) + ?{Modifier|0}]]}}" class='sheet-button'></button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
Power
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<input type="number" min="0" name="attr_faction_power" class='sheet-faction sheet-input' value="1" readonly="true" />
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
Cohesion
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<input type="number" min="0" name="attr_faction_cohesion" class='sheet-faction sheet-input sheet-min' value="@{faction_action_die_sides}" />
|
||
<span class="sheet-faction sheet-separator">/</span>
|
||
<input type="number" min="0" name="attr_faction_cohesion_max" class='sheet-faction sheet-input sheet-max' value="@{faction_power}" disabled="true" />
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
Trouble
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<span class="sheet-values">
|
||
<input type="number" min="0" name="attr_faction_trouble" class='sheet-faction sheet-input' value="0" readonly="true" />
|
||
<span class="sheet-faction sheet-separator">/</span>
|
||
<input type="number" min="0" name="attr_faction_trouble_max" class='sheet-faction sheet-input sheet-max' value="@{faction_action_die_sides}" disabled="true" />
|
||
</span>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<div class="sheet-dominion-scores">
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th colspan="3">Dominion</th>
|
||
</tr>
|
||
<tr>
|
||
<th>Total</th>
|
||
<th>Spent</th>
|
||
<th>Free</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><input type="number" name="attr_faction_dominion_total" class='sheet-faction sheet-input' value="0" /></td>
|
||
<td><input type="number" name="attr_faction_dominion_spent" class='sheet-faction sheet-input' readonly /></td>
|
||
<td><input type="number" name="attr_faction_dominion_free" class='sheet-faction sheet-input' value="(@{faction_dominion_total}) - (@{faction_dominion_spent})" disabled="true"/></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<div class="sheet-interests-section">
|
||
<label for="repeating_faction-interests" class="sheet-section-title">Interests</label>
|
||
<fieldset class="repeating_faction-interests">
|
||
<div class="sheet-interest">
|
||
<input type="number" name="attr_faction_interest_score" class='sheet-faction sheet-input .sheet-interest-score' value="0" />
|
||
<input type="text" min="0" name="attr_faction_interest_name" class='sheet-faction sheet-input sheet-interest-name' value="" placeholder="Interest name"/>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="sheet-column">
|
||
<div class="sheet-features-section">
|
||
<label for="repeating_faction-features" class="sheet-section-title">Features</label>
|
||
<fieldset class="repeating_faction-features">
|
||
<div class="sheet-feature">
|
||
<textarea name="attr_faction_feature_description" class='sheet-faction sheet-textarea' value="" placeholder="Feature Description"></textarea>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
<div class="sheet-problems-section">
|
||
<label for="repeating_faction-problems" class="sheet-section-title">Problems</label>
|
||
<fieldset class="repeating_faction-problems">
|
||
<div class="sheet-problem">
|
||
<input type="number" name="attr_faction_problem_cost" class='sheet-faction sheet-input' value="0" />
|
||
<textarea name="attr_faction_problem_description" class='sheet-faction sheet-textarea' value="" placeholder="Problem Description"></textarea>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="sheet-projects-section">
|
||
<label for="repeating_faction-projects" class="sheet-section-title">Projects</label>
|
||
<div class="sheet-projects">
|
||
<fieldset class="repeating_faction-projects">
|
||
<div class="sheet-project">
|
||
|
||
<div class="sheet-project-name-section">
|
||
<input type="text" min="0" name="attr_faction_project_name" class='sheet-faction sheet-project-element sheet-input' value="" placeholder="Project name" />
|
||
</div>
|
||
|
||
<div class="sheet-project-details-subsection">
|
||
<select name="attr_faction_project_difficulty" class="sheet-dropdown sheet-project-element">
|
||
<option value="1">Plausible</option>
|
||
<option value="2">Improbable</option>
|
||
</select>
|
||
|
||
<select name="attr_faction_project_scope" class="sheet-dropdown sheet-project-element">
|
||
<option value="1">Village</option>
|
||
<option value="2">City</option>
|
||
<option value="4">Region</option>
|
||
<option value="8">Nation</option>
|
||
<option value="16">Realm</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="sheet-project-completed-subsection">
|
||
<label for="attr_faction_project_completed" class="sheet-field-title">Completed?</label>
|
||
<input type="checkbox" name="attr_faction_project_completed" class="sheet-project-element" />
|
||
</div>
|
||
|
||
<table class="sheet-project-dominion-tally sheet-project-element">
|
||
<thead class="sheet-project-dominion-tally-headers">
|
||
<tr>
|
||
<th class="sheet-field-title" colspan="3">Dominion</th>
|
||
</tr>
|
||
<tr>
|
||
<th class="sheet-field-title" >Spent</th>
|
||
<th class="sheet-field-title" >Cost</th>
|
||
<th class="sheet-field-title" >Remaining</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>
|
||
<input type="number" min="0" name="attr_faction_project_spent" class='sheet-faction sheet-project-element sheet-input sheet-max' value="0" />
|
||
</td>
|
||
<td>
|
||
<input type="number" min="0" name="attr_faction_project_cost" class='sheet-faction sheet-project-element sheet-input sheet-max' value="(@{faction_project_difficulty}) * (@{faction_project_scope})" disabled="true"/>
|
||
</td>
|
||
<td>
|
||
<input type="number" min="0" name="attr_faction_project_remaining" class='sheet-faction sheet-project-element sheet-input sheet-max' value="(@{faction_project_cost}) - (@{faction_project_spent})" disabled="true"/>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sheet-tab-content sheet-npc">
|
||
<label for='info-section' class='sheet-title sheet-title-label'> NPC </label>
|
||
<div class="sheet-column">
|
||
<label for+"sheet-npc-info" class="sheet-npc-section-title">Info</label>
|
||
<table name="sheet-npc-info">
|
||
<tbody>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
Name
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<input type="text" name="attr_character_name" class='sheet-npc sheet-input' value="" />
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
Move
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<input type="number" min="1" name="attr_npc_move" class='sheet-npc sheet-input' value="30" />
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
HD
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<span class="sheet-values">
|
||
<input type="number" min="0" name="attr_npc_hd_current" class='sheet-npc sheet-input sheet-min' value="1" />
|
||
<span class="sheet-npc sheet-separator">/</span>
|
||
<input type="number" min="0" name="attr_npc_hd_max" class='sheet-npc sheet-input sheet-max' value="1"/>
|
||
</span>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
Save
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<input type="number" min="1" name="attr_npc_save" class='sheet-npc sheet-input' value="15" />
|
||
<button type="roll" name="roll_npc_attack" value="&{template:default} {{name=Save by @{character_name}}} {{roll=[[1d20>@{npc_save} + ?{Modifier|0}]]}}" class='sheet-button'></button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
AC
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<input type="number" min="1" name="attr_npc_ac" class='sheet-npc sheet-input' value="9" />
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
Morale
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<input type="number" min="1" name="attr_npc_morale" class='sheet-npc sheet-input' value="10" />
|
||
<button type="roll" name="roll_npc_attack" value="&{template:default} {{name=Morale Check by @{character_name}}} {{roll=[[1d20>@{npc_morale} + ?{Modifier|0}]]}}" class='sheet-button'></button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
Damage
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<input type="text" name="attr_npc_damage" class='sheet-npc sheet-input' placeholder="1d6" />
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
Type
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<select name="attr_npc_damage_type" class="sheet-dropdown">
|
||
<option value="">Normal</option>
|
||
<option value="Straight">Straight</option>
|
||
</select>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
Attack Bonus
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<input type="number" name="attr_npc_attack_bonus" class='sheet-npc sheet-input' value="0" />
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
Number of Attacks
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<input type="number" name="attr_npc_attack_qty" class='sheet-npc sheet-input' value="0" />
|
||
<button type="roll" name="roll_npc_attack" value="&{template:default} {{name=Attack by @{character_name}}} {{roll=[[1d20 + @{npc_attack_bonus} + ?{Modifier|0} + ?{Target AC|9}]]}} {{damage=[[@{npc_damage}]] @{npc_damage_type}}}" class='sheet-button'></button>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<div class="sheet-column">
|
||
<div class="sheet-tactics">
|
||
<label for="repeating_npc-tactics" class="sheet-npc-section-title">Tactics</label>
|
||
<ol class="sheet-tactics-list">
|
||
<fieldset class="repeating_npc-tactics">
|
||
<li>
|
||
<input type="text" name="attr_tactic_description" class="sheet-input sheet-tactic" value="" placeholder="Tactic description"/>
|
||
</li>
|
||
</fieldset>
|
||
</ol>
|
||
<div class='sheet-tactic-chooser'>
|
||
<label for="roll_npc_tactic" class='sheet-field-content'>Choose Tactic</label>
|
||
<button type="roll" name="roll_npc_tactic" value="/w gm (@{character_name}) uses tactic #([[1d(@{total_npc_tactics})]])" class='sheet-button'></button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="sheet-effort">
|
||
<label for="repeating_npc-effort" class="sheet-npc-section-title">Effort</label>
|
||
<fieldset class="repeating_npc-effort">
|
||
<input type="text" name="attr_npc_effort_description" class="sheet-input sheet-tactic" value="" placeholder="Effort description"/>
|
||
<input type="number" name="attr_npc_effort_cost" class="sheet-input sheet-tactic" min="0" value="0" />
|
||
</fieldset>
|
||
</div>
|
||
<table class="sheet-npc-effort-table">
|
||
<thead>
|
||
<th></th>
|
||
<th>Total</th>
|
||
<th>Spent</th>
|
||
<th>Free</th>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td class='sheet-field-title'>
|
||
Effort
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<input type="number" min="0" name="attr_npc_effort_total" class='sheet-npc sheet-input' value="0" />
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<input type="number" min="0" name="attr_npc_effort_spent" class='sheet-npc sheet-input' value="(@{total_npc_committed_effort})" disabled="true"/>
|
||
</td>
|
||
<td class='sheet-field-content'>
|
||
<input type="number" min="0" name="attr_npc_effort_free" class='sheet-npc sheet-input' value="(@{npc_effort_total}) - (@{npc_effort_spent})" disabled="true"/>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
|
||
</div>
|
||
</div>
|
||
<div class="sheet-tab-content sheet-character">
|
||
<div class='sheet-column'>
|
||
<div name='info-section' class='sheet-info'>
|
||
<label for='info-section' class='sheet-title sheet-title-label'>
|
||
Godbound
|
||
</label>
|
||
<div class='sheet-name'>
|
||
<label for="attr_character_name" class='sheet-field-title'>Name</label>
|
||
<input type="text" name="attr_character_name" class='sheet-info sheet-input' value="" />
|
||
</div>
|
||
|
||
<div class='sheet-description'>
|
||
<label for="attr_description" class='sheet-field-title'>Description</label>
|
||
<textarea name="attr_description" class='sheet-info sheet-input' value=""></textarea>
|
||
</div>
|
||
|
||
<div class='sheet-goal'>
|
||
<label for="attr_goal" class='sheet-field-title'>Goal</label>
|
||
<textarea name="attr_goal" class='sheet-info sheet-input'></textarea>
|
||
</div>
|
||
|
||
<div class='sheet-core-stats'>
|
||
<div class='sheet-level'>
|
||
<label for="attr_level" class='sheet-field-title'>Level</label>
|
||
<input type="number" min="1" name="attr_level" class='sheet-core sheet-input-thin sheet-input' value="1" />
|
||
</div>
|
||
|
||
<div class='sheet-points'>
|
||
<label for="attr_points" class='sheet-field-title'>Points</label>
|
||
<input type="number" min="1" name="attr_points" class='sheet-core sheet-input-thin sheet-input' value="6 + 2 * (@{adj_level}) - (@{points_spent})" disabled=true />
|
||
</div>
|
||
|
||
<div class='sheet-XP'>
|
||
<label for="attr_xp" class='sheet-field-title'>XP</label>
|
||
<span class="sheet-values">
|
||
<input type="number" min="0" name="attr_xp_current" class='sheet-core sheet-input sheet-min' value="0" />
|
||
<span class="sheet-core sheet-separator">/</span>
|
||
<input type="number" min="0" name="attr_xp_max" class='sheet-core sheet-input sheet-max' value="0" />
|
||
</span>
|
||
</div>
|
||
|
||
<div class='sheet-HP'>
|
||
<label for="attr_hp" class='sheet-field-title'>HP</label>
|
||
<span class="sheet-values">
|
||
<input type="number" min="0" name="attr_hp_current" class='sheet-core sheet-input sheet-min' value="8" />
|
||
<span class="sheet-core sheet-separator">/</span>
|
||
<input type="number" min="0" name="attr_hp_max" class='sheet-core sheet-input sheet-max' value="8 + 4*(@{adj_level}) + ceiling((@{adj_level}) * (@{con_mod}) / 2)" disabled=true" />
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class='sheet-attributes-section'>
|
||
<label for="table-attributes" class='sheet-table-attributes sheet-title-label'>Attributes</label>
|
||
<table name="table-attributes" class='sheet-table-attributes'>
|
||
<thead>
|
||
<tr>
|
||
<th></th>
|
||
<th class="sheet-header">Score</th>
|
||
<th class="sheet-header">Modifier</th>
|
||
<th class="sheet-header">Check</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td class='sheet-table-field-title'>Str</td>
|
||
<td><input type="number" min="3" max="19" name="attr_str" class='sheet-stats sheet-input' value="10" /></td>
|
||
<td>
|
||
<button type="roll" name="roll_str_mod" value="&{template:default} {{name=Strength Roll}} {{roll=[[1d20 + @{str_mod} + ?{Modifier|0}]]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-stats" name="attr_str_mod" readonly />
|
||
</button>
|
||
</td>
|
||
<td>
|
||
<button type="roll" name="roll_str_check" value="&{template:default} {{name=Strength Check}} {{roll=[[1d20>@{str_check} + ?{Modifier|0}]]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-stats" name="attr_str_check" readonly />
|
||
</button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-table-field-title'>Dex</td>
|
||
<td><input type="number" min="3" max="19" name="attr_dex" class='sheet-stats sheet-input' value="10" /></td>
|
||
<td>
|
||
<button type="roll" name="roll_dex_mod" value="&{template:default} {{name=Dexterity Roll}} {{roll=[[1d20 + @{dex_mod} + ?{Modifier|0}]]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-stats" name="attr_dex_mod" readonly />
|
||
</button>
|
||
</td>
|
||
<td>
|
||
<button type="roll" name="roll_dex_check" value="&{template:default} {{name=Dexterity Check}} {{roll=[[1d20>@{dex_check} + ?{Modifier|0}]]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-stats" name="attr_dex_check" readonly />
|
||
</button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-table-field-title'>Con</td>
|
||
<td><input type="number" min="3" max="19" name="attr_con" class='sheet-stats sheet-input' value="10" /></td>
|
||
<td>
|
||
<button type="roll" name="roll_con_mod" value="&{template:default} {{name=Constitution Roll}} {{roll=[[1d20 + @{con_mod} + ?{Modifier|0}]]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-stats" name="attr_con_mod" readonly />
|
||
</button>
|
||
</td>
|
||
<td>
|
||
<button type="roll" name="roll_con_check" value="&{template:default} {{name=Constitution Check}} {{roll=[[1d20>@{con_check} + ?{Modifier|0}]]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-stats" name="attr_con_check" readonly />
|
||
</button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-table-field-title'>Wis</td>
|
||
<td><input type="number" min="3" max="19" name="attr_wis" class='sheet-input sheet-stats' value="10" /></td>
|
||
<td>
|
||
<button type="roll" name="roll_wis_mod" value="&{template:default} {{name=Wisdom Roll}} {{roll=[[1d20 + @{wis_mod} + ?{Modifier|0}]]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-stats" name="attr_wis_mod" readonly />
|
||
</button>
|
||
</td>
|
||
<td>
|
||
<button type="roll" name="roll_wis_check" value="&{template:default} {{name=Wisdom Check}} {{roll=[[1d20>@{wis_check} + ?{Modifier|0}]]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-stats" name="attr_wis_check" readonly />
|
||
</button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-table-field-title'>Int</td>
|
||
<td><input type="number" min="3" max="19" name="attr_int" class='sheet-input sheet-stats' value="10" /></td>
|
||
<td>
|
||
<button type="roll" name="roll_int_mod" value="&{template:default} {{name=Intelligence Roll}} {{roll=[[1d20 + @{int_mod} + ?{Modifier|0}]]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-stats" name="attr_int_mod" readonly />
|
||
</button>
|
||
</td>
|
||
<td>
|
||
<button type="roll" name="roll_int_check" value="&{template:default} {{name=Intelligence Check}} {{roll=[[1d20>@{int_check} + ?{Modifier|0}]]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-stats" name="attr_int_check" readonly />
|
||
</button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-table-field-title'>Cha</td>
|
||
<td><input type="number" min="3" max="19" name="attr_cha" class='sheet-stats sheet-input' value="10" /></td>
|
||
<td>
|
||
<button type="roll" name="roll_cha_mod" value="&{template:default} {{name=Charisma Roll}} {{roll=[[1d20 + @{cha_mod}] + ?{Modifier|0}]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-stats" name="attr_cha_mod" readonly />
|
||
</button>
|
||
</td>
|
||
<td>
|
||
<button type="roll" name="roll_cha_check" value="&{template:default} {{name=Charisma Check}} {{roll=[[1d20>@{cha_check} + ?{Modifier|0}]]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-stats" name="attr_cha_check" readonly />
|
||
</button>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<div class='sheet-saves-section'>
|
||
<label for="table-saves" class="sheet-table-saves sheet-title-label">Saves</label>
|
||
<table name="table-saves" class="sheet-table-saves">
|
||
<thead>
|
||
<tr>
|
||
<th></th>
|
||
<th>Base</th>
|
||
<th>Modifier</th>
|
||
<th>Penalty</th>
|
||
<th>Final Save</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td class='sheet-table-field-title'>Hardiness</td>
|
||
<td><input type="number" name="attr_save_hardiness_base" class='sheet-input sheet-saves' value="((15 - ((@{str_mod}) + (@{con_mod}) + (abs( (@{str_mod}) - (@{con_mod}) ))) / 2) - (@{adj_level}))" disabled="true" /></td>
|
||
<td><input type="number" name="attr_save_hardiness_mod" class='sheet-input sheet-saves' value="0" /></td>
|
||
<td><input type="number" name="attr_hardiness_penalty" class='sheet-input sheet-saves' readonly /></td>
|
||
<td>
|
||
<button type="roll" name="roll_hardiness_save" value="&{template:default} {{name=Hardiness Check}} {{roll=[[1d20>@{save_hardiness_final} + ?{Modifier|0}]]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-saves" name="attr_save_hardiness_final" value="(@{save_hardiness_base})+(@{save_hardiness_mod})-(@{hardiness_penalty})" disabled=true />
|
||
</button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-table-field-title'>Evasion</td>
|
||
<td><input type="number" name="attr_save_evasion_base" class='sheet-input sheet-saves' value="((15 - ((@{dex_mod}) + (@{int_mod}) + (abs( (@{dex_mod}) - (@{int_mod}) ))) / 2) - (@{adj_level}))" disabled=true /></td>
|
||
<td><input type="number" name="attr_save_evasion_mod" class='sheet-input sheet-saves' value="0" /></td>
|
||
<td><input type="number" name="attr_evasion_penalty" class='sheet-input sheet-saves' readonly /></td>
|
||
<td>
|
||
<button type="roll" name="roll_evasion_save" value="&{template:default} {{name=Evasion Check}} {{roll=[[1d20>@{save_evasion_final} + ?{Modifier|0}]]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-saves" name="attr_save_evasion_final" value="(@{save_evasion_base})+(@{save_evasion_mod})-(@{evasion_penalty})" disabled=true />
|
||
</button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class='sheet-table-field-title'>Spirit</td>
|
||
<td><input type="number" name="attr_save_spirit_base" class='sheet-input sheet-saves' value="((15 - ((@{wis_mod}) + (@{cha_mod}) + (abs( (@{wis_mod}) - (@{cha_mod}) ))) / 2) - (@{adj_level}))" disabled=true /></td>
|
||
<td><input type="number" name="attr_save_spirit_mod" class='sheet-input sheet-saves' value="0" /></td>
|
||
<td><input type="number" name="attr_spirit_penalty" class='sheet-input sheet-saves' readonly /></td>
|
||
<td>
|
||
<button type="roll" name="roll_spirit_save" value="&{template:default} {{name=Spirit Check}} {{roll=[[1d20>@{save_spirit_final} + ?{Modifier|0}]]}}" class="sheet-blank-roll-button sheet-button">
|
||
<input type="number" class="sheet-input sheet-rollable-value sheet-saves" name="attr_save_spirit_final" value="(@{save_spirit_base})+(@{save_spirit_mod})-(@{spirit_penalty})" disabled=true />
|
||
</button>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<div class='sheet-resources'>
|
||
<label for="table-resources" class="sheet-title-label" >Resources</label>
|
||
<table name="table-resources" class="sheet-resources-table">
|
||
<thead>
|
||
<th></th>
|
||
<th>Total</th>
|
||
<th>Spent</th>
|
||
<th>Free</th>
|
||
<th>Earned</th>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td class="sheet-resources-table-element">Effort</td>
|
||
<td class="sheet-resources-table-element"><input type="number" min="0" name="attr_effort_total" class='sheet-resources sheet-input' value="((@{adj_level}) + 2)" disabled=true /></td>
|
||
<td class="sheet-resources-table-element"><input type="number" min="0" name="attr_effort_spent" class='sheet-resources sheet-input' disabled="true" value="((@{total_word_committed_effort}) + (@{total_gift_committed_effort}) + (@{total_miracle_committed_effort}))" /></td>
|
||
<td class="sheet-resources-table-element"><input type="number" min="0" name="attr_effort_free" class='sheet-resources sheet-input' disabled="true" value="((@{effort_total}) - (@{effort_spent}))" /></td>
|
||
<td class="sheet-resources-table-element"></td>
|
||
</tr>
|
||
<tr>
|
||
<td class="sheet-resources-table-element">Influence</td>
|
||
<td class="sheet-resources-table-element"><input type="number" min="0" name="attr_influence_total" class='sheet-resources sheet-input' value="((@{adj_level}) + 2)" disabled=true /></td>
|
||
<td class="sheet-resources-table-element"><input type="number" min="0" name="attr_influence_spent" class='sheet-resources sheet-input' readonly /></td>
|
||
<td class="sheet-resources-table-element"><input type="number" min="0" name="attr_influence_free" class='sheet-resources sheet-input' disabled="true" value="((@{influence_total}) - (@{influence_spent}))" /></td>
|
||
<td class="sheet-resources-table-element"></td>
|
||
</tr>
|
||
<tr>
|
||
<td class="sheet-resources-table-element">Dominion</td>
|
||
<td class="sheet-resources-table-element"><input type="number" min="0" name="attr_dominion_total" class='sheet-resources sheet-input' value="0" /></td>
|
||
<td class="sheet-resources-table-element"><input type="number" min="0" name="attr_dominion_spent" class='sheet-resources sheet-input' readonly /></td>
|
||
<td class="sheet-resources-table-element"><input type="number" min="0" name="attr_dominion_free" class='sheet-resources sheet-input' disabled="true" value="((@{dominion_total}) - (@{dominion_spent}))" /></td>
|
||
<td class="sheet-resources-table-element"><input type="number" min="0" name="attr_dominion_earned" class='sheet-resources sheet-input' value="0" /></td>
|
||
</tr>
|
||
<tr>
|
||
<td class="sheet-resources-table-element">Wealth</td>
|
||
<td class="sheet-resources-table-element"><input type="number" min="0" name="attr_wealth_total" class='sheet-resources sheet-input' value="0" /></td>
|
||
<td colspan='3'></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<div class='sheet-column sheet-center-column'>
|
||
<div class='sheet-armor'>
|
||
<label for="sheet-armor" class="sheet-title-label">Armor</label>
|
||
<div class="sheet-armor" name="sheet-armor">
|
||
<div class="sheet-armor-ac">
|
||
<label for="attr_armor_ac" class='sheet-field-title'>AC</label>
|
||
<input type="number" name="attr_armor_ac" class="sheet-input sheet-armor sheet-armor-ac-value" value="9" max="9" />
|
||
</div>
|
||
<div class="sheet-armor-type">
|
||
<label for="attr_armor_type" class='sheet-field-title'>Type</label>
|
||
<input type="text" name="attr_armor_type" class="sheet-input sheet-armor sheet-armor-type" value="" />
|
||
</div>
|
||
<div class="sheet-armor-shield">
|
||
<label for="attr_armor_shield" class='sheet-field-title'>Shield</label>
|
||
<input type="number" name="attr_armor_shield" class="sheet-input sheet-armor sheet-armor-shield" value="0" />
|
||
</div>
|
||
<div class="sheet-armor-net">
|
||
<label for="attr_armor_net" class='sheet-field-title'>Total AC</label>
|
||
<input type="number" name="attr_armor_net" class="sheet-input sheet-armor sheet-armor-net" value="((@{armor_ac}) + (@{armor_shield}) - (@{dex_mod}))" disabled="true" />
|
||
</div>
|
||
<div class="sheet-armor-description">
|
||
<label for="attr_armor-description" class='sheet-field-title'>Description</label>
|
||
<textarea name="attr_armor_description" class="sheet-input sheet-armor sheet-armor-description" placeholder="None"></textarea>
|
||
</div>
|
||
|
||
<div class="sheet-armor-saving-throw-penalty">
|
||
<label for="attr_armor_saving_throw_penalty" class='sheet-saving-throw-penalty-element sheet-field-title'>Penalties</label>
|
||
<div class="sheet-armor-saving-throw-penalty-choices">
|
||
<div class="sheet-armor-saving-throw-penalty-choice">
|
||
<label for="attr_hardiness_penalty" class='sheet-saving-throw-penalty-element sheet-small-title-label'>Hardiness</label>
|
||
<input type="checkbox" name="attr_hardiness_penalty" class='sheet-saving-throw-penalty-element sheet-input sheet-penalty sheet-hardiness-penalty' value="-4" />
|
||
</div>
|
||
<div class="sheet-armor-saving-throw-penalty-choice">
|
||
<label for="attr_evasion_penalty" class='sheet-saving-throw-penalty-element sheet-small-title-label'>Evasion</label>
|
||
<input type="checkbox" name="attr_evasion_penalty" class='sheet-saving-throw-penalty-element sheet-input sheet-penalty sheet-evasion-penalty' value="-4" />
|
||
</div>
|
||
<div class="sheet-armor-saving-throw-penalty-choice">
|
||
<label for="attr_spirit_penalty" class='sheet-saving-throw-penalty-element sheet-small-title-label'>Spirit</label>
|
||
<input type="checkbox" name="attr_spirit_penalty" class='sheet-saving-throw-penalty-element sheet-input sheet-penalty sheet-spirit-penalty' value="-4" />
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class='sheet-weapons' name="sheet-weapons">
|
||
<label for="sheet-weapons" class="sheet-title-label">Weapons</label>
|
||
<div class="sheet-weapons-ab">
|
||
<label for="attr_weapons_base_ab" class="sheet-field-label sheet-weapons-ab">Base Attack Bonus</label>
|
||
<input type="number" value="(@{adj_level})" disabled=true name="attr_weapon_base_ab" class='sheet-input sheet-weapons-ab' />
|
||
</div>
|
||
|
||
<div class="sheet-weapons-list">
|
||
<div name="table-weapons" class="sheet-table-weapons">
|
||
<fieldset class="repeating_weapons">
|
||
<div class='sheet-weapon'>
|
||
<div class='sheet-weapon-name'>
|
||
<input type="text" name="attr_weapon_name" class="sheet-input sheet-weapon-name" value="" placeholder="Name"/>
|
||
</div>
|
||
<div class="sheet-weapon-info">
|
||
<span class='sheet-weapon-info-attribute sheet-weapon-info-element'>
|
||
<select name="attr_weapon_attribute" class="sheet-dropdown">
|
||
<option value="@{str_mod}">STR</option>
|
||
<option value="@{dex_mod}">DEX</option>
|
||
<option value="@{con_mod}">CON</option>
|
||
<option value="@{wis_mod}">WIS</option>
|
||
<option value="@{int_mod}">INT</option>
|
||
<option value="@{cha_mod}">CHA</option>
|
||
</select>
|
||
</span>
|
||
<span class='sheet-weapon-info-ab sheet-weapon-info-element'>
|
||
<input type="number" name="attr_weapon_ab" class="sheet-input sheet-weapon-info-ab" placeholder="AB" />
|
||
</span>
|
||
<span class='sheet-weapon-info-damage sheet-weapon-info-element'>
|
||
<input type="text" name="attr_weapon_damage" class="sheet-input sheet-weapon-info-damage" placeholder="1d6" />
|
||
</span>
|
||
<span class='sheet-weapon-info-roll sheet-weapon-info-element'>
|
||
<button type="roll" name="roll_weapon" class="sheet-button sheet-weapon-info-roll" value="&{template:default} {{attack=[[1d20 + (@{weapon_base_ab}) + (@{weapon_ab}) + (@{weapon_attribute}) + ?{Attack Modifier|0} + (?{Target AC|9})>20]]}} {{damage=Roll @{weapon_damage} with a @{weapon_attribute} modifier available}} {{name=Attack with @{weapon_name}}}" />
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class='sheet-fray sheet-2colrow'>
|
||
<div class="sheet-col sheet-fray-die">
|
||
<label for="attr_fray_die" class="sheet-title-label">Fray Die</label>
|
||
<input type="text" value="1d8" class="sheet-input sheet-fray-die" name="attr_fray_die" />
|
||
<button type="roll" name="roll_fray" class="sheet-button sheet-weapon_damage" value="&{template:default} {{fray=[[(@{fray_die})]]}} {{name=Attack with Fray Die}}" />
|
||
</div>
|
||
<div class="sheet-col sheet-damage-chart">
|
||
<label for="table-damage-chart" class="sheet-title-label">Damage Chart</label>
|
||
<table name="table-damage-chart" class="sheet-damage-chart">
|
||
<thead>
|
||
<th> Roll (per die) </th>
|
||
<th> Damage </th>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td> 1 or less </td>
|
||
<td> 0 </td>
|
||
</tr>
|
||
<tr>
|
||
<td> 2-5 </td>
|
||
<td> 1 </td>
|
||
</tr>
|
||
<tr>
|
||
<td> 6-9 </td>
|
||
<td> 2 </td>
|
||
</tr>
|
||
<tr>
|
||
<td> 10 or more </td>
|
||
<td> 3 </td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
|
||
<label for="sheet-facts" class="sheet-title-label">Facts</label>
|
||
<div class='sheet-facts' name='sheet-facts'>
|
||
<div class='sheet-origin'>
|
||
<label for="attr_fact_origin" class='sheet-field-title'>Origin</label>
|
||
<textarea name="attr_fact_origin" class='sheet-input sheet-facts' value=""></textarea>
|
||
</div>
|
||
<div class='sheet-career'>
|
||
<label for="attr_fact_career" class='sheet-field-title'>Career</label>
|
||
<textarea name="attr_fact_career" class='sheet-input sheet-facts' value=""></textarea>
|
||
</div>
|
||
<div class='sheet-relationship'>
|
||
<label for="attr_fact_relationship" class='sheet-field-title'>Relationship</label>
|
||
<textarea name="attr_fact_relationship" class='sheet-input sheet-facts' value=""></textarea>
|
||
</div>
|
||
<fieldset class="repeating_facts">
|
||
<div class='sheet-fact'>
|
||
<label for="attr_fact_relationship" class='sheet-field-title'>Fact</label>
|
||
<textarea name="attr_fact_relationship" class='sheet-input sheet-facts' placeholder="Fact about your adventure"></textarea>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
</div>
|
||
|
||
<div class='sheet-column'>
|
||
<div class='sheet-words'>
|
||
<label for="table-words" class="sheet-title-label">Words</label>
|
||
<div name="table-words" class="sheet-table-words">
|
||
<div class='sheet-table-row sheet-table-header-row'>
|
||
<span class="sheet-table-header sheet-table-cell sheet-power-name">Word</span>
|
||
<span class="sheet-table-header sheet-table-cell sheet-power-cost">Cost</span>
|
||
<span class="sheet-table-header sheet-table-cell sheet-power-effort">Effort</span>
|
||
</div>
|
||
<fieldset class="repeating_words">
|
||
<div class='sheet-table-row'>
|
||
<input type="text" name="attr_name" value="" class='sheet-input sheet-word-name sheet-power-name'/>
|
||
<input type="number" name="attr_cost" value="0" class='sheet-input sheet-word sheet-cost sheet-power-cost' min="0"/>
|
||
<input type="number" name="attr_committed_effort" value="0" class='sheet-input sheet-word sheet-committed-effort sheet-power-effort' min="0"/>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
</div>
|
||
|
||
<div class='sheet-gifts'>
|
||
<label for="table-gifts" class="sheet-title-label">Gifts</label>
|
||
<div name="table-gifts" class="sheet-table-gifts">
|
||
<div class='sheet-table-row sheet-table-header-row'>
|
||
<span class="sheet-table-header sheet-table-cell sheet-power-name">Gift</span>
|
||
<span class="sheet-table-header sheet-table-cell sheet-power-cost">Cost</span>
|
||
<span class="sheet-table-header sheet-table-cell sheet-power-effort">Effort</span>
|
||
</div>
|
||
<fieldset class="repeating_gifts">
|
||
<div class='sheet-table-row'>
|
||
<input type="text" name="attr_name" class='sheet-input sheet-gift-name sheet-power-name' value=""/>
|
||
<input type="number" name="attr_cost" class='sheet-input sheet-gift sheet-power-cost sheet-cost' value="0" min="0"/>
|
||
<input type="number" name="attr_committed_effort" class='sheet-input sheet-gift sheet-power-effort sheet-committed-effort'value="0" min="0"/>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
</div>
|
||
|
||
<div class='sheet-miracles'>
|
||
<label for="table-miracles" class="sheet-title-label">Miracles</label>
|
||
<div name="table-miracles" class="sheet-table-miracles">
|
||
<div class='sheet-table-row sheet-table-header-row'>
|
||
<span class="sheet-table-header sheet-table-cell sheet-power-name">Miracle</span>
|
||
<span class="sheet-table-header sheet-table-cell sheet-power-effort">Effort</span>
|
||
</div>
|
||
<fieldset class="repeating_miracles">
|
||
<div class='sheet-table-row'>
|
||
<input type="text" name="attr_name" class='sheet-input sheet-miracle-name sheet-power-name' value=""/>
|
||
<input type="number" name="attr_committed_effort" class='sheet-input sheet-miracle sheet-committed-effort sheet-power-effort'value="0" min="0"/>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="sheet-projects-section">
|
||
<label for="repeating_projects" class="sheet-title-label">Projects</label>
|
||
<div class="sheet-projects">
|
||
<fieldset class="repeating_projects">
|
||
<div class="sheet-project">
|
||
|
||
<div class="sheet-project-name-section">
|
||
<input type="text" min="0" name="attr_project_name" class='sheet-project-element sheet-input' value="" placeholder="Project name" />
|
||
</div>
|
||
|
||
<div class="sheet-project-details-subsection">
|
||
<select name="attr_project_difficulty" class="sheet-dropdown sheet-project-element">
|
||
<option value="1">Plausible</option>
|
||
<option value="2">Improbable</option>
|
||
<option value="4">Impossible</option>
|
||
</select>
|
||
|
||
<select name="attr_project_scope" class="sheet-dropdown sheet-project-element">
|
||
<option value="1">Village</option>
|
||
<option value="2">City</option>
|
||
<option value="4">Region</option>
|
||
<option value="8">Nation</option>
|
||
<option value="16">Realm</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="sheet-project-completed-subsection">
|
||
<label for="attr_project_completed" class="sheet-field-title">Completed?</label>
|
||
<input type="checkbox" name="attr_project_completed" class="sheet-project-element" />
|
||
</div>
|
||
|
||
<table class="sheet-project-dominion-tally sheet-project-element">
|
||
<thead class="sheet-project-dominion-tally-headers">
|
||
<tr>
|
||
<th class="sheet-project-field-title" colspan="4">Dominion</th>
|
||
</tr>
|
||
<tr>
|
||
<th class="sheet-project-field-title" >Dominion</th>
|
||
<th class="sheet-project-field-title" >Influence</th>
|
||
<th class="sheet-project-field-title" >Cost</th>
|
||
<th class="sheet-project-field-title" >Remaining</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>
|
||
<input type="number" min="0" name="attr_project_dominion_spent" class='sheet-project-element sheet-input sheet-max' value="0" />
|
||
</td>
|
||
<td>
|
||
<input type="number" min="0" name="attr_project_influence_spent" class='sheet-project-element sheet-input sheet-max' value="0" />
|
||
</td>
|
||
<td>
|
||
<input type="number" min="0" name="attr_project_cost" class='sheet-project-element sheet-input sheet-max' value="(@{project_difficulty}) * (@{project_scope})" disabled="true"/>
|
||
</td>
|
||
<td>
|
||
<input type="number" min="0" name="attr_project_remaining" class='sheet-project-element sheet-input sheet-max' value="(@{project_cost}) - ((@{project_dominion_spent}) + (@{project_influence_spent}))" disabled="true"/>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</fieldset>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div style="display: none">
|
||
<input type="number" name="attr_total_word_committed_effort" readonly/>
|
||
<input type="number" name="attr_total_gift_committed_effort" readonly/>
|
||
<input type="number" name="attr_total_miracle_committed_effort" readonly/>
|
||
<input type="number" name="attr_word_points_spent" readonly/>
|
||
<input type="number" name="attr_gift_points_spent" readonly/>
|
||
|
||
<input type="number" name="attr_adj_level" value="(@{level}) - 1" disabled="true"/>
|
||
<input type="number" name="attr_points_spent" value="((@{word_points_spent}) + (@{gift_points_spent}))" disabled="true"/>
|
||
|
||
<input type="number" name="attr_total_npc_tactics" readonly/>
|
||
<input type="number" name="attr_total_npc_committed_effort" readonly/>
|
||
</div>
|
||
|
||
<div class='sheet-version-container'>
|
||
<span class='sheet-version'>v1.1.0</span>
|
||
</div>
|
||
</div>
|